nginx负载均衡核心是upstream块定义服务器组并指定算法(轮询/加权轮询/ip_hash/least_conn),proxy_pass引用该组,配合max_fails、backup、resolve等参数增强可用性,并通过proxy_set_header透传真实客户端信息。

在 Nginx 中管理后端服务器负载均衡,核心是合理使用 upstream 块配合 proxy_pass,并根据业务需求选择合适策略和参数。配置不难,但细节决定稳定性与可用性。
定义 upstream 服务器组
所有后端服务器必须先在 http 块内用 upstream 定义,名字自取(如 backend),后续通过该名字被引用:
- 每台后端用
server IP:PORT表示,支持域名、Unix socket、端口偏移等写法 -
upstream必须放在http块中,不能嵌套在server或location内 - 多个
upstream可共存,便于按业务线或环境隔离(如api_backend、static_backend)
选择适合的负载均衡算法
算法由 upstream 块内的指令控制,不同场景适用不同方式:
- 轮询(默认):不加任何指令,请求依次分发。适合性能相近、无状态服务
-
加权轮询:用
weight=数字(如weight=3),数值越大分配越多请求。适合异构服务器(如 8C16G 和 4C8G 混合部署) -
IP 哈希:加
ip_hash;,同一客户端 IP 固定打到同一台后端。解决 session 未共享时的登录态丢失问题 -
最少连接:加
least_conn;,优先选当前活跃连接数最少的机器。适合长耗时请求(如文件上传、报表导出)
增强后端可用性与运维弹性
仅靠调度算法不够,还需配置健康检查和容灾机制:
-
被动健康检查:给
server加max_fails=3 fail_timeout=30s,连续失败 3 次则标记为不可用,30 秒后重试 -
备份服务器:用
backup标记某台为备用机,仅当其他全部失效时启用 -
临时下线:加
down参数可平滑摘除某台,无需重启 Nginx -
DNS 自动更新:后端用域名且加
resolve,当 DNS 记录变更时自动生效(需开启 resolver)
转发请求时的关键 header 设置
proxy_pass 后必须补全请求头,否则后端可能拿不到真实用户信息:
-
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;:兼容多层代理场景 - 建议加上超时控制:
proxy_connect_timeout 5s;、proxy_read_timeout 10s;等,防止单个慢请求拖垮整体











