API聚合中转站负载均衡配置实战:Nginx分流与健康检查
1. 你需要做哪些准备工作
在动手配置 API聚合中转站的负载均衡之前,请确认以下条件已满足:
- 你至少有 两台服务器或两个API节点(可以是同一台机器不同端口模拟)。
- 任一台服务器上安装了 Nginx(版本建议 1.18+),如果还没装,用
yum install nginx(CentOS)或apt install nginx(Ubuntu)。 - 知道每个API节点的地址和端口(例如
http://192.168.1.10:8080和http://192.168.1.11:8080)。 - 开放了Nginx的监听端口(默认80)以及后端节点的端口。
如果你用的是宝塔面板,也可以直接在面板里操作,但本文以原生Nginx配置为例,更通用。
2. 编辑Nginx配置文件,实现分流与健康检查
Nginx的负载均衡核心是 upstream 模块,配合 proxy_pass 指向它即可。
下面给出一个标准的配置片段,假设你的API聚合中转站入口域名为 api.example.com。
2.1 创建 upstream 组
打开Nginx配置文件(通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf),在 server 块 外部 添加:
upstream api_backend {
# 默认轮询策略,按请求依次分发
server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=1 max_fails=3 fail_timeout=30s;
# 可选:添加健康检查,需要 ngx_http_upstream_check_module(编译安装,或使用商业版)
# 如果未开启健康检查,建议 keepalive 连接池加速
keepalive 64;
}
说明:
weight=3:权重,数值越大分配请求越多。max_fails=3:连续失败3次后标记为不可用。fail_timeout=30s:标记不可用后等待30秒再重新尝试。keepalive:保持连接池,减少握手开销。
2.2 配置 server 块转发请求
在 server 块内,添加 location 规则:
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://api_backend;
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;
# 超时设置,防止某个后端卡死
proxy_connect_timeout 5s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}
如果只对特定路径(如 /api/)做分发,可修改 location /api/。
2.3 检查并重载Nginx
nginx -t # 检查语法
systemctl reload nginx # 或 nginx -s reload
没有报错说明配置生效。
3. 避坑指南:这些细节容易导致负载均衡失效
- 后端节点必须返回正确的状态码:如果后端API无响应或返回非200,Nginx会把请求继续转发给其他节点。但如果节点一直返回500但Nginx认为连接成功,就仍会分发。建议后端配合
/health端点返回200。 - keepalive 与健康检查冲突:默认upstream模块不支持被动健康检查,上面的
max_fails只能检测连接失败或超时。若需要主动探测,可考虑集成nginx_upstream_check_module(编译安装)或使用商业版OpenResty。 - 权重分配不均:如果某个节点性能较差,但权重过高,会导致该节点过载。建议先测试各节点平响应对再设置权重。
- 日志没有显示来源:记得添加
proxy_set_header X-Real-IP等 header,否则后端无法获取真实客户端IP。
4. 如何验证分流是否正常
4.1 通过日志查看
在Nginx http 块中配置日志格式(已有则忽略):
log_format upstream '$remote_addr - $upstream_addr - $request - $status';
access_log /var/log/nginx/access.log upstream;
然后发起几次请求,查看日志:
tail -f /var/log/nginx/access.log
你会看到类似 192.168.1.100 - 192.168.1.10:8080 - GET /api/v1/data - 200,说明发到了第一个节点;
下次请求可能变成第二个节点。
4.2 编写简易测试脚本
使用 curl 连续请求100次,统计每个节点接收的次数:
for i in $(seq 1 100); do curl -s -o /dev/null http://api.example.com/api/health; done
# 然后检查后端节点访问日志确认次数
如果权重为3:1,理想比例大约是75:25。
4.3 模拟节点故障
临时停掉其中一个后端服务:
systemctl stop your-api-service # 或直接kill端口进程
再发起请求,Nginx应自动把流量全部转发到正常节点,访问日志里 upstream_addr 只显示健康节点。
等待 fail_timeout 过后,Nginx会尝试恢复连接。
5. 常见问题解答
Q:配置后发现访问全是502怎么回事?
A:最常见原因是后端节点没跑起来或端口没放行。检查 systemctl status nginx 和 netstat -tlnp | grep 8080。也可以尝试直接访问后端地址确认。
Q:Nginx不轮询,总是发到一个节点?
A:如果用了 ip_hash 或 sticky 会话保持,请求会固定发到同一节点。检查 upstream 里是否加了相关指令。本教程默认轮询。
Q:负载均衡之后,API聚合节点如何获取真实IP?
A:确保 proxy_set_header 包含 X-Real-IP 和 X-Forwarded-For,后端程序读取这些头即可。
Q:如何实现更精细的健康检查?
A:可以结合第三方模块(如 ngx_healthcheck_module)或使用 nginx-plus 商业版;最简单的方式是后端提供一个 /health 接口,然后配合 http_healthcheck_module 或使用独立的探活工具(如 consul)。
6. 写在最后
完成 API聚合中转站的负载均衡配置后,你的系统可以平滑分发请求、自动容错,访问体验和稳定性都会明显提升。
如果遇到异常,优先回顾 避坑指南 中的细节,并检查Nginx错误日志 /var/log/nginx/error.log。
你也可以继续在文章末尾的标签中找到更多相关教程来拓展学习。