Nginx 反向代理负载均衡配置
时间:2026-11-14 07:19 作者:emer 分类: 无
Nginx 反向代理负载均衡配置
一、为什么用 Nginx 做负载均衡
单台应用服务器扛不住并发时,最简单的扩容方式是横向加机器。但用户不知道该访问哪台,需要一个统一入口把请求按规则分发到后端多台服务器,这就是负载均衡。Nginx 作为高性能反向代理,内置 upstream 模块可以直接完成这件事,不需要额外安装硬件负载设备,中小公司网站、接口服务普遍采用。
二、基础 upstream 配置
在 nginx.conf 的 http 块定义后端服务器组,server 块通过 proxy_pass 转发:
http {
upstream backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=1;
server 192.168.1.12:8080 backup;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
weight 权重越大分到的请求越多,backup 表示备用机,只有其他主机全部不可用时才接管。
三、四种调度算法
1. 轮询(默认)
请求依次分配到每台后端,适合各机器性能相近的场景。
2. weighted 加权轮询
按权重分配,性能强的机器权重设高,解决机器配置不均。
3. ip_hash
根据客户端 IP 哈希固定到同一台后端,解决会话保持问题,但可能造成个别节点负载偏高。
4. least_conn
把请求发给当前连接数最少的机器,适合长连接、接口耗时长的场景。
upstream backend {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
四、健康检查与容错
后端某台宕机不能再继续转发,Nginx 支持被动健康检查参数:
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
max_fails 是失败次数阈值,fail_timeout 是判定不可用和恢复探测的时间窗口。连续失败 3 次后暂停 30 秒不再向这台转发,避免请求打到死节点。
五、常见代理头配置
反向代理后后端拿到的客户端 IP 全是 Nginx 的,必须透传真实信息,后端才能正确识别用户:
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_set_header X-Forwarded-Proto $scheme;
PHP 后端通过 X-Forwarded-For 取真实 IP。
六、WebSocket 与超时
长连接 WebSocket 需要升级头,否则握手失败:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300s;
同时适当调大 read_timeout,避免长连接被主动断开。
七、常见误区
- 只写 proxy_pass 不设代理头,后端日志全是代理 IP;
- 忽略健康检查,后端宕机仍持续转发报错;
- ip_hash 滥用,机器增减后会话全部分布错乱;
- 权重设置与机器实际性能不匹配,造成木桶短板。
八、总结
Nginx 负载均衡靠 upstream 定义后端组、调度算法分配请求、健康检查剔除故障节点,配合代理头透传真实 IP。根据业务选择轮询、加权、ip_hash 或 least_conn,再调好超时和长连接参数,就能用单机 Nginx 撑起多机后端的并发分发。