跳到主内容

Linux 服务器运维笔记

之前每搭一次服务器就想写一篇搭建笔记,但这样效率不高,参考价值也不大。这篇文章尝试把常见的一些套路汇总起来,希望能够对不同 Linux 发行版下不同软件的运维都提供一定的帮助。

虽然可能也是鸽了的命运,剩下懒得搬过来的先看之前的简单服务器搭建流程吧。

1. 参考例子

1.1. Friendica 服务器搭建

Friendica 是由 PHP 写成的支持 ActivityPub、OStatus、diaspora* 等去中心化社交媒体协议的社交媒体服务。 要从零搭建一个 Friendica 服务器,你可能需要:

  1. 3.5
  2. VPS 进行一定的安全配置
  3. 安装 PHP
  4. 安装一种网页服务器软件
  5. 安装 MySQL 数据库
  6. 在 MySQL 数据库中创建账号
  7. 购置域名
  8. 配置 HTTPS
  9. 配置网页服务器使用 PHP
  10. 配置 Friendica

2. 前置知识

2.1. Linux 发行版

所谓的“Linux 操作系统”大致由两部分组成。最核心、相对离硬件更近而离用户更远的部分是 Linux 内核,这部分我们大多数时候不需要理会。而离用户更近的一大部分则是各种各样的提供系统管理功能的软件,例如2.2或是 systemd 或是类似程序。

Linux 发行版一般可以理解为将 Linux 内核以及必须的一些软件打包整理好的一个完整的操作系统。不同的发行版可能只是一些初始软件配置有小小不同,也可能是对一些核心软件的选取有差别。当然,最常见的、对我们使用影响最大的差别应该还是2.2以及2.2.1 之间的差别。

2.2. 包管理器

Linux 下安装软件的传统方式和 Windows 下的有一定差别。最大的差别可能是 Linux 下通常软件之间会有明确的依赖关系——例如大部分视频播放器都会把视频播放的部分任务交给其它专门解码视频的软件。此时,如果两个软件 A、B 都依赖于软件 C,系统就只需要安装一份软件 C,省下了一些硬盘空间(有时也会省些内存)。(作为对比,Windows 下的软件如果 A、B 都依赖于 C,通常在安装完 A 和 B 后,系统里会存在两份相同或是不同的软件 C。)当然,这样子最大的不足就是用户如果想要安装软件的话,手动管理这样的依赖关系就会变得非常痛苦。

包管理器 就是帮助用户管理这样的依赖关系的软件,简单起见可以理解成 App Store 或是 Google Play。想要安装软件时只需要使用包管理器进行安装,它就会自动安装该软件所依赖的其它软件,免去了手动管理依赖关系的麻烦。

不同的发行版很多时候会有不同的包管理器,软件的安装方式也会有一些的差别,在搜索对应内容的时候可以留意一下。

  • Arch Linux 发行版:使用 pacman 包管理器
  • Debian 发行版:使用 apt 包管理器
    • Ubuntu 发行版基于 Debian,用的也是 apt
  • Red Hat Enterprise Linux(RHEL)发行版:使用 yum 包管理器
    • CentOS 发行版以及 Fedora 发行版其实和 RHEL 差不多,包管理器也是 yum

2.2.1. 软件源

我们可以把包管理器比作一个去超市采购的人,那么 软件源 此时就是超市里的所有货物 + 超市货物的一份清单,软件就是超市里的货物。包管理器可以从多个不同的软件源获取软件,有的软件源可能会对自己的软件(货物)定期进行安全检查,有的软件源可能会提供一些稀奇古怪的软件,甚至你也可以搭建自己的软件源。总之,包管理器的软件源 配置 决定了它可以获取到什么软件。如果包管理器找不到什么软件,上网搜索最可能出现的答案就是你需要对软件源进行一定的配置。

2.3. 命令行

一般 Linux 中的命令行指 Shell 界面。这时,我们可以把 Linux 系统想象成一台智能打字机(typewriter),你与它的交互可以分成两个阶段:

  1. 智能打字机等待你的输入,你此时可以在键盘上输入一些内容,通常通过回车进入下一阶段
  2. 智能打字机自动输出结果,此时你一般需要等待它输出完成,或是通过一些方式使其停下来,或是切换到其它程序

你可以在 Live Busybox 这里感受一下 Linux 下与系统的交互方式(网页里那个充斥着等宽字符的黑块)。在网页出现 / # 之后(意味着这是你输入的阶段),尝试输入 echo "Hello Linux" 。在回车之后你会发现我们的“智能打字机”输出了 Hello World ,并通过 / # 提醒你此时又回到了你输入的阶段。

2.4. SSH

上面说到了命令行基本就是指 Shell 界面,而 SSH 则是 Secure Shell 的缩写。基本上我们可以把它理解成一种远程连接到 Shell 命令行的方法。

2.5. 用户的文件权限

Linux 强调使用用户系统来保证系统的安装性。它将用户分为不同的角色,权限最大的被称为 root 用户,甚至连各种可能毁坏机器的命令都可以执行。其它用户都默认是普通的用户,通常我们可以将用户加入用户组来赋予用户不同的权限。

因为 Linux 下大多数系统操作都可以通过文件操作实现(简单理解的话其中一部分的话, 就是 Linux 把系统配置“存放”在了文件里)。用户权限以及用户组权限都决定了当前用户能否访问某个文件。一个文件的权限分为三部分:

  • 这个文件属于哪个用户?这个用户可以对这个文件进行什么操作?

    这部分权限让文件的拥有者获得比别人更多的权限。

  • 这个文件属于哪个用户组?这个用户组可以进行什么操作?

    这部分权限让文件的拥有组获得比别人更多的权限。

  • 其它用户可以进行什么操作?

    如果不是相关人员或是相关组员的话,其它用户就只能获得这里规定的权限了。

2.6. 如何读懂后文的命令行代码

后文的命令行代码遵从以下格式:(大多数 Linux 文章大概也是一样的。)

$ echo "这个命令只需要普通用户的权限即可执行"
# echo "而这个命令我们希望你使用 root 权限执行"

注意到了吗?我们使用 $# 来标识命令执行所需要的权限。 只需要普通用户权限的命令通常更加安全,但是要用到 root 权限的命令就需要你三思了。 (命令指的是 $ 或是 # 后面的文本,这两个字符并不是命令的一部分,只是标识而已。)

一般来说,想要使用 root 权限来执行某个命令时,你需要在前面加上 sudo ,如:

$ sudo echo "这个命令会以 root 命令执行"

在使用 sudo 时,你可能会需要输入用户密码,请留意命令行的提示。(你可能还需要安装 sudo 包。)

Shell 命令行也使用 # 标记注释:

$ echo "这是命令" # 这是不会被执行的注释

我们使用 <你需要填入内容的提示> 来标识你需要自己填写的信息。

2.7. 配置文件

配置文件的格式多种多样,但大多都是纯文本的,需要使用下面的编辑命令。通常你需要理解下面几点:

  1. 很多配置文件都存在注释的格式,但是不同的配置文件里注释的格式不一定一样。当你发现一段文字是以日常用语(虽然是英文)向你解释东西的时候,这段文字就大概是注释了。
  2. 一些注释会以例如 # 或是 ; 开头。这时,如果它们注释掉了一些配置(使它们无效),你有可能就需要把 # 或是 ; 删掉。这是配置文件里很常见的套路。例如:

    # To disable tunneled clear text passwords, change to no here!
    #PasswordAuthentication yes
    #PermitEmptyPasswords no
    

    上面的例子里的 PasswordAuthentication yesPermitEmptyPasswords no 都是配置项目,但它们都被注释掉了。如果你想要加入 PasswordAuthentication no 的配置,那你就需要把对应的注释取消掉,再把 yes 改成 no

3. 常见套路

3.1. 创建用户

# useradd -m <用户名>          # 创建用户
# usermod -a -G sudo <用户名>  # 你可能希望给该用户提供使用 sudo 的权限
# passwd <用户名>              # 更改密码

sudo 的话,可能还需要安装 sudo 包。

3.2. 编辑命令

我们在配置系统的时候需要编辑很多文件,不同人可能喜欢不同的编辑器,我这里就不介绍 Vim 或是 Emacs TRAMP 了。总之,最常见的、大部分系统都预先安装了的编辑器是 nano 。大部分需要编辑的文件都需要 root 权限。此时使用 nano 的命令是:

# nano <你想要编辑的文件名>

3.3. 软件服务管理

现在大多 Linux 发行版都采用 systemd 来管理软件服务。

# systemctl restart <服务>.service  # 重启服务
# systemctl stop    <服务>.service  # 停止服务
# systemctl start   <服务>.service  # 启动服务
# systemctl enable  <服务>.service  # 设置开机启动

3.4. SSH 安全保证

虽然 SSHSecure Shell,但是它的默认设置不一定会安全。其主要原因是它很多时候默认采用密码登陆,而密码相对于其它的认证手段来说是非常容易破解的,特别是在使用了弱密码的时候。

所以,一般我们接手新的服务器之后的第一件事就是把禁用密码认证并配置密钥认证。如果你日用的系统是 Windows 系统的话,这个可能会有一点点麻烦,还请自己查询资料。(配置方法也与你用的 SSH 客户端软件有关,请在搜索时不要忘了加上自己客户端作为关键字。) 如果用的是类 Unix 系统的话,大概率你可以使用下面的命令:

$ ssh-keygen
$ ssh-copy-id <用户名>@<ip>
$ ssh <用户名>@<ip>  # 验证一下可以登陆

编辑 /etc/ssh/sshd_config ,加入如下配置:

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

重启 sshd.service 服务。

3.5. 更新服务器软件

这里略过,请自行搜索自己所用发行版的命令。(发行版的话,应该 VPS 选购时会有选项的。)

3.6. UFW 简单防火墙

安装 ufw

# ufw default deny
# ufw limit ssh
# ufw enable

也请自行搜索一下防火墙介绍以及 UFW 的其它命令。

3.7. 开启 BBR

TCP BBR 是一种拥塞算法 1,可能性能比默认的好一点?

# echo tcp_bbr | tee -a /etc/modules-load.d/modules.conf
# echo -e "net.core.default_qdisc = cake\nnet.ipv4.tcp_congestion_control = bbr" | tee /etc/sysctl.d/99-enable_bbr.conf
# modprobe tcp_bbr
# sysctl --system
1

拥塞算法说起来复杂。基本上就是因为现代网络连接大多时候会与其它机器“共用一条网线”,为了在尽量不干扰别人的情况下最大化自己的网络带宽使用率的算法就差不多是拥塞算法了。

3.8. Caddy 安装

Caddy 是网页服务器。下面是 Debian 下的命令,如果是其它发行版的话,请去 Caddy 官网看吧。

$ sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
$ sudo apt update
$ sudo apt install caddy

3.9. PHP 安装

PHP 我个人认为一般需要考虑三部分的安装与配置:

  1. PHP 本身
  2. 使用 PHP 提供网页内容的配置(PHP FPM 与网页服务器配置)
  3. PHP 的扩展的安装

前面两项不同发行版不同,这里先略过。

后面的扩展的话,不同软件的需求是不同的,使用 php -m 查看现在已经开启的扩展,之后就一个一个把剩下的安装了吧。

3.10. MySQL 安装

MySQL 是一个数据库软件,但是现在例如 MariaDB 也可以当作 MySQL 来用,一般我们都安装免费开源的 MariaDB。后面的安全设置基本上可以按照 MariaDB#Security 这里来。

3.11. MySQL 创建用户与数据库

大多数使用 MySQL 的软件都需要一个自己的数据库来进行数据储存,而这个数据库的创建有时需要我们自己进行。

MariaDB [(none)]> 是命令行提示,不是我们的输入内容。)使用 sudo mysql 进入 MySQL 命令行:

MariaDB [(none)]> CREATE DATABASE <数据库名称>;
MariaDB [(none)]> CREATE USER '<新用户名称>'@'localhost' IDENTIFIED BY '<自己选一个密码>';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON <数据库名称>.* TO '<新用户名称>'@'localhost';
MariaDB [(none)]> quit

你需要记住自己选的用户名、数据库名以及密码(你安装的软件应该会提示让你输入这些信息)。

3.12. Friendica 本体软件安装

一般网页服务需要 http 或是 www-data 的用户权限,我们这里也尽量使用对应的用户权限。

$ sudo apt install git unzip
# chown -R www-data:www-data /var/www
$ sudo -u www-data git clone https://github.com/friendica/friendica.git -b develop /var/www/friendica
$ cd /var/www/friendica
$ sudo -u www-data bin/composer.phar install --no-dev
$ sudo -u www-data git clone https://github.com/friendica/friendica-addons.git -b develop addon

4. 插曲

4.1. CloudCone 安装 Arch Linux

CloudCone 自带的 Arch Linux 非常老旧,但聊胜于无:

  • Arch Linux 2021 Server - x64

在更新系统之前有几个地方需要手动操作一下:

  1. [community] 软件仓库已与 [extra] 合并,需要从 pacman.conf 中删除。见 https://archlinux.org/news/cleaning-up-old-repositories/
  2. rankmirrors 寻找速度最快的镜像源:

    wget 'https://archlinux.org/mirrorlist/?country=US&protocol=https&use_mirror_status=on' \
         -O /etc/pacman.d/mirrorlist.backup
    rankmirrors -v -n 6 /etc/pacman.d/mirrorlist.backup > /etc/pacman.d/mirrorlist
    pacman -Syu
    
  3. pacman -S archlinux-keyring 更新签名。

好的,现在用 pacman -Syu 更新软件。在等待更新的同时可以上 https://archlinux.org/news/ 看一下有没有其它需要进行的操作。

4.2. Doas

这里试用一下 =doas=:

pacman -S opendoas
vim /etc/doas.conf # wheel
chown -c root:root /etc/doas.conf
chmod -c 0400 /etc/doas.conf

先用 systemctl reboot 重启一下,之后再调 SSHD 设置。

  1. https://wiki.archlinux.org/title/Users_and_groups#User_management 创建用户, 更改密码。
  2. 自己电脑 ssh-copy-id 复制密钥(用法自己查)。
  3. 更改 /etc/ssh/sshd_config ,禁止 root 用户登陆,禁用密码登陆。
  4. systemctl restart sshd

评论

This one-pixel image serves as a page view tracker and nothing more. This feedback keeps me motivated, because very few people ever comment.