Nginx负载均衡分发请求策略配置实操,新手也能快速上手
为什么需要 Nginx 负载均衡分发请求策略?
当你有多台后端服务器(比如两台 Web 应用服务器)时,Nginx 充当“交通指挥员”,把用户请求均匀地分给这些服务器,避免某一台过载崩溃。负载均衡分发请求策略决定了 Nginx 用什么样的规则来分配流量。
常见的策略有轮询、权重、IP 哈希等。
本文会手把手教你配置它们,让你从零开始就能驾驭。
准备工作:确认 Nginx 已安装并知道配置目录
在开始之前,确保你的服务器上安装了 Nginx(一般版本 1.18 以上均可)。
如果还没装,用以下命令安装(以 CentOS/Ubuntu 为例):
# CentOS
sudo yum install nginx -y
# Ubuntu
sudo apt update && sudo apt install nginx -y
安装后,Nginx 的配置目录一般在 /etc/nginx/,主配置文件是 nginx.conf。
建议先备份原始文件:
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
核心步骤:配置 upstream 和后端服务器组
Nginx 的负载均衡通过 upstream 模块实现。
你需要先定义一个服务器组,然后在 server 块中用 proxy_pass 把请求转发到这个组。
1. 编辑配置文件
用你熟悉的编辑器打开 /etc/nginx/nginx.conf,或者在 /etc/nginx/conf.d/ 下新建一个 .conf 文件(推荐单独文件便于管理)。
这里我们直接修改主配置文件做演示:
sudo vim /etc/nginx/nginx.conf
2. 在 http 块中添加上游服务器组
找到 http { } 部分,在其中添加如下内容(假设你有两台后端服务器 192.168.1.10 和 192.168.1.11,端口都是 8080):
upstream backend_servers {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
3. 配置代理转发
在 server 块(监听 80 端口)的 location / 中,写入:
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
4. 检查配置并重启
sudo nginx -t # 检查配置文件语法
sudo systemctl reload nginx # 重新加载配置
如果没有报错,负载均衡已经工作了。
默认策略是轮询,即依次把请求分给每台服务器。
调整分发策略:权重、IP 哈希等
根据需要,你可以修改 upstream 块中的指令来改变分发规则。
权重策略
如果某个服务器性能更强,可以给它更高的权重:
upstream backend_servers {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=1;
}
此时 10 号服务器每收到 3 个请求,11 号才会收到 1 个。
IP 哈希策略
如果需要保持会话(比如用户登录后一直访问同一台服务器),用 IP 哈希:
upstream backend_servers {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
Nginx 会根据客户端 IP 计算哈希值,同一 IP 的请求始终发到同一台后端。
最少连接策略
将请求分给当前连接数最少的服务器:
upstream backend_servers {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
避坑指南与高频问题解答
问题1:配置 reload 后没生效?
检查是否路径写错。
使用 sudo nginx -T 可以查看完整配置并检测错误。
另外,如果后端服务器没有启动,Nginx 会返回 502 错误。
问题2:权重 + IP 哈希能一起用吗?
不能。ip_hash 和 least_conn 等指令与 weight 不兼容(weight 在 ip_hash 下会被忽略)。
详细参考 Nginx 官方文档。
问题3:如何做到健康检查?
Nginx 开源版没有内置主动健康检查,但可以用 max_fails 和 fail_timeout 被动标记故障服务器。
例如:
upstream backend_servers {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
}
当某台连续失败 3 次,Nginx 会在 30 秒内不再向其转发请求。
避坑说明:upstream 名称不要与域名冲突
不要使用与真实域名相同的名称(例如 www.example.com),否则可能导致解析异常。
用 backend、app_servers 等描述性名称。
效果验证:看看请求是怎么分发的
你可以用 curl 多次访问 Nginx 地址,然后查看后端服务器的访问日志来确认分发情况。
# 假设 Nginx 监听本地 80 端口
for i in {1..6}; do curl -s http://localhost; done
如果后端服务器的日志(如 /var/log/nginx/access.log 或应用日志)显示 IP 交替出现,说明负载均衡正常工作。
你也可以在配置中给每台后端返回不同内容,通过对比响应体来判断。
如果你正在处理 Nginx 负载均衡分发请求策略,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。