Nginx作为反向代理和负载均衡器在Web架构中广泛应用。upstream模块支持多种负载均衡算法和健康检查策略,合理配置可实现流量均匀分配和故障自动剔除。网站运维中,Nginx负载均衡是保障服务高可用的核心组件。
upstream负载均衡算法配置
Nginx支持四种负载均衡算法,每种适用于不同场景:
轮询(round-robin):默认算法,按顺序依次分配请求到后端服务器。适合后端服务器配置相同的场景。
加权轮询(weighted round-robin):按权重分配请求,权重高的服务器接收更多请求。适合后端服务器配置不同的情况。
最少连接(least_conn):将请求分配给当前连接数最少的服务器。适合长连接或请求处理时间差异大的场景。
IP哈希(ip_hash):基于客户端IP计算哈希值,同一IP的请求始终分配到同一服务器。适合需要会话保持的场景。
# /etc/nginx/conf.d/load_balancer.conf
# 加权轮询配置
upstream web_backend {
server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 weight=1 max_fails=3 fail_timeout=30s;
# backup服务器,仅当主服务器全部不可用时启用
server 192.168.1.13:8080 backup;
}
# 最少连接配置
upstream api_backend {
least_conn;
server 10.0.0.1:3000 max_fails=2 fail_timeout=15s;
server 10.0.0.2:3000 max_fails=2 fail_timeout=15s;
server 10.0.0.3:3000 max_fails=2 fail_timeout=15s;
}
# IP哈希配置(会话保持)
upstream session_backend {
ip_hash;
server 10.0.0.1:8080;
server 10.0.0.2:8080;
server 10.0.0.3:8080;
}
server {
listen 80;
server_name lb.example.com;
location /web/ {
proxy_pass http://web_backend;
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_connect_timeout 5s;
proxy_read_timeout 30s;
proxy_send_timeout 10s;
}
location /api/ {
proxy_pass http://api_backend;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
被动健康检查机制配置
Nginx内置被动健康检查,通过max_fails和fail_timeout参数实现。当后端服务器在fail_timeout时间内失败次数达到max_fails,Nginx会暂时将其标记为不可用,在fail_timeout时间后重新尝试。
upstream backend_with_passive_check {
# max_fails=3: 在fail_timeout窗口内允许3次失败
# fail_timeout=30s: 30秒内失败3次后,该服务器被标记为不可用30秒
server 192.168.1.10:8080 weight=1 max_fails=3 fail_timeout=30s;
# slow_start=10s: 服务器恢复后逐渐增加权重,避免流量涌入压垮
# 仅商业版Nginx Plus支持slow_start
server 192.168.1.11:8080 weight=1 max_fails=3 fail_timeout=30s slow_start=10s;
}
# proxy_next_upstream - 请求重试到下一台服务器
server {
listen 80;
location / {
proxy_pass http://backend_with_passive_check;
# 当后端返回以下错误时,自动重试到下一台服务器
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
# 最多重试次数
proxy_next_upstream_tries 3;
# 重试超时总时间
proxy_next_upstream_timeout 10s;
}
}
主动健康检查:nginx_upstream_check_module
Nginx开源版不支持主动健康检查,需通过第三方模块nginx_upstream_check_module实现。主动健康检查定期探测后端服务器状态,比被动检查更及时。
# 编译安装(需重新编译Nginx)
# 下载模块
git clone https://github.com/yaoweibin/nginx_upstream_check_module.git
# 编译Nginx时添加模块
cd nginx-1.24.0
./configure --add-module=../nginx_upstream_check_module
make && make install
# 配置主动健康检查
upstream backend_with_active_check {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
# 主动健康检查配置
check interval=3000 rise=2 fall=3 timeout=2000 type=http;
# interval=3000 每3秒检查一次
# rise=2 连续成功2次标记为可用
# fall=3 连续失败3次标记为不可用
# timeout=2000 检查超时2秒
# type=http 使用HTTP协议检查
# 指定检查的URI和期望响应
check_http_send "HEAD /health HTTP/1.1\r\nHost: backend\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
# 健康检查状态页
server {
listen 80;
server_name health.example.com;
location /status {
check_status;
access_log off;
# 允许内网访问
allow 192.168.1.0/24;
deny all;
}
}
连接保持与性能优化参数
Nginx到后端的连接保持(keepalive)可减少TCP连接建立开销,对高并发场景尤为重要:
upstream backend_keepalive {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
# 保持到后端的长连接池
keepalive 32;
# 保持连接的超时时间
keepalive_timeout 60s;
# 每个连接最大请求数
keepalive_requests 1000;
}
server {
listen 80;
location / {
proxy_pass http://backend_keepalive;
# 启用HTTP/1.1支持keepalive
proxy_http_version 1.1;
# 清除Connection头,防止传递close
proxy_set_header Connection "";
# 连接优化
proxy_connect_timeout 5s;
proxy_send_timeout 30s;
proxy_read_timeout 60s;
# 缓冲区配置
proxy_buffering on;
proxy_buffer_size 16k;
proxy_buffers 8 32k;
proxy_busy_buffers_size 64k;
# 临时文件写入阈值(超过则写磁盘)
proxy_max_temp_file_size 1024m;
}
}
蓝绿部署与灰度发布配置
通过upstream权重调整可实现蓝绿部署和灰度发布:
# 蓝绿部署: 100%流量切换
upstream blue_green {
# 蓝组(当前活跃)
server 192.168.1.10:8080 weight=10;
# 绿组(待切换)
server 192.168.1.20:8080 weight=0 down;
# 切换时: 将蓝组设为down,绿组设为weight=10
}
# 灰度发布: 按比例分流
upstream canary {
# 稳定版接收90%流量
server 192.168.1.10:8080 weight=90;
# 金丝雀版接收10%流量
server 192.168.1.20:8080 weight=10;
}
# 按请求头灰度分流(使用split_clients模块)
split_clients "\${remote_addr}\${http_x_user_id}" $backend_pool {
10% canary_pool;
* stable_pool;
}
upstream stable_pool {
server 192.168.1.10:8080;
}
upstream canary_pool {
server 192.168.1.20:8080;
}
server {
listen 80;
location / {
proxy_pass http://$backend_pool;
}
}
Nginx负载均衡配置需要结合实际流量特征和后端服务能力进行调整。生产环境中建议配合监控系统(如Prometheus + nginx_exporter)实时观测各后端服务器的QPS、响应时间、错误率等指标,基于数据驱动调优权重和健康检查参数。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/nginx-gao-xing-neng-fu-zai-jun-heng-pei-zhi-shi-zhan/