nginx通过upstream模块实现负载均衡,本质是定义http块内的后端服务器池,由proxy_pass转发请求;默认轮询策略无需额外参数,需确保upstream位置正确、名称合规、server行显式带端口,并配合健康检查与反向代理头设置。

Nginx 通过 upstream 实现负载均衡,本质是定义一个后端服务器池,再由 proxy_pass 将请求转发过去。整个过程不依赖额外模块,只要启用 ngx_http_upstream_module(默认已编译进标准版 Nginx),就能直接使用。
关键点在于:upstream 块必须放在 http 块内;proxy_pass 必须指向该 upstream 名称;名称只能含字母、数字和短横线,不能有下划线或空格。
upstream 块的基本写法
在 /etc/nginx/nginx.conf 的 http { ... } 区域中添加:
upstream my_backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
- 每行
server指定一台后端地址,必须带端口(如:8080),避免因默认端口误判导致转发失败 - 不加任何参数时,默认采用轮询(round-robin)策略,请求依次分发到各节点
- 名称
my_backend后续会被proxy_pass http://my_backend;引用,注意协议前缀http://不可省略
对应的反向代理配置
在某个 server 块里,用 location 匹配请求并转发:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://my_backend;
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 1s;
proxy_read_timeout 3s;
}
}
-
proxy_pass后面的斜杠会影响路径重写:proxy_pass http://my_backend;会透传原始 URI;若写成proxy_pass http://my_backend/;,则会剥离 location 路径前缀 -
proxy_set_header至少保留Host、X-Real-IP、X-Forwarded-For,否则后端无法识别真实客户端信息 -
proxy_connect_timeout和proxy_read_timeout建议显式设置,防止慢后端拖垮整体响应
支持的常见调度策略
只需在 upstream 块开头添加一行指令即可切换算法:
-
加权轮询(适配不同性能的机器)
upstream my_backend { server 192.168.1.10:8080 weight=3; server 192.168.1.11:8080 weight=1; } -
IP 哈希(保证同一 IP 总访问同一后端,适合有状态服务)
upstream my_backend { ip_hash; server 192.168.1.10:8080; server 192.168.1.11:8080; } -
最少连接数(适合长连接或响应时间差异大的场景)
upstream my_backend { least_conn; server 192.168.1.10:8080; server 192.168.1.11:8080; }
验证与上线流程
- 修改完配置后,先运行
sudo nginx -t检查语法和文件引用是否合法 - 若提示
syntax is ok且test is successful,再执行sudo systemctl reload nginx生效 - 可通过反复刷新页面并查看各后端 access 日志,确认请求是否按预期分发
容错与健康检查基础支持
Nginx 自带被动健康检查,靠 max_fails 和 fail_timeout 控制:
upstream my_backend {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 backup; # 仅当其他全不可用时启用
}
-
max_fails=3表示连续 3 次失败(如超时或拒绝连接)即标记为不可用 -
fail_timeout=30s表示被标记后,30 秒内不再调度,之后自动尝试恢复 -
backup标记的服务器不会参与常规轮询,只作兜底
网络连通性是前提:Nginx 所在机器必须能 telnet 或 curl 通所有 server 地址和端口,防火墙、SELinux、后端服务监听范围都要检查到位。











