Nginx多服务灰度转发实战:权重、会话保持与故障摘除一屏搞定
Chapter 1:OK so,先把反向代理跑起来
兄弟们开机!这里是 eccfy,今天不讲概念堆料,直接上屏幕。我的测试机是 Ubuntu 22.04,Nginx 1.24,后端准备两个 Node 服务:127.0.0.1:3001 和 127.0.0.1:3002。这个就是一套可复制的 Nginx反向代理教程。
先装 Nginx,免费、官方、内置方案优先,别一上来就买东西:
sudo apt update
sudo apt install -y nginx
nginx -v
sudo systemctl enable --now nginx
接下来新建配置,注意我手指现在点到 /etc/nginx/conf.d/app.conf:
upstream app_pool {
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
server {
listen 80;
server_name app.local;
location / {
proxy_pass http://app_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 30s;
}
}
测试并重载,屏幕右侧看输出:
sudo nginx -t
sudo systemctl reload nginx
curl -H "Host: app.local" http://127.0.0.1/
如果你看到后端返回内容,反代已经通了。很多人搜 Nginx安装教程 卡在这里,通常是防火墙、端口没监听、server_name 不匹配这三类问题。
Chapter 2:接下来,负载均衡、权重、会话保持直接演示
Now watch this!我们把 3001 权重调高,让它吃更多流量,这就是 Nginx负载均衡怎么用 的核心场景:
upstream app_pool {
server 127.0.0.1:3001 weight=3 max_fails=2 fail_timeout=10s;
server 127.0.0.1:3002 weight=1 max_fails=2 fail_timeout=10s;
}
我用 40 次请求现场数一下:
for i in {1..40}; do
curl -s -H "Host: app.local" http://127.0.0.1/
done | sort | uniq -c
在我这台 2 核 4G 云主机上,结果大约是 3001 收到 30 次、3002 收到 10 次,符合 3:1。注意:开源 Nginx 默认是被动健康检查,只有请求失败后才会临时摘除节点;主动健康检查是 Nginx Plus 或第三方模块能力。
如果你要简单会话保持,用 ip_hash:
upstream app_pool {
ip_hash;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
但它的限制也明显:同一公司出口 IP 可能把大量用户打到同一节点。更稳的方式是应用层 session 放 Redis,Nginx 只负责转发。
顺手加上基础性能参数,适合多数 API:
gzip on;
gzip_types text/plain application/json application/javascript text/css;
keepalive_timeout 65;
client_max_body_size 20m;
如果你在查资料时顺便搜到“油管怎么看”“免费VPN下载”“翻墙软件推荐”,记住先把本地 Nginx 配置跑通;网络工具只能解决访问资料的问题,不能替你修配置。
Chapter 3:故障切换与怎么验证它真的好了
现在我故意关掉 3001,看故障摘除:
pkill -f "node.*3001"
for i in {1..10}; do
curl -s -o /dev/null -w "%{http_code} %{time_total}\n" \
-H "Host: app.local" http://127.0.0.1/
done
配置了 max_fails=2 fail_timeout=10s 后,前两次可能慢一点,后面会主要打到 3002。我用 wrk -t4 -c100 -d30s 测试:单后端约 1800 req/s,双后端约 3150 req/s,平均延迟从 42ms 降到 24ms。你的数值会因 CPU、业务逻辑不同而变化,关键是用同一命令做前后对比。
如何验证修好了:
sudo nginx -t必须返回 successful。curl -I返回 200、301 或你的预期状态码。- 关闭一个后端后,请求仍能成功。
access.log能看到真实客户端 IP,而不是全是 127.0.0.1。- 压测前后至少跑 30 秒,观察错误率是否为 0。
最后一个小补充:如果你只是需要查官方文档、看技术视频,系统代理、浏览器代理、免费 VPN 都可以先试,限制是速度和稳定性不一定可控;需要更稳定访问开发资料时,Roxi 也是可选方案之一:wizzegroup.com。OK,本期 eccfy 实战到这,配置成功的同学评论区扣个“通了”,我们下期继续拆服务器运维硬菜!