在 Nginx 反向代理 Tomcat 叢集的架構中,當後端 Tomcat 服務掛掉時,Nginx 內建的 ngx_http_upstream_module 透過 proxy_next_upstream 機制能自動踢除故障節點。但若整台實體機器宕機(如網路中斷、作業系統死機),預設的輪詢機制無法偵測到,導致請求持續轉發至失效節點,造成大量超時錯誤。為解決此問題,引入 nginx_upstream_check_module 模組可實現主動健康檢查,精準剔除異常節點。
| 方案 | 特點 | 官方連結 |
|---|---|---|
ngx_http_proxy_module + ngx_http_upstream_module |
Nginx 內建,被動式檢查(請求失敗才切換) | 官方文檔 |
| nginx_upstream_check_module | 第三方模組,主動式健康檢查,支援 TCP/HTTP/MySQL/AJP 等多種協議 | GitHub 專案 |
ngx_http_healthcheck_module |
早期第三方模組,功能較簡單,維護較少 | Wiki 頁面 |
生產環境推薦使用 nginx_upstream_check_module,功能最完善且社群活躍。
nginx_upstream_check_module-master,解壓至 /home/software/。./nginx -V
# 輸出範例:--prefix=/opt/nginx-new --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-pcre
patch -p0 < ../nginx_upstream_check_module-master/check_1.5.12+.patch
若提示 patch: command not found,先執行 yum -y install patch。補丁版本必須與 Nginx 版本匹配,否則會失敗。
--add-module:
./configure --prefix=/opt/nginx-new --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-pcre --add-module=/home/software/nginx_upstream_check_module-master
執行 make(不要執行 make install,以免覆蓋現有執行檔),然後用新編譯的 objs/nginx 替換舊二進制檔並平滑重啟。upstream backend_cluster {
server 10.144.48.157:8205;
server 119.29.204.12:8889;
check interval=3000 rise=2 fall=3 timeout=3000 type=tcp;
}
參數詳解:
interval=3000:每 3 秒發送一次檢查封包rise=2:連續 2 次成功視為 UPfall=3:連續 3 次失敗視為 DOWNtimeout=3000:檢查超時 3 秒type=tcp:使用 TCP 連線檢查(可選 http、mysql、ajp、ssl_hello 等)default_down=true|false:初始狀態(預設 true,即一開始視為 DOWN,需通過檢查才標記 UP)port:指定檢查埠口,預設 0 表示與服務埠口相同location /nstatus {
check_status;
access_log off;
}
瀏覽器訪問 https://nginx-ip/nstatus 即可看到各節點即時狀態:

當節點異常時會標記為 DOWN:

支援參數過濾,如 /nstatus?status=up 僅顯示正常節點。
透過 nginx_upstream_check_module 實現主動健康檢查,能有效解決實體機器故障時 Nginx 仍持續轉發請求的問題,顯著提升服務可用性。配合狀態頁面,運維人員可即時掌握叢集健康狀態,做到心中有數。