負載平衡(Upstream)
當一台後端伺服器不足以應付流量,或需要避免單點故障時,可以用 upstream 定義一組後端伺服器,讓 Nginx 把請求分散給它們處理,這就是負載平衡(load balancing)。
upstream 基本語法
upstream backend_app {
server 10.0.0.11:3000;
server 10.0.0.12:3000;
server 10.0.0.13:3000;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_app;
}
}
只要把 反向代理設定 中 proxy_pass 的目標,從單一位址換成 upstream 的名稱,Nginx 就會依照演算法把請求分配到群組中的伺服器。
常見的分配演算法
| 演算法 | 設定方式 | 說明 |
|---|---|---|
| Round Robin | 預設,不需額外設定 | 依序輪流分配給每一台伺服器 |
| Weighted Round Robin | server 10.0.0.11 weight=3; |
依權重比例分配,數字越大分到的請求越多,適合機器規格不同時使用 |
| Least Connections | least_conn; |
優先分配給目前連線數最少的伺服器 |
| IP Hash | ip_hash; |
依客戶端 IP 計算固定分配到同一台伺服器,適合需要 session 黏著(session persistence)的場景 |
健康檢查與備援伺服器
開源版 Nginx 內建的是被動式健康檢查:只有在實際轉發請求失敗時才會標記伺服器異常,並非持續主動探測。
upstream backend_app {
server 10.0.0.11:3000 max_fails=3 fail_timeout=30s;
server 10.0.0.12:3000 max_fails=3 fail_timeout=30s;
server 10.0.0.13:3000 backup;
}
max_fails/fail_timeout:在fail_timeout秒內失敗達max_fails次,就會暫時把該伺服器標記為不可用,暫停一段時間再重試。backup:只有在其他伺服器都無法使用時,才會把流量轉發給標記為backup的伺服器。
若需要主動、週期性地探測後端健康狀態(active health check),這是商業版 NGINX Plus 才提供的功能;開源版通常會另外搭配外部監控或應用層的健康檢查機制來補足。