Nginx负载均衡依赖ngx_http_upstream_module定义后端服务池与ngx_http_proxy_module转发请求协同实现;upstream必须置于http块内,支持轮询、least_conn、ip_hash等策略,并需正确配置proxy_pass尾部斜杠以控制URI传递,同时透传Host、X-Real-IP等关键头及设置超时参数。

Nginx 本身不内置“负载均衡模块”,而是靠 ngx_http_upstream_module 定义后端服务组,再由 ngx_http_proxy_module 负责把请求转发过去——两者配合,才构成完整的负载均衡能力。
upstream 块:定义后端服务池
这是负载分发的逻辑核心,必须放在 http 块内,不能嵌套在 server 或 location 中:
- 每个
upstream块需起一个名字(如app_servers),后续通过proxy_pass http://app_servers引用 - 支持多种调度策略:
round_robin(默认轮询)、least_conn(最少连接)、ip_hash(客户端 IP 绑定)、hash $request_uri(URL 一致性哈希)等 - 可为每台后端设置参数:权重(
weight=3)、最大失败次数(max_fails=2)、故障恢复时间(fail_timeout=30s) -
backup标记的服务器仅在其他节点全部不可用时启用;down表示永久下线
proxy_pass:正确转发请求
它不是简单地把 URL 写进去,路径写法直接影响后端接收到的 URI:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 写成
proxy_pass http://backend_servers;(末尾无斜杠)→ 原始 location 路径会被完整保留并传递过去 - 写成
proxy_pass http://backend_servers/;(末尾有斜杠)→ location 的路径前缀会被剥离,只传剩余部分 - 若 location 使用正则匹配(如
location ~ ^/api/),则proxy_pass后面不能带 URI,否则配置会报错
关键头信息与超时控制
确保后端能拿到真实客户端信息,并避免因网络或后端响应慢导致连接卡死:
- 透传原始 Host:
proxy_set_header Host $host; - 传递真实客户端 IP:
proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - 连接超时(建立 TCP 连接):
proxy_connect_timeout 10; - 发送超时(Nginx 向后端发完请求后的等待时间):
proxy_send_timeout 30; - 读取超时(等待后端响应头和正文的时间):
proxy_read_timeout 30;
健康检查注意事项
Nginx 开源版的 upstream 默认只做被动健康检查:某台服务器连续失败达到 max_fails 次后,会在 fail_timeout 时间内被标记为不可用,期间不再转发请求。它不主动发心跳探测,也不支持自定义健康检查路径。如需主动检测,需借助第三方模块(如 nginx_upstream_check_module)或升级到 Nginx Plus。

















