Nginx负载均衡由upstream模块定义服务器组并配合proxy_pass实现,proxy_pass仅负责转发,真正分发逻辑在upstream中;默认策略为轮询,还支持weight、ip_hash、least_conn等策略,并通过max_fails/fail_timeout实现被动健康检查。

Nginx 的 proxy_pass 本身不直接实现负载均衡,它只是把请求转发给后端服务器;真正的负载均衡由 upstream 模块 配合 proxy_pass 共同完成。
定义 upstream 块(核心步骤)
在 http 块中声明一个 upstream 组,列出多个后端服务地址,Nginx 会按策略从中选择一个节点转发请求:
http {
upstream backend_servers {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
<pre class="brush:php;toolbar:false;">server {
location / {
proxy_pass http://backend_servers; # 注意:这里指向 upstream 名字,不是具体地址
}
}
}
常用负载均衡策略
upstream 支持多种分发方式,默认是轮询(round-robin),也可显式指定:
- 轮询(默认):请求依次分发到每个 server,自动跳过不可用节点
-
权重(weight):按配置的数值分配请求比例,适合性能不均的服务器
server 192.168.1.10:8080 weight=3;(占 3/5 请求)server 192.168.1.11:8080 weight=2;(占 2/5 请求) -
ip_hash:根据客户端 IP 哈希固定分发,保证同一 IP 总访问同一后端(适用于需会话保持的场景)
upstream backend_servers { ip_hash; server ...; } - least_conn:优先分发给当前连接数最少的后端,适合长连接场景
健康检查与容错机制
Nginx 开源版不支持主动健康检查(如定期探活),但可通过以下方式增强可用性:
- 使用
max_fails和fail_timeout自动标记异常节点:server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
表示 30 秒内失败 3 次,则暂停该节点 30 秒 - 配合
backup标记备用服务器,仅当其他节点全不可用时启用 - 商业版 Nginx Plus 或 OpenResty 可配置主动健康检查(
health_check指令)
注意事项与常见问题
确保负载均衡生效,需注意几个关键点:
-
proxy_pass后的地址必须是upstream name(如http://backend_servers),不能写成具体 IP+端口,否则绕过 upstream,失去负载能力 - 若 location 使用正则或带路径前缀,注意
proxy_pass末尾是否加斜杠,会影响路径重写行为 - 建议开启
proxy_set_header Host $host;等头信息透传,避免后端无法识别原始请求域名 - 日志中可通过
$upstream_addr查看本次实际转发的目标地址,便于排查分发逻辑











