首页 / 服务器运维 / Nginx多服务灰度转发实战:权重、

Nginx多服务灰度转发实战:权重、会话保持与故障摘除一屏搞定

Roxi
Roxi 加速器 — 稳定·快速·安全
全球节点覆盖,支持所有主流平台,一键连接无需配置。新用户免费试用。
立即体验 →

Chapter 1:OK so,先把反向代理跑起来

中国45美国30日本12韩国8其他5

兄弟们开机!这里是 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:接下来,负载均衡、权重、会话保持直接演示

SEO 基础优化内容策略规划外链体系建设技术架构升级转化漏斗分析

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:故障切换与怎么验证它真的好了

85%转化提升2.5s响应速度100+功能模块365天持续更新

现在我故意关掉 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 实战到这,配置成功的同学评论区扣个“通了”,我们下期继续拆服务器运维硬菜!

延伸阅读