nginx实现集群请求分发的核心是配置upstream定义后端集群,并在server块中用proxy_pass转发请求;需设置proxy_set_header传递真实客户端信息,配合权重、健康检查及负载算法实现高效路由。

利用 Nginx 实现集群中的请求路由分发,核心是将其作为反向代理和负载均衡器,将客户端请求按策略分发到后端多个应用服务器。关键在于合理配置 upstream 块定义服务集群,并在 server 块中通过 proxy_pass 将请求转发过去。
定义后端服务集群(upstream)
在 http 块中声明一个 upstream,列出所有后端节点及其健康状态、权重等参数:
- 每个
server行指定一个后端地址(支持 IP:端口 或域名),可附加参数如weight=3(加权轮询)、max_fails=2 fail_timeout=30s(失败重试机制)、backup(备用节点)或down(临时下线) - 支持多种负载均衡算法:默认轮询(round-robin)、
ip_hash(基于客户端 IP 的会话保持)、least_conn(最少连接数)、hash $request_uri consistent(一致性哈希)等 - 示例:
upstream app_cluster {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 backup;
}
配置反向代理转发规则
在 server 块中使用 location 匹配请求路径,并通过 proxy_pass 指向 upstream 名称:
-
proxy_pass http://app_cluster;—— 注意末尾斜杠:不带斜杠表示完整路径透传;带斜杠(如proxy_pass http://app_cluster/;)会截掉匹配的前缀再转发 - 必须设置关键代理头,确保后端能获取真实客户端信息:
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_buffering on;proxy_connect_timeout 5s;proxy_send_timeout 30s;proxy_read_timeout 30s;
实现动态路由与条件分发
除基础负载均衡外,Nginx 可结合变量与条件判断做更精细的路由:
- 按请求头、参数或 Cookie 分流:例如用
map指令提取灰度标识,再在upstream中引用变量选择不同集群 - 按 URL 路径分流:多个
location块分别指向不同 upstream(如 API 接口走api_cluster,静态资源走static_cluster) - 结合
if(慎用)或第三方模块(如nginx-upstream-check-module)实现主动健康检查与自动剔除故障节点
验证与可观测性增强
上线前需确认分发逻辑正确,运行中需持续监控效果:
- 用
curl -H "Host: example.com" http://nginx-ip/测试是否正常转发;检查响应头中的X-Upstream-Addr(可自定义添加)识别实际处理节点 - 开启 Nginx 状态页(需编译含
ngx_http_stub_status_module)或接入 Prometheus +nginx-vts-exporter,监控各 upstream 的请求量、失败率、连接数 - 日志中记录上游地址与响应时间:
log_format upstream_log '$remote_addr - $remote_user [$time_local] "$request" '<br> '$status $body_bytes_sent "$http_referer" "$http_user_agent" '<br> '$upstream_addr $upstream_response_time $request_time';











