SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

Linux服务器管理工具怎么选?按数量分级

按2到5台、5到20台及超过20台服务器选择工具,比较SSH配置、tmux、Ansible、Uptime Kuma、Zabbix和Webmin的替代对象、设置分钟数与关键陷阱。

构建内容

这不是一个工具,而是一套简短的工具栈,具体选择取决于您实际拥有的服务器数量。这个数量是唯一重要的输入,也是所有“Linux 服务器管理工具”汇总文章都会忽略的因素。最常见的错误,是为 4 台 VPS 采用面向 200 台服务器的方案,然后花费 1 个月向工具中录入数据,而不是管理服务器。第二个常见错误,是拥有 18 台服务器,却仍然手动 SSH 登录每一台,以 18 种略有不同的方式应用“同一项”更改。

因此,本指南按服务器规模组织:2 到 5 台、5 到 20 台,以及超过 20 台;此外还介绍适用于所有规模的通用层。这一层包括没人会明确写下来的内容:资产清单、密钥管理、统一入口,以及已经实际恢复验证过的备份。对于每个工具,您将了解 3 件事:它替代什么、初始设置需要多少分钟,以及唯一真正容易导致问题的陷阱。我运营 VPS 主机已有 15 年;下面列出的内容经得起凌晨 2 点的故障,而不是只适合演示。

前置条件和需要注意的问题

您需要确保已经可以通过基于密钥的 SSH 连接到每台服务器(如果您仍在输入密码,请先解决这个问题。这只需十分钟,下面的所有内容都假定您使用密钥),还需要一个非 root 的 sudo 用户,以及运行当前版本软件的服务器。这里的命令以 Ubuntu 24.04 为例,但除了 apt 外,没有任何内容专用于 Ubuntu。

在介绍工具前,先说明两个实际问题。第一,工具数量过多本身就是管理问题:您安装的每个 agent 都意味着需要在每台服务器上额外维护一个 daemon。因此,添加工具的标准应是“它能替代我本周完成的手动工作”,而不是“它看起来有用”。第二,这里的所有工具都是免费软件,真正的成本是设置时间。因此,每个工具都附带以分钟为单位的估算;如果估算写的是一个下午,请按一个下午计算。

2 到 5 台服务器:~/.ssh/config 是你现有工具中最容易被低估的一个

它取代了什么: IP 地址文本文件、翻查 shell 历史记录(ssh 203.0,然后按 Ctrl-R 并祈祷),以及永远重复输入 -p 2222 -i ~/.ssh/other_key。设置成本: 一次性 15 分钟。注意事项: 过期的多路复用套接字,详见下文。

在这个规模下,你不需要额外的软件;只需按实际需求配置好现有的客户端。~/.ssh/config 将每台服务器都变成一个单词的名称,并保存路由配置,让你以后无需再考虑连接路径:

Host *
    ServerAliveInterval 30
    ControlMaster auto
    ControlPath ~/.ssh/cm-%r@%h-%p
    ControlPersist 10m

Host bastion
    HostName 10.0.0.10
    User matt

Host web1
    HostName 10.8.0.11
    User matt
    ProxyJump bastion

Host db1
    HostName 10.8.0.12
    User matt
    Port 2222
    ProxyJump bastion

三个设置即可完成这项工作。ProxyJump 让连接通过堡垒主机一跳转发,因此从咖啡馆执行 ssh db1 时会透明地通过 bastion 建立隧道,不需要代理转发,也不需要 ProxyCommand 命令;私有服务器甚至完全不需要开放公网 SSH 端口(跨主题部分会进一步介绍)。ControlMaster auto 配合 ControlPersist,可通过一个 TCP 会话复用连接,因此对同一主机执行第二次及后续的 ssh、scp 或 rsync 时会立即连接,无需重新协商。Ansible 开始运行后,这种差异会非常明显。由于 scp、rsync 和 Ansible 都会读取同一个文件,因此你在这里定义的每个名称都可在所有环境中使用。

注意事项是:主连接的生命周期可能超过其实际用途,而且两种故障模式表现不同。当服务器重启或 Wi-Fi 断开时,主进程可能仍持有一个尚未发现已失效的 TCP 会话。下一次 ssh web1 会在一个指向无效连接的套接字上静默挂起。另一种情况是,sshd 将每个连接的会话数限制为 10(MaxSessions 位于 sshd_config 中),因此对同一主机建立第 11 个多路复用会话时会输出:

mux_client_request_session: session request failed: Session open refused by peer

两种情况的修复方法相同:ssh -O exit web1 会终止主连接,下一次连接会重新创建主连接。你有时还可能看到 ControlSocket /home/matt/.ssh/cm-matt@10.8.0.11-22 already exists, disabling multiplexing,这无害:两个会话发生了竞争,连接仍然可用,只是未使用多路复用。

这个规模下还有两个配套工具。每台服务器上的 tmux 可取代 nohup,避免 Wi-Fi 断开导致工作丢失,也能解决“我不能合上笔记本,迁移任务还在运行”的问题。设置成本为 sudo apt install -y tmux,约 2 分钟,另外还需要记住 tmux new -s work 和 tmux attach -t work。注意事项是嵌套使用:tmux 嵌套在 tmux 中时会截获前缀键,因此应在服务器或笔记本上运行 tmux,不要同时在两端运行。如果你运行的是长期保持的代理会话,这一点尤其重要。这与在 VPS 上通过 tmux 运行 Claude Code是同一种模式:会话必须独立于 SSH 连接继续运行。

共享别名文件可避免你在每台服务器上重复输入最常用的 12 条单行命令。将一个 .bash_aliases 保存在 git 仓库中,再将其拉取到每台服务器。注意事项是:如果你直接在某台服务器上编辑它,而不是在仓库中编辑,它会立即产生偏差。这也会让你首次体会到下一个级别存在的原因。

5 到 20 台服务器:配置即代码,否则配置漂移会占上风

服务器数量超过 5 台后,“我在每台机器上手动做一遍”就不再是方法,而是自我欺骗。这一层级的工具都在解决同一个问题:配置漂移。

Ansible 取代了遍历主机名的 shell 循环、名为“新服务器设置”但已经过时 3 个步骤的 wiki 页面,以及不知道 web3 是否确实应用了修复的焦虑。设置成本:30 分钟即可完成第一个可用的 playbook;sudo apt install -y ansible 可安装在笔记本电脑或管理主机上(apt 提供较旧的 Ansible 版本,但完成本教程中的所有操作都没有问题;教程中的 pipx 安装方式可获取当前版本);服务器上无需安装 agent,所有操作都通过你已经配置好的 SSH 执行。这是本页最重要的一项升级,完整步骤请参阅 Ansible 第一个 playbook 教程;下面是可正常工作的 inventory 示例:

[web]
web1 ansible_host=10.8.0.11
web2 ansible_host=10.8.0.12

[db]
db1 ansible_host=10.8.0.21 ansible_port=2222

[all:vars]
ansible_user=matt
ansible_ssh_common_args='-o ProxyJump=bastion'

由于 Ansible 会调用 OpenSSH 二进制文件,你在上一节编写的 ~/.ssh/config 已经会生效,因此只包含 web1 这类裸名称的 inventory 无需任何 vars 也能工作。上面的 vars 让 inventory 自包含,这会在你从笔记本电脑以外的机器运行它时发挥作用。

使用 ansible all -i inventory.ini -m ping 测试;正确结果会为每台主机输出绿色的 "ping": "pong"。你最先遇到的故障通常如下:

web1 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: matt@10.8.0.11: Permission denied (publickey).",
    "unreachable": true
}

这不是 Ansible 的问题,普通的 ssh matt@10.8.0.11 也会以相同方式失败。始终先修复 SSH;Ansible 的可靠性取决于其底层环境。除此之外,还有一个容易忽略的问题:Ansible 需要在你的机器上安装 Python;对于几乎所有模块(包括 ping),服务器上也需要安装 Python,因此极简镜像可能会返回 /usr/bin/python3: not found。执行一次 apt install python3 后,这个问题就不会再出现;如果需要处理一整批未安装相关组件的镜像,raw 模块是少数不需要远程 Python 的模块之一,可以替你完成安装。

unattended-upgrades 取代你成为负责为 N 台服务器应用安全补丁的人。标准 Ubuntu Server 24.04 已预装该工具,通常也已启用安全更新,因此这里的任务是验证,而不是安装:

cat /etc/apt/apt.conf.d/20auto-upgrades

两行都应以 "1" 结尾。一些精简镜像和云镜像会将其禁用;如果你的系统属于这种情况,sudo dpkg-reconfigure -plow unattended-upgrades 会重写该文件。设置成本:每台服务器检查 2 分钟,或者为所有服务器编写一个 Ansible 任务。需要注意的是:它默认不会重启系统,因此内核安全更新会处于部分应用状态,直到你执行重启;unattended-upgrades 专题指南介绍了自动重启、选择补丁范围以及读取日志的方法。

集中式监控 取代了通过客户反馈才发现故障的做法,而后者是成本最高的监控系统。这里有两个工具,各用一句话说明适用场景:Uptime Kuma 用于回答“服务是否正常运行?”,可执行 HTTP、TCP 和 ping 检查,并向各种目标发送告警;使用 Docker 部署只需 10 分钟。Zabbix 用于回答“服务是否即将发生故障?”,通过每台主机上的 agent 采集磁盘、内存和 CPU 趋势数据,实际部署通常需要一个下午。从 Kuma 开始;当“运行但性能下降”开始造成成本时,再添加 Zabbix。两者都需要注意部署位置,这一点非常重要,下面的故障部分会专门说明。

仅在确有需要时使用 Web 面板。 Webmin 取代了记忆 Ubuntu 各项配置位置的需求;对于技能水平不一的团队,或每年只接触两次的服务器,它确实很有用,设置只需 10 分钟。需要注意的是:它是一个具有 root 等效权限的 Web 应用,监听 10000 端口,而互联网会持续扫描该端口。如果运行它,应将其绑定到 localhost 或 VPN 地址,绝不要绑定到公共接口上的 0.0.0.0。如果你因为 SSH 感觉响应缓慢而考虑使用面板,请先重新阅读上一节;完成配置后,~/.ssh/config 加 Ansible 的速度会超过任何面板。

20+ 台服务器:本指南的适用范围到此为止

超过 20 台服务器后,您管理的是一组服务器,工具链也会发生变化:使用 Terraform 或 OpenTofu,让服务器本身具备可复现性;使用 cloud-init 或黄金镜像,让服务器实例可以直接替换,而不是只能修复;使用拉取式配置管理,或通过 CI pipeline 运行 Ansible,因为从笔记本电脑推送配置无法扩展;还需要真正的密钥管理。Ansible 本身不会在 20 台服务器时失效,许多团队都会使用它管理数百个节点。但围绕 Ansible 的实践必须更加严格,而这已经超出本网站文章的范围。如果您已经达到这个规模,下面的部分仍然适用于您,因为 fleet 工具默认您已经具备清晰的 inventory、密钥和访问控制规范。

没有写入文档的那一层

四项实践适用于任何规模的服务器集群。跳过这些实践,服务器数量就会显得比实际更难管理。

维护一份清单文件,哪怕只是文本文件。 服务器达到 3 台时,就应记录:名称、IP、提供商、运行的服务,以及创建它的原因。将 servers.md 放在 git 仓库中即可;上面的 Ansible inventory 更好,因为它同时是可执行文档。它取代的是凌晨 2 点的疑问:“等等,10.0.0.40 是什么?”设置成本:10 分钟。注意事项:只有在创建服务器和添加清单记录同时完成时,这种方法才有效,不能分成两个步骤。

做好密钥管理:立即轮换,出现痛点后再部署 SSH CA。 列出密钥的存放位置(您这边的 cat ~/.ssh/*.pub,以及每台服务器上的 ~/.ssh/authorized_keys),删除旧笔记本和前同事留下的密钥,并轮换所有老旧到无法说明其使用范围的密钥。SSH 证书颁发机构使用短期签名证书代替静态密钥,是更成熟的方案。但坦率地说,服务器少于 10 台时,通过 Ansible 严格管理 authorized_keys,只需 10% 的流程成本,就能获得 90% 的收益。

只保留一种进入方式,不要保留 20 种。 每个公开的 SSH 端口都会将攻击面增加一份,服务器越多,风险越大。可扩展的模式是:使用一台堡垒主机,或者更好,使用您控制的 VPS 上的 WireGuard VPN,并让其他所有服务器的 SSH 仅绑定到各自的私有地址。上方配置中的 ProxyJump 行已经采用了这一模式。任何必须保持公开的服务,都应默认配置 fail2ban。设置成本:一次 1 小时。注意事项:在关闭所有服务器的 22 端口之前,先确认提供商的控制台访问可作为备用入口;不要关闭后才验证。

通过恢复来测试备份。 未经测试的备份只是一个假设。无论使用哪种机制,包括提供商快照、restic,或将 rsync 复制到第二台服务器,真正重要的是在日历中安排一次恢复操作:将一台服务器恢复到全新的 VPS,确认它能够启动并提供服务。我在 15 年托管工作中听过的所有备份事故,都包含这样一句话:“我们有备份。”

常见错误

在多服务器规模下,故障通常不是工具导致的,而是习惯导致的。其中四类问题几乎涵盖了所有情况。

雪花服务器。 每台服务器都经过手工配置,彼此存在细微差异,而且没人能重建它。磁盘故障发生时,这个问题才会暴露。解决方法很简单但不令人兴奋:所有变更都通过 Ansible 完成;至少也要追加到 inventory 文档中该服务器对应的部分。任何一台服务器如果今天下午无法根据记录重建,都是有截止日期的技术债务,而这个日期不是由您决定的。

“临时”的防火墙规则。 使用 ufw allow 5432 调试问题后,18 个月过去,Postgres 仍然暴露在互联网中。请在每台服务器上使用 sudo ufw status numbered 进行审计,或者一次性使用 ansible all -i inventory.ini -a "ufw status numbered" --become,并删除所有无法说明当前用途的规则。如果规则确实是临时的,请在关闭 tmux 窗口前,将对应的 ufw delete 放入同一个窗口中。

将监控部署在被监控的服务器上。 如果 Uptime Kuma 运行在它所监控的服务器上,那么“所有服务都已停止”的告警也会停止。这样就构建了一个更小、更可笑的全球效率最低的数据中心。监控应位于不同的故障域中:在不同服务商处购买一台廉价 VPS 是经典方案;至少也应使用外部免费层级的检查服务来监控监控系统。

所有服务器都使用 root SSH。 整个服务器集群共用一个 root 密钥,意味着一台笔记本泄露就会导致所有服务器失陷,而且没有审计记录可以说明谁执行了什么操作。应为每个人创建独立用户,使用 sudo,并在每台主机的 /etc/ssh/sshd_config 中配置 PermitRootLogin no。这又是一个三行的 Ansible 任务,不需要花一晚手工输入。

当服务器集群超过几台后,您的第一个 Ansible playbook可以自动处理重复性工作。

FAQ

管理多台 Linux 服务器的最佳免费工具是什么?

对于 2 到 5 台服务器,一份编写良好的 ~/.ssh/config 加上 tmux,就足以胜过任何可安装的工具。服务器数量达到约 5 台后,标准答案是 Ansible:无需在服务器上安装代理、免费、可通过现有 SSH 运行,还能将服务器配置保存为 git 中的文件。再搭配 Uptime Kuma 进行在线和离线告警。本指南提到的所有工具都是自由软件。

不使用 Ansible 也能管理多台 Linux 服务器吗?

可以。服务器数量少于约 5 台时,良好的 SSH 配置、共享别名文件和规范操作通常就够用了,很多人多年来一直这样管理。超过这个规模后,Ansible 的替代方案不是“什么都不用”,而是缺少文档的配置漂移:18 台服务器分别通过手工方式配置,且彼此略有不同。如果 Ansible 看起来过于复杂,可以先编写一个只管理 authorized_keys 和 unattended-upgrades 的 playbook;仅这一项就足以弥补学习成本。

如何同时在多台 Linux 服务器上运行同一条命令?

ansible all -i inventory.ini -a "uptime" 是简洁的解决方案,不需要 playbook,只需要 inventory 文件。对于交互式并排操作,tmux 可以使用 setw synchronize-panes on 向每个窗格广播按键输入。但这只能算是一种技巧,因为向生产服务器广播交互式命令,可能让一个拼写错误造成 N 倍范围的服务中断。

是否需要使用 Webmin 之类的控制面板管理 Linux 服务器?

不需要。控制面板能做的事情,SSH 和 Ansible 都能以更可重复的方式完成。当不同技能水平的人员共同管理同一批服务器,或者很少接触某台服务器、重新查找配置路径会耗费大量时间时,Webmin 才有存在价值。如果使用它,应将其视为具有 root 等效权限的 Web 应用:将其绑定到 localhost 或 VPN 地址,绝不要绑定到公网接口。

一个人实际可以管理多少台 Linux 服务器?

采用手工管理时,管理质量通常会在少于 10 台时开始下降。采用配置即代码、自动打补丁和集中式监控后,一个谨慎的管理员可以将 20 到 50 台服务器作为兼职工作来维护。真正的限制因素是新问题发生的频率,而不是日常维护工作量。重要的不是每名管理员负责多少台服务器,而是每名管理员负责多少台配置独特、无法标准化的服务器:将这个数量保持在接近 0,管理上限就会很高。