從 Ubuntu 16.04 到 FreeBSD:長達十年的遷移之旅
運行一個伺服器長達十年而沒有進行重大 OS 升級,這是一項穩定性的壯舉,但同時也是一場安全噩夢。十年間,作者的部落格一直運行在 Digital Ocean 的 VPS 上,使用的是 Ubuntu 16.04 LTS——一個已經停止支援超過五年的版本。當遷移時機終於到來時,目標不僅僅是更新作業系統,更是要嘗試一種不同的系統管理哲學:FreeBSD。
這次遷移涉及從一個昂貴且過時的紐約 Droplet 遷移到位於德國、效能更佳且更實惠的 Hetzner VM,同時將整個技術棧遷移到 FreeBSD。其結果是 FreeBSD Jails、ZFS 檔案系統的效能,以及在遷移到現代硬體與精簡配置時所發現的驚人效能增益的案例研究。
變更的動機
運行一個生命週期結束 (EOL) 的發行版意味著 apt 套件儲存庫不再更新,導致系統容易受到安全漏洞的攻擊。雖然作者的部落格在這些年來基本上沒有受到機器人的干擾,但對於過時的伺服器來說,被入侵的風險(例如注入垃圾訊息連結)是一個持續的威脅。
除了安全性之外,遷移也是由成本與效能驅動的。原本的 Digital Ocean 伺服器每月花費 13 美元,提供 2GB RAM 與 1 vCPU。相比之下,一個更強大的 Hetzner 配置(4 vCPUs 與更多 RAM)每月的費用甚至比「一杯更高級的咖啡」還便宜 (⁄6)。
架構:FreeBSD Jails 與 Bastille
選擇 FreeBSD 的主要原因之一是其 Jails 的實作。雖然常被拿來與 Docker 容器進行比較,但 Jails 在本質上是不同的。Docker 是為了暫時性、不可變的應用程式打包而設計的,而 Jails 則扮演著輕量級子系統的角色——幾乎就像是共享相同核心的微型 VM。
為了管理這些 Jails,作者使用了 Bastille,這是一個簡化了 Jails 的建立、列出與主控台存取的管理框架。目標是將每個網站隔離在自己的沙盒中:
- Caddy Jail: 作為主要進入點,處理 SSL 憑證並將流量反向代理到其他 Jails。
- Site Jails: 每個網站(例如由 Hugo 生成的部落格)的獨立 Jails,其中僅包含建置與提供該特定網站所需的工具。
這種架構確保了如果其中一個網站遭到入侵,攻擊者會被困在受限的 Jail 中,而不會影響主機系統和其他網站的安全。
實作技術棧
網路與防火牆
為了讓 Caddy jail 與 site jails 通訊,建立了一個虛擬網路介面 (bastille0)。流量透過 PF (Packet Filter) 管理,這是 FreeBSD 強大的防火牆。配置內容包括:
- 跳過虛擬介面上的內部流量。
- 使用 NAT 允許 Jails 進行對外網際網路存取。
- 將連接埠 80 與 443 特別重新定向到 Caddy 伺服器 jail (IP
10.0.0.5)。
Web 伺服器:Caddy vs. Nginx
雖然舊的配置依賴於 Nginx,但新的技術棧使用了 Caddy。這次變更的主要驅動力是 Caddy 的自動化 SSL 管理。與需要使用 Certbot 等外部工具並手動檢查更新的 Nginx 不同,Caddy 會自動處理整個 TLS 生命週期。
部署工作流程
對於由 Hugo 生成的靜態網站,作者實作了唯讀掛載系統。網站原始碼存放在主機系統的 /usr/local/www 中,並使用 nullfs 將特定目錄掛載到 Jails 中作為唯讀模式。一個簡單的 deploy.sh 腳本處理建置過程,並在提供內容之前清理元數據(例如 .git 資料夾)。
效能基準測試
為了驗證新配置,作者使用 wrk 與 hey 從全球各個地點(倫敦、聖保羅、矽谷與東京)進行了廣泛的負載測試。
測試結果
效能差異非常顯著。在高併發測試(10k 並發請求)中,舊的 Ubuntu 伺服器表現掙扎,僅完成了約 7% 的請求。FreeBSD 伺服器在快速調整了 socket 隊列 (sysctl kern.ipc.somaxconn=16384) 後,處理了 94% 的請求。
- 每秒請求數 (RPS): 根據地區不同,新伺服器比舊伺服器快了 3 倍到 11 倍。
- 延遲 (Latency): p90 延遲顯示,即使在高負載下,全球 90% 的使用者都會經歷低於 3.5 秒的載入時間。
增益分析
作者承認這些增益並不完全歸功於 FreeBSD。硬體升級(從 1 vCPU 升級至 4 vCPUs)以及移除多年來在舊 Ubuntu 安裝中累積的「臃腫」也發揮了巨大作用。然而,這段經驗強調了核心調優與現代硬體對於高併發環境的重要性。
社群觀點與反論點
這次遷移也引發了技術社群關於伺服器哲學的更廣泛討論:
「設定完就置之不理」的陷阱: 一些使用者分享了類似的故事,即伺服器運行了 1,000+ 天而沒有重啟,警告極端的高可用性(uptime)可能是一種負擔。正如一位使用者所說:
"The biggest mistake I made was high uptime... by the time they wanted to sunset the machine underlying I had no idea what my teenage self had set up."
Docker 爭議: 有些人認為,在有 GitHub Pages 或 S3+CloudFront 等服務存在時,在 VPS 上託管靜態網站是多此一舉。其他人則為 VPS 方案的價值,認為其提供了學習體驗與完全的控制權。
BSD vs. Linux: 雖然有人讚揚 FreeBSD 的「龐克搖滾」式的簡潔,但也有人指出,具有合理配置的 Linux 發行版可以輕易地達到或超越 BSD 的效能。共識仍然是,選擇往往取決於對系統設計的偏好以及對特定管理體驗的需求。
最終總結
遷移一個擁有十年歷史的系統是一項艱鉅的任務,但它也是一個強大的學習機會。透過遷移到 FreeBSD,作者的部落格獲得了更深層的網路、防火牆與容器化技術的理解。雖然 Ubuntu 16.04 的穩定性令人印象深刻——在沒有重啟的情況下生存了多年——但遷移到現代、受管理且隔離的架構,提供了舊的 LTS 版本無法比擬的安全性與效能。