Nginx中多種負載均衡策略配置的實戰(zhàn)指南
前言
在當今高并發(fā)、大流量的互聯網應用中,單臺服務器往往難以承受巨大的訪問壓力。負載均衡作為解決這一問題的關鍵技術,能夠將請求分發(fā)到多臺服務器上,實現系統(tǒng)的高可用性和高性能。
Nginx作為業(yè)界領先的Web服務器和反向代理服務器,其負載均衡功能強大且配置靈活,被廣泛應用于各大互聯網公司。本文將深入探討Nginx負載均衡的各種策略和配置方法,通過實際案例幫助你掌握負載均衡的核心技能。
一、負載均衡基礎概念
1.1 什么是負載均衡
負載均衡(Load Balancing)是一種將網絡請求分配到多個服務器的技術,主要目的是:
核心目標:
- 高可用性:避免單點故障,提高系統(tǒng)可靠性
- 高性能:分散請求壓力,提升系統(tǒng)處理能力
- 可擴展性:支持水平擴展,便于系統(tǒng)擴容
- 靈活性:支持動態(tài)調整和灰度發(fā)布
工作原理:
客戶端 → 負載均衡器 → 后端服務器集群
↓
服務器1
服務器2
服務器3
1.2 負載均衡類型
硬件負載均衡
- F5 BIG-IP:企業(yè)級硬件負載均衡器
- A10:高性能負載均衡設備
- Citrix NetScaler:應用交付控制器
優(yōu)點:
- 性能強大,處理能力高
- 功能完善,支持復雜算法
- 穩(wěn)定性好,可靠性高
缺點:
- 價格昂貴,成本高
- 配置復雜,需要專業(yè)維護
- 擴展性差,升級困難
軟件負載均衡
- Nginx:高性能Web服務器和反向代理
- HAProxy:高可用性負載均衡器
- LVS:Linux虛擬服務器
- Apache mod_proxy_balancer:Apache模塊
優(yōu)點:
- 成本低廉,開源免費
- 配置靈活,易于擴展
- 社區(qū)活躍,支持豐富
缺點:
- 性能相對硬件較低
- 功能相對簡單
- 需要自己維護高可用
1.3 Nginx負載均衡優(yōu)勢
技術優(yōu)勢:
- 高性能:基于事件驅動架構,支持數萬并發(fā)連接
- 高可用性:支持健康檢查和故障轉移
- 靈活性:支持多種負載均衡算法
- 擴展性:支持第三方模塊擴展
功能優(yōu)勢:
- 七層負載均衡:支持HTTP/HTTPS協(xié)議
- 四層負載均衡:支持TCP/UDP協(xié)議
- SSL終止:支持SSL證書卸載
- 緩存功能:支持內容緩存
- 壓縮功能:支持Gzip壓縮
二、Nginx負載均衡基礎配置
2.1 upstream模塊詳解
upstream基本語法
# =============================================
# upstream模塊基礎配置
# =============================================
# 定義后端服務器組
upstream backend_servers {
# 服務器地址和端口
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
# 負載均衡方法
# 默認為輪詢(round-robin)
# least_conn; # 最少連接
# ip_hash; # IP哈希
# hash $request_uri; # 一致性哈希
}
server {
listen 80;
server_name lb.example.com;
location / {
# 代理到后端服務器組
proxy_pass http://backend_servers;
# 設置代理頭信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
upstream參數詳解
# =============================================
# upstream服務器參數詳解
# =============================================
upstream backend_servers {
# 基本服務器配置
server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s backup;
server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 weight=2 max_fails=3 fail_timeout=30s down;
# 服務器參數說明:
# weight: 權重,數值越大分配到的請求越多
# max_fails: 最大失敗次數,超過則標記為不可用
# fail_timeout: 失敗超時時間,單位秒
# backup: 備份服務器,主服務器都不可用時啟用
# down: 標記服務器永久不可用
# max_conns: 最大連接數限制
# resolve: 動態(tài)解析域名
# service: 服務發(fā)現配置
# slow_start: 慢啟動時間
# 負載均衡方法
least_conn;
# 連接保持配置
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
# 會話保持配置
sticky cookie srv_id expires=1h domain=.example.com path=/;
# 健康檢查配置
health_check interval=10s fails=3 passes=2 uri=/health port=8080;
}
2.2 基礎負載均衡配置
簡單輪詢負載均衡
# =============================================
# 簡單輪詢負載均衡配置
# =============================================
# 定義后端服務器組(輪詢方式)
upstream backend_round_robin {
# 輪詢方式(默認)
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
# 連接保持配置
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name round-robin.example.com;
access_log /var/log/nginx/round-robin.example.com.access.log main;
error_log /var/log/nginx/round-robin.example.com.error.log warn;
location / {
# 代理到后端服務器組
proxy_pass http://backend_round_robin;
# 設置代理頭信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 連接設置
proxy_http_version 1.1;
proxy_set_header Connection "";
# 超時設置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 緩沖區(qū)設置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
# 添加負載均衡信息到響應頭
add_header X-Upstream-Addr $upstream_addr;
add_header X-Upstream-Response-Time $upstream_response_time;
}
# =============================================
# 健康檢查端點
# =============================================
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
}
帶權重輪詢負載均衡
# =============================================
# 帶權重輪詢負載均衡配置
# =============================================
# 定義后端服務器組(加權輪詢)
upstream backend_weighted {
# 權重分配,數值越大分配到的請求越多
server 192.168.1.10:8080 weight=5; # 50%的請求
server 192.168.1.11:8080 weight=3; # 30%的請求
server 192.168.1.12:8080 weight=2; # 20%的請求
# 健康檢查設置
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name weighted.example.com;
access_log /var/log/nginx/weighted.example.com.access.log main;
error_log /var/log/nginx/weighted.example.com.error.log warn;
location / {
proxy_pass http://backend_weighted;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
# 添加權重信息到響應頭
add_header X-Upstream-Addr $upstream_addr;
add_header X-Upstream-Weight "5:3:2";
add_header X-Upstream-Response-Time $upstream_response_time;
}
# =============================================
# 負載均衡統(tǒng)計
# =============================================
location /lb_stats {
# 限制訪問
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
# 顯示負載均衡統(tǒng)計信息
add_header Content-Type "application/json";
return 200 '{
"algorithm": "weighted_round_robin",
"servers": [
{"addr": "192.168.1.10:8080", "weight": 5, "status": "up"},
{"addr": "192.168.1.11:8080", "weight": 3, "status": "up"},
{"addr": "192.168.1.12:8080", "weight": 2, "status": "up"}
]
}';
}
}
三、負載均衡策略詳解
3.1 輪詢策略(Round Robin)
基礎輪詢配置
# =============================================
# 輪詢策略配置
# =============================================
# 定義后端服務器組(輪詢)
upstream backend_round_robin {
# 輪詢方式(默認)
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
# 健康檢查
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name rr.example.com;
location / {
proxy_pass http://backend_round_robin;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 添加輪詢信息
add_header X-LB-Algorithm "round_robin";
add_header X-Upstream-Addr $upstream_addr;
}
}
輪詢策略特點
工作原理:
- 按照順序將請求依次分配到后端服務器
- 第一個請求分配到服務器1,第二個到服務器2,以此類推
- 循環(huán)往復,實現均勻分配
適用場景:
- 后端服務器性能相近
- 請求處理時間相似
- 不需要會話保持
優(yōu)缺點:
- ? 配置簡單,易于理解
- ? 請求分配均勻
- ? 不考慮服務器性能差異
- ? 不考慮當前連接數
3.2 加權輪詢策略(Weighted Round Robin)
加權輪詢配置
# =============================================
# 加權輪詢策略配置
# =============================================
# 定義后端服務器組(加權輪詢)
upstream backend_weighted {
# 權重分配
server 192.168.1.10:8080 weight=5; # 高性能服務器
server 192.168.1.11:8080 weight=3; # 中等性能服務器
server 192.168.1.12:8080 weight=2; # 低性能服務器
# 健康檢查
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name wrr.example.com;
location / {
proxy_pass http://backend_weighted;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 添加權重信息
add_header X-LB-Algorithm "weighted_round_robin";
add_header X-Upstream-Addr $upstream_addr;
add_header X-Upstream-Weight "5:3:2";
}
}
加權輪詢策略特點
工作原理:
- 根據服務器權重分配請求
- 權重越高,分配到的請求越多
- 權重比例為5:3:2,則請求分配比例約為50%:30%:20%
適用場景:
- 后端服務器性能差異較大
- 服務器配置不同
- 需要根據性能分配負載
優(yōu)缺點:
- ? 考慮服務器性能差異
- ? 靈活配置負載分配
- ? 優(yōu)化資源利用率
- ? 需要手動調整權重
- ? 不考慮實時負載情況
3.3 IP哈希策略(IP Hash)
IP哈希配置
# =============================================
# IP哈希策略配置
# =============================================
# 定義后端服務器組(IP哈希)
upstream backend_ip_hash {
# IP哈希方式,確保同一客戶端請求始終轉發(fā)到同一服務器
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
# 健康檢查
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name iphash.example.com;
location / {
proxy_pass http://backend_ip_hash;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 添加哈希信息
add_header X-LB-Algorithm "ip_hash";
add_header X-Upstream-Addr $upstream_addr;
add_header X-Client-IP $remote_addr;
}
}
IP哈希策略特點
工作原理:
- 基于客戶端IP地址計算哈希值
- 同一IP的請求始終分配到同一服務器
- 確保會話一致性
適用場景:
- 需要會話保持
- 使用本地會話存儲
- 無分布式會話
優(yōu)缺點:
- ? 會話保持,用戶體驗好
- ? 配置簡單
- ? 負載分配不均勻
- ? 服務器故障時影響大
- ? 不支持動態(tài)添加服務器
3.4 最少連接策略(Least Connections)
最少連接配置
# =============================================
# 最少連接策略配置
# =============================================
# 定義后端服務器組(最少連接)
upstream backend_least_conn {
# 最少連接方式,將請求轉發(fā)到連接數最少的服務器
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
# 健康檢查
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name leastconn.example.com;
location / {
proxy_pass http://backend_least_conn;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 添加連接數信息
add_header X-LB-Algorithm "least_conn";
add_header X-Upstream-Addr $upstream_addr;
add_header X-Upstream-Connections $upstream_connections;
}
}
最少連接策略特點
工作原理:
- 實時監(jiān)控各服務器的連接數
- 將新請求分配到連接數最少的服務器
- 動態(tài)調整負載分配
適用場景:
- 請求處理時間差異較大
- 需要動態(tài)負載均衡
- 長連接應用
優(yōu)缺點:
- ? 動態(tài)負載均衡
- ? 響應時間更優(yōu)
- ? 資源利用率高
- ? 需要實時監(jiān)控連接數
- ? 配置相對復雜
3.5 一致性哈希策略(Consistent Hash)
一致性哈希配置
# =============================================
# 一致性哈希策略配置
# =============================================
# 定義后端服務器組(一致性哈希)
upstream backend_consistent_hash {
# 一致性哈希方式
hash $request_uri consistent;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
# 健康檢查
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name consistent.example.com;
location / {
proxy_pass http://backend_consistent_hash;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 添加哈希信息
add_header X-LB-Algorithm "consistent_hash";
add_header X-Upstream-Addr $upstream_addr;
add_header X-Hash-Key $request_uri;
}
}
一致性哈希策略特點
工作原理:
- 基于請求特征(如URI)計算哈希值
- 相同特征的請求分配到同一服務器
- 支持動態(tài)添加/刪除服務器
適用場景:
- 緩存系統(tǒng)
- 分布式存儲
- 需要數據一致性
優(yōu)缺點:
- ? 支持動態(tài)擴容
- ? 數據一致性好
- ? 負載分配相對均勻
- ? 配置復雜
- ? 需要選擇合適的哈希鍵
3.6 策略對比總結
| 策略 | 適用場景 | 優(yōu)點 | 缺點 |
|---|---|---|---|
| 輪詢 | 服務器性能相近 | 配置簡單,分配均勻 | 不考慮性能差異 |
| 加權輪詢 | 服務器性能差異大 | 考慮性能差異 | 需要手動調整權重 |
| IP哈希 | 需要會話保持 | 會話保持 | 負載不均勻 |
| 最少連接 | 請求處理時間差異大 | 動態(tài)負載均衡 | 配置復雜 |
| 一致性哈希 | 緩存系統(tǒng) | 支持動態(tài)擴容 | 配置復雜 |
四、高級負載均衡配置
4.1 健康檢查配置
被動健康檢查
# =============================================
# 被動健康檢查配置
# =============================================
upstream backend_health_check {
# 后端服務器配置
server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 weight=2 max_fails=3 fail_timeout=30s backup;
# 負載均衡方法
least_conn;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name health.example.com;
location / {
proxy_pass http://backend_health_check;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 添加健康檢查信息
add_header X-Upstream-Status $upstream_status;
add_header X-Upstream-Response-Time $upstream_response_time;
add_header X-Upstream-Addr $upstream_addr;
}
# =============================================
# 健康檢查端點
# =============================================
location /health {
# 限制訪問
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
# 返回健康狀態(tài)
add_header Content-Type "application/json";
return 200 '{
"status": "healthy",
"upstream": "backend_health_check",
"servers": [
{"addr": "192.168.1.10:8080", "status": "up"},
{"addr": "192.168.1.11:8080", "status": "up"},
{"addr": "192.168.1.12:8080", "status": "backup"}
]
}';
}
}
主動健康檢查(需要nginx_plus或第三方模塊)
# =============================================
# 主動健康檢查配置(需要nginx_plus)
# =============================================
upstream backend_active_health {
zone backend_active_health 64k;
server 192.168.1.10:8080 slow_start=30s;
server 192.168.1.11:8080 slow_start=30s;
server 192.168.1.12:8080 slow_start=30s backup;
# 主動健康檢查
health_check interval=10s fails=3 passes=2 uri=/health port=8080;
# 負載均衡
least_conn;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name active-health.example.com;
location / {
proxy_pass http://backend_active_health;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 添加健康狀態(tài)信息
add_header X-Upstream-Status $upstream_status;
add_header X-Upstream-Response-Time $upstream_response_time;
add_header X-Upstream-Addr $upstream_addr;
}
# =============================================
# 健康狀態(tài)監(jiān)控
# =============================================
location /upstream_status {
# 限制訪問
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
# 顯示上游服務器狀態(tài)
upstream_status;
add_header Content-Type "text/plain";
}
}
4.2 會話保持配置
Cookie會話保持
# =============================================
# Cookie會話保持配置
# =============================================
upstream backend_sticky {
# Cookie會話保持
sticky cookie srv_id expires=1h domain=.example.com path=/ httponly secure;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
# 健康檢查
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name sticky.example.com;
location / {
proxy_pass http://backend_sticky;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 添加會話保持信息
add_header X-LB-Session-Sticky "cookie";
add_header X-Upstream-Addr $upstream_addr;
}
# =============================================
# 會話管理
# =============================================
location /session {
# 顯示會話信息
add_header Content-Type "application/json";
return 200 '{
"session_id": "$cookie_srv_id",
"upstream_addr": "$upstream_addr",
"session_sticky": "enabled"
}';
}
}
路由會話保持
# =============================================
# 路由會話保持配置
# =============================================
upstream backend_route {
# 路由會話保持
sticky route $route_cookie $route_uri;
server 192.168.1.10:8080 route=a;
server 192.168.1.11:8080 route=b;
server 192.168.1.12:8080 route=c;
# 健康檢查
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name route.example.com;
location / {
proxy_pass http://backend_route;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 添加路由信息
add_header X-LB-Session-Sticky "route";
add_header X-Upstream-Addr $upstream_addr;
add_header X-Route $route_cookie;
}
}
4.3 動態(tài)負載均衡配置
基于DNS的動態(tài)負載均衡
# =============================================
# 基于DNS的動態(tài)負載均衡配置
# =============================================
upstream backend_dynamic {
# 啟用DNS解析
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# 動態(tài)服務器配置
server web1.example.com:8080 resolve;
server web2.example.com:8080 resolve;
server web3.example.com:8080 resolve;
# 健康檢查
server web1.example.com:8080 max_fails=3 fail_timeout=30s;
server web2.example.com:8080 max_fails=3 fail_timeout=30s;
server web3.example.com:8080 max_fails=3 fail_timeout=30s;
# 負載均衡方法
least_conn;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name dynamic.example.com;
location / {
proxy_pass http://backend_dynamic;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 添加動態(tài)信息
add_header X-LB-Dynamic "dns_based";
add_header X-Upstream-Addr $upstream_addr;
}
}
基于服務發(fā)現的動態(tài)負載均衡
# =============================================
# 基于服務發(fā)現的動態(tài)負載均衡配置
# =============================================
upstream backend_service_discovery {
# 服務發(fā)現配置
zone backend_service_discovery 64k;
# 動態(tài)服務器配置
server backend-service-1.example.com:8080 service=backend resolve;
server backend-service-2.example.com:8080 service=backend resolve;
server backend-service-3.example.com:8080 service=backend resolve;
# 健康檢查
health_check interval=10s fails=3 passes=2 uri=/health port=8080;
# 負載均衡方法
least_conn;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name service-discovery.example.com;
location / {
proxy_pass http://backend_service_discovery;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 添加服務發(fā)現信息
add_header X-LB-Service-Discovery "enabled";
add_header X-Upstream-Addr $upstream_addr;
}
# =============================================
# 服務發(fā)現狀態(tài)
# =============================================
location /service_status {
# 限制訪問
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
# 顯示服務發(fā)現狀態(tài)
add_header Content-Type "application/json";
return 200 '{
"service_discovery": "enabled",
"upstream": "backend_service_discovery",
"services": [
{"name": "backend-service-1", "status": "up"},
{"name": "backend-service-2", "status": "up"},
{"name": "backend-service-3", "status": "up"}
]
}';
}
}
4.4 灰度發(fā)布配置
基于權重的灰度發(fā)布
# =============================================
# 基于權重的灰度發(fā)布配置
# =============================================
upstream backend_canary {
# 灰度發(fā)布配置
# 舊版本:80%流量
# 新版本:20%流量
server 192.168.1.10:8080 weight=8; # 舊版本
server 192.168.1.20:8080 weight=2; # 新版本
# 健康檢查
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.20:8080 max_fails=3 fail_timeout=30s;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name canary.example.com;
location / {
proxy_pass http://backend_canary;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 添加灰度發(fā)布信息
add_header X-Canary-Deployment "enabled";
add_header X-Upstream-Addr $upstream_addr;
add_header X-Version-Weight "8:2";
}
# =============================================
# 版本信息
# =============================================
location /version {
# 顯示版本信息
add_header Content-Type "application/json";
return 200 '{
"canary_deployment": "enabled",
"old_version": {"weight": 8, "addr": "192.168.1.10:8080"},
"new_version": {"weight": 2, "addr": "192.168.1.20:8080"}
}';
}
}
基于用戶特征的灰度發(fā)布
# =============================================
# 基于用戶特征的灰度發(fā)布配置
# =============================================
# 定義用戶特征映射
map $cookie_user_id $user_group {
default "old";
"~^user[0-9]{1,3}$" "new"; # 用戶ID為user001-user999的用戶分配到新版本
}
# 定義后端服務器組
upstream backend_user_canary {
server 192.168.1.10:8080; # 舊版本
server 192.168.1.20:8080; # 新版本
}
server {
listen 80;
server_name user-canary.example.com;
location / {
# 根據用戶組選擇后端
if ($user_group = "new") {
proxy_pass http://192.168.1.20:8080;
}
if ($user_group = "old") {
proxy_pass http://192.168.1.10:8080;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 添加用戶灰度信息
add_header X-Canary-User-Based "enabled";
add_header X-User-Group $user_group;
add_header X-Upstream-Addr $upstream_addr;
}
# =============================================
# 用戶組信息
# =============================================
location /user_group {
# 顯示用戶組信息
add_header Content-Type "application/json";
return 200 '{
"user_canary": "enabled",
"user_id": "$cookie_user_id",
"user_group": "$user_group",
"upstream_addr": "$upstream_addr"
}';
}
}
五、負載均衡監(jiān)控與故障處理
5.1 負載均衡監(jiān)控配置
狀態(tài)監(jiān)控配置
# =============================================
# 負載均衡監(jiān)控配置
# =============================================
http {
# =============================================
# 監(jiān)控日志格式
# =============================================
# 負載均衡監(jiān)控日志格式
log_format lb_monitor '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'upstream_addr="$upstream_addr" '
'upstream_status="$upstream_status" '
'upstream_response_time="$upstream_response_time" '
'upstream_connect_time="$upstream_connect_time" '
'upstream_header_time="$upstream_header_time"';
# =============================================
# 監(jiān)控服務器配置
# =============================================
server {
listen 80;
server_name monitor.example.com;
# 負載均衡狀態(tài)頁面
location /lb_status {
# 限制訪問
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
# 顯示負載均衡狀態(tài)
stub_status on;
add_header Content-Type "text/plain";
}
# 上游服務器狀態(tài)
location /upstream_status {
# 限制訪問
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
# 顯示上游服務器狀態(tài)
upstream_status;
add_header Content-Type "text/plain";
}
# 實時監(jiān)控數據
location /real_time_stats {
# 限制訪問
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
# 實時統(tǒng)計信息
add_header Content-Type "application/json";
return 200 '{
"timestamp": "$time_iso8601",
"connections": {
"active": $connections_active,
"reading": $connections_reading,
"writing": $connections_writing,
"waiting": $connections_waiting
},
"requests": {
"total": $request_counter,
"current": $connections_active
}
}';
}
# 歷史統(tǒng)計數據
location /historical_stats {
# 限制訪問
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
# 顯示歷史統(tǒng)計信息
add_header Content-Type "application/json";
return 200 '{
"historical_data": "available_in_log_files",
"log_file": "/var/log/nginx/lb_monitor.log",
"retention_days": 30
}';
}
}
}
監(jiān)控腳本配置
# =============================================
# 負載均衡監(jiān)控腳本
# 創(chuàng)建 /usr/local/nginx/scripts/lb_monitor.sh
# =============================================
#!/bin/bash
# Nginx負載均衡監(jiān)控腳本
# 用法:./lb_monitor.sh
# 配置參數
NGINX_STATUS_URL="http://localhost/lb_status"
UPSTREAM_STATUS_URL="http://localhost/upstream_status"
LOG_FILE="/var/log/nginx/lb_monitor.log"
ALERT_EMAIL="admin@example.com"
ALERT_THRESHOLD=1000
# 獲取Nginx狀態(tài)
get_nginx_status() {
curl -s $NGINX_STATUS_URL
}
# 獲取上游服務器狀態(tài)
get_upstream_status() {
curl -s $UPSTREAM_STATUS_URL
}
# 解析Nginx狀態(tài)
parse_nginx_status() {
local status=$(get_nginx_status)
local active_connections=$(echo "$status" | grep "Active connections" | awk '{print $3}')
local accepts=$(echo "$status" | awk 'NR==3 {print $1}')
local handled=$(echo "$status" | awk 'NR==3 {print $2}')
local requests=$(echo "$status" | awk 'NR==3 {print $3}')
local reading=$(echo "$status" | awk 'NR==4 {print $2}')
local writing=$(echo "$status" | awk 'NR==4 {print $4}')
local waiting=$(echo "$status" | awk 'NR==4 {print $6}')
echo "Active connections: $active_connections"
echo "Accepts: $accepts"
echo "Handled: $handled"
echo "Requests: $requests"
echo "Reading: $reading"
echo "Writing: $writing"
echo "Waiting: $waiting"
# 檢查是否超過閾值
if [ "$active_connections" -gt "$ALERT_THRESHOLD" ]; then
echo "WARNING: Active connections exceed threshold: $active_connections > $ALERT_THRESHOLD"
send_alert "High active connections detected: $active_connections"
fi
}
# 解析上游服務器狀態(tài)
parse_upstream_status() {
local status=$(get_upstream_status)
echo "Upstream Server Status:"
echo "$status"
# 檢查是否有服務器宕機
if echo "$status" | grep -q "down"; then
echo "WARNING: Some upstream servers are down"
send_alert "Upstream server down detected"
fi
}
# 發(fā)送告警
send_alert() {
local message=$1
echo "[$(date)] ALERT: $message" >> $LOG_FILE
echo "$message" | mail -s "Nginx Load Balancer Alert" $ALERT_EMAIL
}
# 記錄監(jiān)控數據
log_monitor_data() {
local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
local status=$(get_nginx_status)
local active_connections=$(echo "$status" | grep "Active connections" | awk '{print $3}')
local upstream_status=$(get_upstream_status)
echo "$timestamp, $active_connections, $upstream_status" >> $LOG_FILE
}
# 主函數
main() {
echo "=== Nginx Load Balancer Monitor ==="
echo "Timestamp: $(date)"
echo ""
echo "Nginx Status:"
parse_nginx_status
echo ""
echo "Upstream Status:"
parse_upstream_status
echo ""
echo "Logging monitor data..."
log_monitor_data
echo "Monitoring completed."
}
# 執(zhí)行主函數
main
5.2 故障處理配置
故障轉移配置
# =============================================
# 故障轉移配置
# =============================================
upstream backend_failover {
# 主服務器
server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s;
# 備份服務器
server 192.168.1.20:8080 backup;
server 192.168.1.21:8080 backup;
# 負載均衡方法
least_conn;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name failover.example.com;
location / {
proxy_pass http://backend_failover;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 故障轉移配置
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
# 添加故障轉移信息
add_header X-Failover "enabled";
add_header X-Upstream-Addr $upstream_addr;
add_header X-Upstream-Status $upstream_status;
}
# =============================================
# 故障狀態(tài)頁面
# =============================================
location /failover_status {
# 限制訪問
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
# 顯示故障轉移狀態(tài)
add_header Content-Type "application/json";
return 200 '{
"failover": "enabled",
"primary_servers": [
{"addr": "192.168.1.10:8080", "status": "up"},
{"addr": "192.168.1.11:8080", "status": "up"}
],
"backup_servers": [
{"addr": "192.168.1.20:8080", "status": "standby"},
{"addr": "192.168.1.21:8080", "status": "standby"}
]
}';
}
}
熔斷器配置
# =============================================
# 熔斷器配置
# =============================================
# 定義熔斷器狀態(tài)變量
map $upstream_addr $circuit_breaker_status {
default "closed";
192.168.1.10:8080 "closed";
192.168.1.11:8080 "closed";
192.168.1.12:8080 "closed";
}
upstream backend_circuit_breaker {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
# 負載均衡方法
least_conn;
# 連接保持
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name circuit-breaker.example.com;
location / {
# 熔斷器檢查
if ($circuit_breaker_status = "open") {
return 503 "Service Unavailable - Circuit Breaker Open";
}
proxy_pass http://backend_circuit_breaker;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
# 熔斷器配置
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 2;
proxy_next_upstream_timeout 5s;
# 添加熔斷器信息
add_header X-Circuit-Breaker $circuit_breaker_status;
add_header X-Upstream-Addr $upstream_addr;
add_header X-Upstream-Status $upstream_status;
}
# =============================================
# 熔斷器狀態(tài)管理
# =============================================
location /circuit_breaker {
# 限制訪問
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
# 熔斷器控制
if ($args ~* "action=open") {
return 200 'Circuit breaker opened manually';
}
if ($args ~* "action=close") {
return 200 'Circuit breaker closed manually';
}
# 顯示熔斷器狀態(tài)
add_header Content-Type "application/json";
return 200 '{
"circuit_breaker": "enabled",
"status": "$circuit_breaker_status",
"upstream_addr": "$upstream_addr",
"upstream_status": "$upstream_status"
}';
}
}
六、實戰(zhàn)案例
6.1 電商網站負載均衡配置
電商網站負載均衡架構
# =============================================
# 電商網站負載均衡配置
# =============================================
# 用戶服務負載均衡
upstream user_service {
least_conn;
server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 weight=2 max_fails=3 fail_timeout=30s backup;
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
# 商品服務負載均衡
upstream product_service {
ip_hash;
server 192.168.1.20:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.21:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.22:8080 max_fails=3 fail_timeout=30s backup;
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
# 訂單服務負載均衡
upstream order_service {
least_conn;
server 192.168.1.30:8080 weight=4 max_fails=3 fail_timeout=30s;
server 192.168.1.31:8080 weight=4 max_fails=3 fail_timeout=30s;
server 192.168.1.32:8080 weight=2 max_fails=3 fail_timeout=30s backup;
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
# 支付服務負載均衡
upstream payment_service {
least_conn;
server 192.168.1.40:8080 weight=5 max_fails=2 fail_timeout=15s;
server 192.168.1.41:8080 weight=5 max_fails=2 fail_timeout=15s;
server 192.168.1.42:8080 backup;
keepalive 16;
keepalive_timeout 30s;
keepalive_requests 500;
}
server {
listen 80;
server_name ecommerce.example.com;
access_log /var/log/nginx/ecommerce.example.com.access.log main;
error_log /var/log/nginx/ecommerce.example.com.error.log warn;
# =============================================
# 靜態(tài)資源
# =============================================
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|eot|svg)$ {
root /usr/local/nginx/html/ecommerce;
expires 7d;
add_header Cache-Control "public, no-transform";
access_log off;
}
# =============================================
# 用戶服務
# =============================================
location /api/user/ {
proxy_pass http://user_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 用戶服務會話保持
proxy_cookie_path / /;
proxy_cookie_domain off;
# 添加服務標識
add_header X-Service "user_service";
add_header X-Upstream-Addr $upstream_addr;
}
# =============================================
# 商品服務
# =============================================
location /api/product/ {
proxy_pass http://product_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 商品服務緩存
proxy_cache product_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_key $scheme$request_method$host$request_uri;
# 添加服務標識
add_header X-Service "product_service";
add_header X-Upstream-Addr $upstream_addr;
add_header X-Cache-Status $upstream_cache_status;
}
# =============================================
# 訂單服務
# =============================================
location /api/order/ {
proxy_pass http://order_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 訂單服務重試機制
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
# 添加服務標識
add_header X-Service "order_service";
add_header X-Upstream-Addr $upstream_addr;
}
# =============================================
# 支付服務
# =============================================
location /api/payment/ {
proxy_pass http://payment_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 支付服務嚴格超時
proxy_next_upstream error timeout;
proxy_next_upstream_tries 2;
# 添加服務標識
add_header X-Service "payment_service";
add_header X-Upstream-Addr $upstream_addr;
}
# =============================================
# 健康檢查
# =============================================
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
# =============================================
# 服務狀態(tài)
# =============================================
location /service_status {
# 限制訪問
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
# 顯示服務狀態(tài)
add_header Content-Type "application/json";
return 200 '{
"services": {
"user_service": {"status": "active", "algorithm": "least_conn"},
"product_service": {"status": "active", "algorithm": "ip_hash"},
"order_service": {"status": "active", "algorithm": "least_conn"},
"payment_service": {"status": "active", "algorithm": "least_conn"}
}
}';
}
}
6.2 微服務架構負載均衡配置
微服務負載均衡架構
# =============================================
# 微服務架構負載均衡配置
# =============================================
# API網關負載均衡
upstream api_gateway {
least_conn;
server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 weight=2 max_fails=3 fail_timeout=30s backup;
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
# 認證服務負載均衡
upstream auth_service {
least_conn;
server 192.168.1.20:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.21:8080 max_fails=3 fail_timeout=30s;
keepalive 16;
keepalive_timeout 30s;
keepalive_requests 500;
}
# 用戶服務負載均衡
upstream user_service {
ip_hash;
server 192.168.1.30:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.31:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.32:8080 max_fails=3 fail_timeout=30s backup;
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
# 業(yè)務服務負載均衡
upstream business_service {
least_conn;
server 192.168.1.40:8080 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.41:8080 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.42:8080 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.43:8080 weight=1 max_fails=3 fail_timeout=30s backup;
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
# 消息服務負載均衡
upstream message_service {
least_conn;
server 192.168.1.50:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.51:8080 max_fails=3 fail_timeout=30s;
keepalive 16;
keepalive_timeout 30s;
keepalive_requests 500;
}
# 文件服務負載均衡
upstream file_service {
least_conn;
server 192.168.1.60:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.61:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.62:8080 weight=2 max_fails=3 fail_timeout=30s backup;
keepalive 32;
keepalive_timeout 30s;
keepalive_requests 1000;
}
server {
listen 80;
server_name microservice.example.com;
access_log /var/log/nginx/microservice.example.com.access.log main;
error_log /var/log/nginx/microservice.example.com.error.log warn;
# =============================================
# API網關
# =============================================
location / {
proxy_pass http://api_gateway;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# API網關重試機制
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
# 添加網關標識
add_header X-Gateway "nginx";
add_header X-Upstream-Addr $upstream_addr;
}
# =============================================
# 內部服務路由
# =============================================
# 認證服務
location /internal/auth/ {
proxy_pass http://auth_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 認證服務緩存
proxy_cache auth_cache;
proxy_cache_valid 200 302 5m;
proxy_cache_valid 404 1m;
proxy_cache_key $scheme$request_method$host$request_uri;
add_header X-Service "auth_service";
add_header X-Upstream-Addr $upstream_addr;
add_header X-Cache-Status $upstream_cache_status;
}
# 用戶服務
location /internal/user/ {
proxy_pass http://user_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
add_header X-Service "user_service";
add_header X-Upstream-Addr $upstream_addr;
}
# 業(yè)務服務
location /internal/business/ {
proxy_pass http://business_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 業(yè)務服務重試機制
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
add_header X-Service "business_service";
add_header X-Upstream-Addr $upstream_addr;
}
# 消息服務
location /internal/message/ {
proxy_pass http://message_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
add_header X-Service "message_service";
add_header X-Upstream-Addr $upstream_addr;
}
# 文件服務
location /internal/file/ {
proxy_pass http://file_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 文件服務大文件支持
client_max_body_size 100m;
proxy_max_temp_file_size 1024m;
add_header X-Service "file_service";
add_header X-Upstream-Addr $upstream_addr;
}
# =============================================
# 服務發(fā)現和健康檢查
# =============================================
location /service_discovery {
# 限制訪問
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
# 顯示服務發(fā)現狀態(tài)
add_header Content-Type "application/json";
return 200 '{
"microservices": {
"api_gateway": {"status": "active", "servers": 3},
"auth_service": {"status": "active", "servers": 2},
"user_service": {"status": "active", "servers": 3},
"business_service": {"status": "active", "servers": 4},
"message_service": {"status": "active", "servers": 2},
"file_service": {"status": "active", "servers": 3}
}
}';
}
# =============================================
# 健康檢查
# =============================================
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
}
性能優(yōu)化建議:
- 合理配置連接保持參數
- 啟用緩存提高響應速度
- 根據服務器性能配置權重
- 實現動態(tài)擴容和縮容
- 定期監(jiān)控和優(yōu)化負載均衡效果
高可用性建議:
- 配置備份服務器
- 實現故障自動轉移
- 建立熔斷機制防止雪崩
- 實現灰度發(fā)布降低風險
- 定期演練故障恢復流程
Nginx負載均衡是構建高可用、高性能系統(tǒng)的關鍵技術。通過本文的學習,你應該能夠根據實際業(yè)務需求,設計并實現合適的負載均衡方案,為系統(tǒng)的穩(wěn)定運行提供有力保障。
以上就是Nginx中多種負載均衡策略配置的實戰(zhàn)指南的詳細內容,更多關于Nginx負載均衡的資料請關注腳本之家其它相關文章!

