nginx轮询负载均衡需在location中用proxy_set_header显式透传自定义请求头,如x-app-version、x-request-id等,并保留host、x-real-ip、x-forwarded-for等关键头,配置后须nginx -t校验并reload生效。

配置 Nginx 轮询负载均衡时,若需将自定义请求头(如 X-App-Version、X-Request-ID 或业务特定 Header)透传给后端服务,关键在于在 location 块中使用 proxy_set_header 显式设置,而不是依赖默认行为——Nginx 默认不会转发所有客户端请求头,部分会被自动过滤或覆盖。
确保 upstream 和 proxy_pass 基础结构正确
轮询本身由 upstream 块自动启用,无需额外指令。但转发自定义 Header 的前提是代理链路完整且可写:
-
upstream必须定义在http { }块内,名称(如backend)要与proxy_pass http://backend;中的名称严格一致 -
proxy_pass的值必须以http://name/形式书写(末尾斜杠影响路径重写,建议保留) - 不要把
upstream写在server或location里,否则配置会报错
添加自定义请求头的两种常用方式
在对应 location 块中,用 proxy_set_header 设置 Header。支持静态值和变量组合:
- 直接写死值:
proxy_set_header X-App-Version "2.5.1"; - 引用 Nginx 内置变量:
proxy_set_header X-Request-ID $request_id;(需先启用random_index on;或使用ngx_http_core_module提供的$request_id,通常已内置) - 拼接客户端头与固定前缀:
proxy_set_header X-Forwarded-User "app-$http_x_user_id";($http_*变量自动转小写并替换连字符为下划线)
注意保留关键原始请求头
很多自定义逻辑依赖原始上下文,仅加新 Header 不够,还需显式保留几个基础头,否则后端可能收不到真实信息:
-
proxy_set_header Host $host;—— 否则后端收到的是 upstream 名称(如backend),不是原始域名 -
proxy_set_header X-Real-IP $remote_addr;—— 获取客户端真实 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 支持多层代理追加 IP 链 - 若后端校验
Authorization或Cookie,它们默认会被透传,无需额外设置
验证与生效步骤
改完配置不能直接 reload,要逐项确认:
- 运行
nginx -t检查语法,特别留意proxy_set_header是否拼写错误(比如写成proxy_header_set就静默失效) - 确认后端服务能正常接收并打印这些 Header(例如用
curl -H "X-App-Version: 3.0" http://nginx-proxy/测试) - 执行
nginx -s reload生效,不中断现有连接











