负载均衡Nginx分发请求降低单服压力
当网站流量上涨,单台服务器撑不住高并发时,最常见也最稳妥的解决方式就是加机器、然后用 Nginx 做负载均衡。
本文从零开始,教你用 Nginx 的 upstream 模块把请求分发到多台后端服务器上,让压力分散开,单服不再扛全部流量。
准备工作:你需要确认的两件事
在动手配置之前,先确保以下条件已满足:
- Nginx 已安装。无论是通过 apt、yum 还是宝塔面板,只要服务器上有 Nginx 就行。未安装的话先执行
sudo apt install nginx(Debian/Ubuntu)或sudo yum install nginx(CentOS)。 - 至少两台后端服务器可以接收请求。这两台可以是同服务器不同端口(如 8081、8082),也可以是不同 IP 的真实机器。它们都要能正常响应 HTTP 请求(比如运行着 Apache、Node.js 或另一份 Nginx)。
如果只测试不生产,推荐用同一台服务器上的两个不同端口模拟多后端,简单又安全。
核心步骤:配置 upstream 并修改 server 块
Nginx 的负载均衡靠 upstream 指令定义后端服务器组,然后在 server 或 location 块里用 proxy_pass 把请求转发给这个组。
1. 找到并编辑 Nginx 配置文件
常用路径是 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/ 下的某个文件。
如果通过面板管理,一般在“网站设置”里能找到“配置文件”编辑入口。
2. 定义 upstream 组
在 http 块内部(和 server 块同级)添加如下内容:
upstream backend {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
这里 backend 是自定义名称,后面会用到。
每个 server 后面跟后端地址和端口,可以加权重:server 127.0.0.1:8081 weight=3; 代表这台机器承担 3 倍请求量。
3. 配置 server 块使用 upstream
找到你想代理的 server 块(比如监听 80 端口的那个),在 location / 或具体路径下加入:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
}
}
关键行是 proxy_pass http://backend;,这里的 backend 就是刚才定义的 upstream 名称。
4. 检查语法并重新加载 Nginx
保存文件后执行:
sudo nginx -t
如果返回 syntax is ok 和 test is successful,说明配置文件没问题。
然后执行:
sudo systemctl reload nginx
(或 service nginx reload)让配置生效。
避坑指南:新手最容易踩的三个坑
坑一:upstream 名称拼写错误或重复
upstream 名称是自定义字符串,但要和 proxy_pass 里的名称完全一致。
混淆大小写、多打空格都会导致 502 Bad Gateway。
坑二:后端服务器没有正常启动
即使 Nginx 配置完全正确,如果 127.0.0.1:8081 没有服务监听,访问时同样会报 502。
建议先用 curl 测试后端是否可用:
curl http://127.0.0.1:8081
如果能返回正常页面,说明后端没问题。
坑三:忘记保留真实客户端 IP
默认情况下 Nginx 转发请求时后端只能看到 Nginx 自己的 IP。
如果业务需要记录真实访问者 IP,必须添加上面配置里的 proxy_set_header 字段。
否则日志分析、安全功能可能会受影响。
效果验证:怎么看请求真的分发到了多台后端?
方法一:观察后端日志
分别登录两台后端服务器,查看各自的访问日志(如 Apache 的 access.log)。
连续刷新几次前端页面,如果两台后端日志里都出现相同来源的请求,说明负载均衡生效了。
方法二:在不同后端放不同标识文件
在 8081 端口的站点根目录放一个 test.html 内容为 Server 1,在 8082 放内容为 Server 2。
然后访问 Nginx 代理的地址,每次刷新返回的内容会交替变化(默认轮询算法)。
方法三:使用查看响应头
有些后端框架会在响应头里加 X-Backend-Server 标记,用浏览器开发者工具或 curl -I 就能看到请求被分配到了哪台机器。
高频问题解答
Q:Nginx 负载均衡支持哪些算法?
A:最常用的三种:
- 轮询(默认):请求按顺序分配到各台后端,权重越高机会越多。
- ip_hash:根据客户端 IP 哈希决定后端,同一 IP 始终访问同一台机器,适合需要保持 session 的场景。
- least_conn:把请求发给当前连接数最少的那台后端。
配置时在 upstream 块内添加 ip_hash; 或 least_conn; 即可。
Q:如果一台后端挂了,Nginx 会停止往它发请求吗?
A:默认 Nginx 会把请求转发到已失效的后端,导致 502。建议在 upstream 中添加 server ... max_fails=3 fail_timeout=30s;,连续失败 3 次后会被认为宕机,30 秒内不再尝试。
Q:我想动态增删后端,必须重启 Nginx 吗?
A:基本是。修改配置文件后需要 reload 才能生效,不会中断已有连接。如果希望不停机动态调整,可以考虑商业版 Nginx Plus 或 upstream 配合 Consul 等工具。
总结
通过 Nginx 的 upstream + proxy_pass 组合,你能轻松将流量分发到多台后端服务器,降低单服压力。
核心步骤只有三步:定义 upstream、修改 location 的 proxy_pass、reload Nginx。
加上后面的避坑和验证方法,零基础用户也能快速上手。
后续如果需要更高级的算法或健康检查,可以在此基础上继续扩展。