nginx实现http代理负载均衡的核心是两步:在http块中定义upstream服务器组,并在location中用proxy_pass引用;upstream必须置于http块内,不可在server或location中定义,否则启动报错;需配置合理策略(如轮询、ip_hash、least_conn等)、健康检查参数(max_fails、fail_timeout)及关键请求头透传。

Nginx 实现 HTTP 代理的后端集群负载均衡,核心是两步:在 http 块中定义 upstream 服务器组,再在 location 中用 proxy_pass 引用它。配置本身不复杂,但位置、语法和关键参数容易出错。
upstream 必须放在 http 块内
upstream 指令不能写在 server 或 location 里,否则 Nginx 启动会报错:“upstream directive is not allowed here”。
正确结构示例:
http {
upstream my_app {
server 192.168.1.10:8000;
server 192.168.1.11:8000;
server 192.168.1.12:8000 backup;
}
server {
listen 80;
location / {
proxy_pass http://my_app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
选择合适的负载均衡策略
根据业务需求,在 upstream 块首行添加对应指令:
- 轮询(默认):无需额外配置,请求依次分发
-
加权轮询:
server 192.168.1.10:8000 weight=3;—— 权重越高,分到的请求越多 -
IP 哈希:开头加
ip_hash;—— 同一客户端 IP 总路由到同一台后端,适合无共享 Session 场景 -
最少连接:开头加
least_conn;—— 优先转发给当前活跃连接数最少的节点 -
URI 哈希(一致性):
hash $request_uri consistent;—— 适合缓存类后端,避免 key 迁移
配置健康检查与容错
静态列表不够可靠,建议为每个 server 补充以下参数:
-
max_fails=3:连续失败 3 次,标记该节点为不可用 -
fail_timeout=30s:30 秒内不再转发请求,之后自动重试 -
backup:仅当其他所有节点都不可用时才启用 -
down:手动下线,用于维护(不参与调度)
例如:
server 192.168.1.10:8000 weight=2 max_fails=3 fail_timeout=20s; server 192.168.1.11:8000 backup;
proxy_pass 使用注意事项
- 必须写成
http://upstream_name(带协议和名称),不能漏掉http:// - 若末尾带
/(如proxy_pass http://my_app/;),Nginx 会截掉匹配的location路径再转发;不带/则完整保留原始 URI - 务必设置
proxy_set_header,否则后端拿不到真实客户端 IP 和 Host 信息
不复杂但容易忽略











