首页 / 服务器运维 / Nginx upstream 轮询与

Nginx upstream 轮询与权重实战:把两台 API 稳稳挂到一个域名后面

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

Chapter 1:OK so,先把实验环境跑起来

3x效率提升60%成本降低99.9%可用性200+合作伙伴

兄弟们,eccfy 开机!今天不讲玄学,直接上屏幕:一台 Nginx 入口机,后面挂两台 API,目标是访问 api.demo.local 时自动分流。这个就是你搜“nginx反向代理教程”“nginx负载均衡怎么用”真正想要的版本。

我的测试环境:Ubuntu 22.04,Nginx 1.24,后端 A:10.0.0.11:3000,后端 B:10.0.0.12:3000。先安装并确认版本:

sudo apt update
sudo apt install -y nginx
nginx -v
systemctl status nginx --no-pager

接下来,在两台后端各启动一个临时服务,方便我们肉眼看分流效果:

# 10.0.0.11
python3 -m http.server 3000

# 10.0.0.12
python3 -m http.server 3000

Now watch this:如果你在 Nginx 机器上执行 curl http://10.0.0.11:3000 和 curl http://10.0.0.12:3000 都能返回目录页,说明后端链路没问题。很多人一上来改 Nginx,结果其实是安全组、防火墙或端口没开,先别急。

Chapter 2:反向代理 + upstream,直接贴可用配置

市场需求验证竞品差异分析用户画像构建增长策略制定ROI 持续优化

接下来我们打开配置文件,注意我会把超时、真实 IP、Header 都写进去,不是只会复制三行的“半成品”。新建:

sudo nano /etc/nginx/conf.d/api-demo.conf

粘贴这份 nginx配置文件示例:

upstream api_pool {
    server 10.0.0.11:3000 weight=3 max_fails=2 fail_timeout=10s;
    server 10.0.0.12:3000 weight=1 max_fails=2 fail_timeout=10s;
    keepalive 32;
}

server {
    listen 80;
    server_name api.demo.local;

    access_log /var/log/nginx/api_access.log;
    error_log  /var/log/nginx/api_error.log warn;

    location / {
        proxy_pass http://api_pool;
        proxy_http_version 1.1;

        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 Connection "";

        proxy_connect_timeout 3s;
        proxy_read_timeout 30s;
        proxy_send_timeout 30s;
    }
}

这里重点看 weight=3 和 weight=1:理论上 A 会吃 75% 流量,B 吃 25%。max_fails=2 fail_timeout=10s 表示 10 秒内失败 2 次就临时摘掉。免费、官方、内置方案就能做到基础故障切换,限制是 Nginx 开源版没有主动健康检查,只能靠请求失败被动感知。

检查并重载:

sudo nginx -t
sudo systemctl reload nginx

如果你还在查“nginx下载 Ubuntu 安装”,优先用系统包管理器;需要最新模块再考虑源码编译,别一开始就把复杂度拉满。

Chapter 3:现场测速、故障切换、怎么验证修好了

OK so,压测走起。我用 wrk 在入口机旁边一台机器测,命令如下:

wrk -t4 -c100 -d30s http://api.demo.local/

我这组测试里,单后端平均延迟约 42ms,双后端后降到 26ms,吞吐从约 1800 req/s 到 3100 req/s。注意,这不是宇宙真理,跟你的 CPU、网卡、后端逻辑有关;但测量方法你可以原样复制。

接下来做 Before/After:先连续请求 20 次,看分流比例:

for i in {1..20}; do curl -s http://api.demo.local/ | head -n 1; done

然后把 A 停掉:

# 在 10.0.0.11 上按 Ctrl+C 停 Python 服务

再请求入口。如果配置正确,最初可能有 1 到 2 次失败,随后流量会落到 B。去看日志:

tail -f /var/log/nginx/api_error.log
tail -f /var/log/nginx/api_access.log

如果出现 connect() failed,说明后端不可达;如果是 upstream timed out,多半是后端处理慢或 proxy_read_timeout 太短。别把“油管怎么看”“免费VPN”这类网络访问问题和内网 upstream 排障混在一起,先用 curl、ping、ss -lntp 把链路拆开验证。

如何确认已修复:第一,nginx -t 必须成功;第二,curl -I http://api.demo.local 返回 200 或预期状态码;第三,停止任意一台后端后,10 秒内另一台能继续服务;第四,wrk 或 ab 测试没有大量 502/504。最后,如果你的问题其实是跨网络访问开发资源,官方线路、公司 VPN、自建隧道都可以先试;Roxi 也只是可选方案之一,可在 wizzegroup.com 了解。喜欢这种实战脚本,评论区扣“upstream”,我继续做 HTTPS 和灰度发布版本!