Nginx 通过 upstream 块定义后端服务组并指定调度算法、权重及故障策略,再配合 proxy_pass 实现反向代理与负载均衡;其健康检查依赖被动探测,不支持主动检测。

Nginx 通过 ngx_http_proxy_module 模块实现反向代理,再配合 upstream 块,就能完成基础而高效的负载均衡。它不直接提供“负载均衡模块”,而是把路由分发逻辑交给 upstream,把请求转发能力交给 proxy 模块——二者协同工作,才是实际的负载均衡方案。
配置 upstream 定义后端服务组
upstream 是负载均衡的核心配置段,需定义在 http 块中,不能放在 server 或 location 内:
- 每个 upstream 块起一个名字(如
backend_servers),后续在 proxy_pass 中引用 - 支持多种调度算法:
round_robin(默认)、least_conn、ip_hash、hash $request_uri consistent等 - 可为每个 server 设置权重(
weight=3)、最大失败次数(max_fails=2)、超时恢复时间(fail_timeout=30s)
示例:
upstream backend_servers {
ip_hash;
server 192.168.1.10:8080 weight=2 max_fails=3 fail_timeout=20s;
server 192.168.1.11:8080 weight=1;
server 192.168.1.12:8080 backup;
}
其中 backup 表示仅当其他节点全部不可用时才启用。
在 location 中用 proxy_pass 转发到 upstream
proxy_pass 指向 upstream 名称(带协议前缀 http://),Nginx 会自动按 upstream 规则选择后端:
- 必须写成
proxy_pass http://backend_servers;(末尾无路径,否则会截断 URI) - 若需重写路径,建议用
rewrite配合proxy_redirect,避免语义混乱 - 常用配套指令:设置 Host 头(
proxy_set_header Host $host;)、透传真实 IP(proxy_set_header X-Real-IP $remote_addr;)、关闭缓冲提升流式响应(proxy_buffering off;)
典型 location 示例:
server {
listen 80;
server_name 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_connect_timeout 10;
proxy_send_timeout 30;
proxy_read_timeout 30;
}
}
健康检查与故障转移依赖被动探测
ngx_http_proxy_module 本身不提供主动健康检查(active health check),但支持基于响应状态码和超时的被动探测:
- 当某 server 返回 500/502/503/504 或连接超时,Nginx 自动标记为不可用,并在
fail_timeout时间内不再转发请求给它 - 超过
max_fails次失败后进入“宕机”状态,到期后自动恢复试探 - 如需主动检测(如定期 GET /health),需借助第三方模块(如 nginx_upstream_check_module)或外部监控+API 动态更新 upstream
注意 proxy 缓存与长连接的影响
默认情况下 proxy 模块启用连接池和响应缓冲,这会影响负载行为:
- 开启
keepalive可复用后端连接(需搭配proxy_http_version 1.1和proxy_set_header Connection '') - 若后端是短连接服务,应禁用
proxy_buffering或调小proxy_buffers,防止大响应堆积阻塞 worker - 避免在 proxy_pass 后加 URI 路径(如
proxy_pass http://backend/abc;),否则会替换原始 location 匹配路径,易导致 404 或逻辑错乱










