nginx作为微服务网关前置负载均衡器,需在http块中定义语义化upstream集群,配置max_fails与fail_timeout实现被动健康检查,proxy_pass透传uri及x-forwarded-*等关键头部,并按需选用ip_hash、least_conn等调度策略。

Nginx 作为微服务网关的前置负载均衡器,核心目标是稳定、高效地将外部流量分发到多个后端网关实例(如 Spring Cloud Gateway、Kong 或自研网关),同时兼顾健康探测、会话一致性与故障转移。配置不复杂,但关键细节容易忽略。
明确 upstream 定义位置与结构
负载均衡配置必须放在 http 块内,使用 upstream 指令定义网关集群组。名称建议语义化(如 gateway_cluster),避免用默认名 backend。每个 server 行对应一个网关实例地址,支持 IP+端口、域名或 Unix socket:
upstream gateway_cluster {
server 10.0.2.10:8080 max_fails=3 fail_timeout=30s;
server 10.0.2.11:8080 max_fails=3 fail_timeout=30s;
server 10.0.2.12:8080 max_fails=3 fail_timeout=30s;
}
-
max_fails=3 fail_timeout=30s是必备项:连续 3 次失败(如超时或 5xx)后,该节点被标记为不可用,30 秒内不再转发请求 - 不写
weight时默认为 1,即纯轮询;若网关实例性能差异大(如部分跑在高配宿主机),可显式加权,例如server 10.0.2.10:8080 weight=2;
反向代理需适配网关特性
微服务网关通常处理动态路由、JWT 验证、限流等逻辑,Nginx 的 proxy_pass 必须保留原始 URI 结构,并透传关键头部:
server {
listen 443 ssl;
server_name api.example.com;
location / {
proxy_pass http://gateway_cluster;
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 X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
# 防止网关因长连接空闲超时断连
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_connect_timeout 5;
# 启用错误时自动重试其他节点(非幂等操作慎用)
proxy_next_upstream error timeout http_500 http_502 http_503;
}
}
-
proxy_http_version 1.1和X-Forwarded-*头部对网关做路径重写、协议识别、IP 日志至关重要 -
proxy_next_upstream明确列出可重试的状态码,避免把 400/401 这类客户端错误也重试
根据业务需求选择调度策略
轮询适合大多数无状态网关场景,但若需特定行为,可替换 upstream 内第一行指令:
-
保持会话粘性(如网关自身缓存了用户路由规则):在
upstream块开头加ip_hash; -
按请求负载分配(网关实例内存/CPU 使用率波动大):改用
least_conn; -
按响应速度调度(要求低延迟):Nginx Plus 支持
least_time header,开源版可用least_conn近似替代
健康检查不能只靠被动机制
Nginx 默认仅在请求失败时被动摘除节点。生产环境建议配合主动健康检查(需 Nginx Plus 或编译 nginx-plus-module-healthcheck),或由网关自身暴露 /actuator/health 端点,再通过外部巡检脚本 + down/up API 动态管理节点状态。
不复杂但容易忽略。











