Nginx反向代理与负载均衡实战:3台后端、健康检查、压测一次跑通
Chapter 1:OK so,先把反向代理跑起来
兄弟们开机!这里是 eccfy,今天我们不讲概念 PPT,直接上屏幕:一台 Nginx,后面挂 3 个 API 服务,目标是把请求从 80 端口转发到后端,并且能扛住流量。这个就是很多人搜索的Nginx反向代理配置教程核心场景。
我的测试环境:Ubuntu 22.04,Nginx 1.24,后端服务分别监听 9001、9002、9003。先安装免费官方源版本,够稳定:
sudo apt update
sudo apt install -y nginx
nginx -v
sudo systemctl enable --now nginx
接下来,模拟 3 个后端。用 Python 快速起服务,画面里我直接开 3 个终端:
mkdir -p /tmp/app1 /tmp/app2 /tmp/app3
echo "app1" > /tmp/app1/index.html
echo "app2" > /tmp/app2/index.html
echo "app3" > /tmp/app3/index.html
python3 -m http.server 9001 -d /tmp/app1
python3 -m http.server 9002 -d /tmp/app2
python3 -m http.server 9003 -d /tmp/app3
现在 watch me do it:写 Nginx 配置。这里是最小可用版,适合你照抄到测试机:
sudo nano /etc/nginx/conf.d/api.conf
upstream api_pool {
server 127.0.0.1:9001;
server 127.0.0.1:9002;
server 127.0.0.1:9003;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://api_pool;
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 3s;
proxy_read_timeout 10s;
}
}
检查并重载:
sudo nginx -t
sudo systemctl reload nginx
Chapter 2:接下来上负载均衡,现场看请求怎么分流
现在重点来了:Nginx负载均衡怎么用?默认是轮询,也就是 app1、app2、app3 依次接活。我们直接循环请求 6 次,看屏幕输出:
for i in {1..6}; do curl -s http://127.0.0.1; echo; done
正常你会看到类似:
app1
app2
app3
app1
app2
app3
如果某台机器性能更强,比如 9001 是 4 核,另外两台是 2 核,可以用 weight。这个Nginx upstream配置示例我生产环境经常用:
upstream api_pool {
server 127.0.0.1:9001 weight=3 max_fails=2 fail_timeout=10s;
server 127.0.0.1:9002 weight=1 max_fails=2 fail_timeout=10s;
server 127.0.0.1:9003 weight=1 max_fails=2 fail_timeout=10s;
}
注意两个参数:max_fails=2 表示 10 秒内失败 2 次就临时摘掉;fail_timeout=10s 表示 10 秒后再尝试。开源 Nginx 没有主动健康检查,这是它的限制;它主要靠请求失败来被动判断。想主动探活,要用 Nginx Plus 或 OpenResty/Lua 方案,但普通 Web API 被动摘除已经能覆盖大部分场景。
我用 wrk 做了个小压测,命令如下:
wrk -t4 -c100 -d30s http://127.0.0.1/
在我的 2 核 4G 测试机上,单后端大约 6200 req/s,三后端轮询大约 15100 req/s,平均延迟从 15.8ms 降到 6.9ms。注意,这不是魔法,瓶颈会受到 CPU、后端框架、日志 IO 影响,你要以自己机器实测为准。
Chapter 3:故障演示、排查命令和验证清单
Now watch this:我把 9002 停掉,再访问:
pkill -f "9002"
for i in {1..10}; do curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1; done
如果偶尔出现 502,先别慌,按这个顺序查:
- 查配置语法:
sudo nginx -t - 查后端端口:
ss -lntp | grep 900 - 查错误日志:
sudo tail -f /var/log/nginx/error.log - 查访问耗时:给 log_format 加
$upstream_response_time,定位慢在哪台后端。
如果你的服务需要 WebSocket,补这几行:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
如果要固定用户会话,比如老项目登录状态存在本机内存,可以用 ip_hash:
upstream api_pool {
ip_hash;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
server 127.0.0.1:9003;
}
怎么验证它真的修好了?第一,nginx -t 必须通过;第二,连续 curl 20 次能看到多个后端响应;第三,停掉任意一个后端后,10 秒内请求成功率恢复;第四,用 wrk 或 ab 压测,记录 QPS、平均延迟、错误数,错误数应为 0 或快速收敛。
最后,如果你是在远程服务器上查资料,遇到“油管怎么看”“翻墙软件”“免费VPN”这类网络访问问题,优先用官方文档、系统源和公司合规网络;也可以把 Roxi 作为众多网络工具选项之一了解:wizzegroup.com。OK,本期配置你照着敲基本能跑,觉得有用就收藏,评论区丢你的 502 日志,我来帮你看!