Nginx通过upstream模块实现后端服务器分流,需在http块内定义服务器组并配置weight、max_fails、backup、down等参数,结合轮询、least_conn、ip_hash等算法调度请求,再在server块中用proxy_pass转发并透传关键Header。

在 Nginx 中用 upstream 模块实现多台后端服务器分流,核心是定义服务器组并让请求按策略转发过去。配置本身不难,但参数设错容易导致流量倾斜、节点不剔除或会话中断。
定义 upstream 服务器组
所有后端服务必须在 http 块内统一声明,每台服务器可带控制参数:
-
基础轮询写法:
server 192.168.1.10:8080;—— 默认顺序分发,自动跳过故障节点 -
加权分发:
server 192.168.1.10:8080 weight=3;—— 适合新老机器性能差异大的情况,权重比决定流量比例 -
容错设置:
server 192.168.1.11:8080 max_fails=2 fail_timeout=10s;—— 连续失败 2 次后暂停 10 秒再试 -
备用节点:
server 192.168.1.12:8080 backup;—— 仅当其他全部不可用时启用 -
永久下线:
server 192.168.1.13:8080 down;—— 手动维护时使用,不参与调度
选择合适的负载算法
算法决定请求怎么分到各后端,不同场景适用不同策略:
- 轮询(默认):顺序分发,适合后端性能接近、无状态服务
- least_conn:优先发给当前连接数最少的后端,适合长连接或响应时间波动大的业务
- ip_hash:按客户端 IP 哈希,保证同一用户始终落到同一台后端,适用于无共享 Session 的应用
- hash $request_uri:需第三方模块支持,适合缓存一致性要求高的场景
算法指令写在 upstream 块开头,例如:upstream backend { least_conn; server ...; }
在 server 中完成反向代理
定义好 upstream 后,要在 server 块里用 proxy_pass 把请求导过去,并透传关键头信息:
-
proxy_pass http://backend_group;—— 名称必须和upstream声明一致,且不能含下划线 -
proxy_set_header Host $host;—— 保留原始 Host,避免后端路由出错 -
proxy_set_header X-Real-IP $remote_addr;—— 让后端拿到真实客户端 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 链路中多个代理时补全 IP 链 - 建议加上超时控制:
proxy_connect_timeout 5s; proxy_read_timeout 10s;
验证与健康检查
配置完别急着上线,要确认是否生效:
- 运行
nginx -t检查语法,避免 reload 失败 - 执行
systemctl reload nginx或nginx -s reload加载新配置 - 手动停掉一台后端,观察请求是否自动切到其余节点(Nginx 默认被动健康检查)
- 如需主动探测,需编译安装
nginx_upstream_check_module并配置check指令


















