Linux 伺服器管理工具:依伺服器數量選擇
比較 SSH config、tmux、Ansible、Uptime Kuma、Zabbix 與 Webmin,依 2 到 5 台、5 到 20 台及超過 20 台伺服器排序,列出替代工作、設定分鐘數與各自陷阱。
建置內容
這不是單一工具,而是一組精簡的工具堆疊,應依實際擁有的伺服器數量選擇。伺服器數量是唯一重要的輸入,但每篇「Linux server management tools」整理文章都忽略了這一點。最常見的錯誤,是為 4 台 VPS 採用適用於 200 台伺服器的方案,結果花費 1 個月餵資料給工具,而不是管理伺服器。第二個常見錯誤,是擁有 18 台伺服器的人仍逐台以 SSH 手動登入,並以 18 種略有差異的方式套用「相同」變更。
因此,本指南依伺服器規模編排:2 到 5 台伺服器、5 到 20 台,以及超過 20 台;此外,也涵蓋適用於所有規模的共通層。這一層通常沒有人明確記錄,包括資產清單、金鑰管理、單一連線入口,以及確實曾完成還原測試的備份。每項工具都會說明 3 件事:它取代什麼、設定需要幾分鐘,以及真正容易造成問題的 1 個陷阱。我管理 VPS 主機已有 15 年;以下清單是經過凌晨 2 點服務中斷考驗後仍實用的內容,而不是只適合展示的功能。
先決條件與必須注意的事項
您必須已能使用基於金鑰的 SSH 連線到每台伺服器(如果您仍在輸入密碼,請先處理這個問題;只需 10 分鐘,而以下所有內容都假設您已設定好金鑰)、具備非 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 分鐘,設定一次即可。注意事項: 可能出現過期的多工 socket,詳見下文。
在這個規模下,你不需要額外軟體。只要將現有的 client 正確設定即可。~/.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 可透過 bastion 在單一跳點中轉送連線,因此你在咖啡廳執行 ssh db1 時,會透明地經由 bastion 建立 tunnel。不需要 agent forwarding,也不需要 ProxyCommand 指令,而且私有伺服器完全不必開放公開 SSH 埠(跨主題章節會再說明)。ControlMaster auto 搭配 ControlPersist 可在單一 TCP 工作階段上多工處理連線,因此對同一主機進行第二次及後續的 ssh、scp 或 rsync 時,能立即連線,不必重新協商。當 Ansible 加入後,差異會更加明顯。由於 scp、rsync 與 Ansible 都會讀取同一個檔案,你在這裡定義的每個名稱都能在各處使用。
注意事項:主連線的存續時間可能超過其實際用途,而且兩種故障模式的表現不同。伺服器重新開機或 Wi-Fi 中斷時,主程序可能仍持有已失效的 TCP 工作階段,尚未察覺該工作階段已失效。接著執行 ssh web1 時,會無聲地卡在無法通往任何地方的 socket 上。另一方面,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 中斷時遺失工作,也能解決「我不能關上筆電,因為 migration 正在執行」的情況。設定成本為 sudo apt install -y tmux,約 2 分鐘,另外還需要熟悉 tmux new -s work 與 tmux attach -t work 的操作方式。注意事項是巢狀使用:tmux 在 tmux 內執行時,內層會攔截你的 prefix key,因此請在伺服器或筆電其中一端執行 tmux,不要兩端同時執行。若你執行長時間存續的 agent 工作階段,這點更加重要。這與 在 VPS 上以 tmux 執行 Claude Code 是相同模式,工作階段必須比 SSH 連線存續更久。
共用 alias 檔案 可避免你在每個主機上重新輸入最常用的 12 個單行指令。將 .bash_aliases 放在 git repo 中,再同步到每台伺服器。注意事項是:只要你直接在某台伺服器上編輯檔案,而不是在 repo 中編輯,它就會立即逐漸偏離。這也會讓你初次體會下一個層級存在的原因。
5 到 20 台伺服器:以程式碼管理設定,否則設定漂移會勝出
超過 5 台伺服器後,「我逐台設定就好」不再是方法,而是自我欺騙。這個層級的工具都在處理同一個問題:設定漂移。
Ansible 取代逐一對主機名稱執行 shell 的迴圈、名為「新伺服器設定」且已過時 3 個步驟的 wiki 頁面,以及不知道 web3 是否真的套用修正的焦慮。設定成本為 30 分鐘,足以建立第一個可運作的 playbook;sudo apt install -y ansible 位於你的 laptop 或管理主機上(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 binary,你在上一節撰寫的 ~/.ssh/config 已經會套用。像 web1 這樣只包含主機名稱的 inventory,不需要任何 vars 也能運作。上述 vars 讓 inventory 自我完備,日後從不是你的 laptop 的機器執行時尤其有用。
使用 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 的穩定性取決於底層連線。另一個需要注意的問題是:你的機器需要 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 task 一次處理全部伺服器。需要注意的是:預設情況下它不會重新開機,因此核心安全性更新會停留在套用一半的狀態,直到你手動重新開機;unattended-upgrades 專門指南涵蓋自動重新開機、選擇要套用的修補,以及讀取其日誌。
集中式監控 取代從客戶口中得知服務故障;後者是成本最高的監控系統。以下兩個工具各自用一句話說明適用時機:Uptime Kuma回答「服務是否正常?」可執行 HTTP、TCP 與 ping 檢查,將警示傳送到各種目的地,使用 Docker 只需 10 分鐘;Zabbix回答「服務是否即將故障?」透過每台主機上的 agent 追蹤磁碟、記憶體與 CPU 趨勢,實際上需要一個下午。先使用 Kuma;當「服務仍在線上但效能下降」開始造成成本時,再加入 Zabbix。兩者都需要注意部署位置,這一點十分重要,因此會在下方的錯誤與陷阱章節開頭說明。
只有必要時才使用 Web 管理面板。 Webmin 取代記憶 Ubuntu 將設定檔放在哪裡;對技能程度不同的團隊,或一年只操作兩次的伺服器而言,它確實很有用,設定需要 10 分鐘。需要注意的是,它是具備等同 root 權限的 Web 應用程式,會監聽 port 10000,而網際網路會持續掃描這個 port。若要使用,請將它繫結至 localhost 或 VPN 位址,絕不要繫結至公開介面上的 0.0.0.0。如果你想使用管理面板只是因為 SSH 感覺很慢,請先重新閱讀上一節;設定完成後,~/.ssh/config 加上 Ansible 的速度會快於任何管理面板。
20+ 台伺服器:本指南在此如實告終
超過 20 台伺服器後,您管理的是伺服器群組,工具鏈也會改變形態:使用 Terraform 或 OpenTofu,讓伺服器本身具備可重現性;使用 cloud-init 或 golden images,讓主機可直接汰換,而不是需要修復;採用 pull-based configuration,或讓 CI pipelines 執行 Ansible,因為從筆記型電腦推送設定無法擴展;並導入真正的 secrets management。Ansible 本身不會在 20 台伺服器時失效,許多團隊都使用它管理數百個節點,但周邊實務必須更加嚴謹,而那是另一篇文章的範圍,不是本網站撰寫的主題。如果您已達到這個規模,以下區段仍然適用,因為 inventory、cryptographic keys 與存取管理規範,正是 fleet tooling 預設您已經具備的基礎。
沒人記錄的那一層
無論管理多少台伺服器,以下四項實務都適用。跳過它們,伺服器數量就會讓管理負擔顯得超出實際情況。
建立清單,純文字檔也可以。 一旦有 3 台伺服器,就應記錄名稱、IP、供應商、執行的服務,以及建立該伺服器的原因。將 servers.md 放在 git repository 中即可;上方的 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 埠都會使攻擊面隨 N 增加。可擴充的做法是使用一台 bastion host;更理想的是在你控制的 VPS 上建立 WireGuard VPN,並讓其他伺服器的 SSH 僅繫結至私有位址。上方設定中的 ProxyJump 行已經假設採用這種架構。任何必須保持公開的服務,都應一律配置 fail2ban。設定成本:一次 1 小時。注意事項:關閉所有伺服器的 22 埠之前,先確認供應商的主控台存取可作為備援;不要關閉後才確認。
透過還原測試備份。 未經測試的備份只是假設。無論使用哪種機制,例如供應商 snapshot、restic,或將 rsync 傳送至另一台主機,真正重要的是行事曆中的還原作業:將一台伺服器還原到全新的 VPS,並確認它能啟動及提供服務。我在 15 年代管經驗中聽過的每個備份災難故事,都包含一句話:「我們有備份。」
錯誤做法
多伺服器規模下的故障模式通常不是工具造成的,而是操作習慣造成的。其中有 4 種涵蓋了幾乎所有問題。
Snowflake 伺服器。 每台伺服器都由人工設定,彼此存在細微差異,而且沒有人能重新建置。磁碟故障時,問題就會浮現。解法很單調:所有變更都透過 Ansible 進行;至少也要附加到該伺服器在 inventory 文件中的區段。任何一台今天下午仍無法根據紀錄重新建置的伺服器,都是有期限的技術負債,而且期限並不由你決定。
「暫時」的防火牆開放規則。 你使用 ufw allow 5432 來進行除錯,18 個月後 Postgres 仍然暴露在網際網路上。請在每台伺服器上使用 sudo ufw status numbered 進行稽核;或一次執行 ansible all -i inventory.ini -a "ufw status numbered" --become,並刪除任何無法說明目前用途的規則。如果規則確實是暫時的,請在關閉 tmux 視窗前,先在同一個 tmux 視窗中加入對應的 ufw delete。
將監控服務託管在受監控的伺服器上。 如果 Uptime Kuma 執行於它所監看的一台伺服器上,顯示「所有服務都已停止」的警報也會停止,你就建立了一個較小且更荒謬的全球效率最低的資料中心。監控服務應位於不同的故障網域。經典做法是在不同供應商的低價 VPS 上執行監控;至少也應使用外部免費方案的檢查服務來監看監控服務。
到處使用 root SSH。 整個伺服器群組共用同一把 root 金鑰,代表一台筆記型電腦外洩就能控制所有伺服器,而且沒有稽核軌跡能顯示誰執行了哪些操作。每位人員使用個別帳號、sudo,並在每台主機的 /etc/ssh/sshd_config 中設定 PermitRootLogin no。這又是一個只需 3 行的 Ansible 工作,不必花一個晚上手動輸入。
當伺服器群組成長到超過幾台後,你的第一個 Ansible playbook可以自動化重複性工作。
FAQ
管理多台 Linux 伺服器時,最佳的免費工具是什麼?
如果只有 2 到 5 台伺服器,一份編寫良好的 ~/.ssh/config 搭配 tmux,就勝過任何可安裝的工具。伺服器數量大約達到 5 台以上時,標準答案是 Ansible:不需要安裝 agent、免費、可透過現有的 SSH 執行,並能將伺服器設定轉為 git 中的檔案。另可加入 Uptime Kuma,提供運作或離線警示;本指南提到的所有工具都是自由軟體。
不使用 Ansible,也能管理多台 Linux 伺服器嗎?
可以。伺服器少於約 5 台時,良好的 SSH 設定、共用 alias 檔案與管理紀律通常已經足夠,許多人也以這種方式運作多年。超過這個數量後,Ansible 的替代方案不是「什麼都不用」,而是缺乏文件記錄的設定漂移:18 台伺服器各自以手動方式設定,且彼此略有不同。如果 Ansible 顯得過於複雜,可以先從一份只管理 authorized_keys 與 unattended-upgrades 的 playbook 開始;光是這樣就足以抵銷學習成本。
如何同時在多台 Linux 伺服器上執行相同的命令?
ansible all -i inventory.ini -a "uptime" 是簡潔的做法,不需要 playbook,只需要 inventory 檔案。若要進行互動式的並排操作,tmux 可透過 setw synchronize-panes on 將按鍵廣播至每個窗格,但應將此功能視為展示技巧,因為向正式環境伺服器廣播互動式命令,可能讓一個錯字變成 N 倍的服務中斷。
管理 Linux 伺服器時,需要使用 Webmin 之類的控制面板嗎?
不需要。控制面板能做的事,SSH 與 Ansible 都能以更可重現的方式完成。當不同技術程度的人員需要管理同一批伺服器,或很少接觸某台伺服器、重新找出設定路徑會耗費實際時間時,Webmin 才有其價值。如果使用 Webmin,應將它視為具有 root 等同權限的 Web 應用程式:將其繫結至 localhost 或 VPN 位址,不要繫結至公開網路介面。
一個人實際上能管理多少台 Linux 伺服器?
採用手動管理時,品質通常會在少於 10 台時開始下降。採用設定即程式碼、自動修補與集中式監控時,一名謹慎的人員可以以兼職方式管理 20 到 50 台伺服器;限制因素會變成新類型故障的發生頻率,而不是例行維護。重要的數字不是每位管理員負責多少台伺服器,而是每位管理員負責多少台特殊配置的伺服器:只要將這個數字維持在接近 0,管理上限就很高。