Nginx生成request_id并传递给后端服务
文章目录
Nginx生成request_id并传递给后端服务及proxy_set_header生效范围问题
Nginx 生成 request_id 并传递给后端
说明
- 程序定位问题时,经常遇到 Nginx 日志和后端应用程序日志,也会出现一个请求后端应用打印多条日志不方便对应请求的情况。
- 使用 $request_id 变量可以使 nginx 在接收到请求后生成一个字符串。
- 可以将此变量增加到 nginx access log 配置中,使 nginx 日志能够记录当前请求日志对应的 request_id。
- 可以将此变量增加到 proxy_header 中,这样后端服务可以通过解析这个 header,打印这个 nginx 生成的随机字符串,从而实现对应。
配置
-
nginx access log 增加 request_id
-
增加如下打印变量配置
1
"request_id":"$request_id"
-
access log 完整配置如下
1
log_format json_log escape=json '{"log_time":"$time_iso8601","remote_addr":"$remote_addr","status":"$status","request":"$request","req_body":"$request_body","ip_list":"$proxy_add_x_forwarded_for","upstream":"$upstream_addr","upstream_response_time":"$upstream_response_time","req_time":"$request_time","req_host":"$scheme://$host:$server_port","req_status":"$request_completion","user_real_ip_by_CDN":"$http_Ali_Cdn_Real_Ip","request_id":"$request_id"}';
-
-
nginx header 配置如下
-
新增如下配置
1 2 3
# x-request-id 部分可根据实际情况配置 # 后端程序通过解析 x-request-id 这个 Header 获取那个随机的请求 id proxy_set_header x-request-id $request_id;
-
验证
- 增加上述配置,并 reload nginx
- nc 拉起 18002 端口的监听
|
|
- nginx location 拦截指定端口请求,转发至 18002 端口,并 reload nginx
|
|
- 请求配置接口
|
|
- 查看 nc 接收到的请求,能正常接收到 x-request-id header
|
|
- 查看日志,正常记录 request_id 变量
|
|
proxy_set_header 配置块生效问题
问题说明
- 日常配置 nginx 时,一般在外层 http 层配置所有 server 通用的 header 信息,额外定制情况在内部 server 层配置定制信息
- 配置 request_id 时,仅单个 server 下需配置 request_id,就在 server 配置块下增加 proxy_set_header x-request-id $request_id;
- 重载配置后,出现 nginx 转发请求进 tomcat 时,tomcat 响应 400 的情况,经排查是由于进入 tomcat 的请求没有传输 Host 这个 Header 导致的
问题定位及处理
- 通过 nc 验证后发现,如果 server 层增加 proxy_set_header 的配置后,server 层配置的 proxy_set_header 会全部生效
- 官方文档说明:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header
- Allows redefining or appending fields to the request header passed to the proxied server. The value can contain text, variables, and their combinations. These directives are inherited from the previous configuration level if and only if there are no proxy_set_header directives defined on the current level.
- 就实际生效范围而言,proxy_set_header 相当于配置块生效。当 server 层配置 proxy_set_header 后,会覆盖掉 http 层所有的 proxy_set_header 配置,如果要单独配置 server 层次的 proxy_set_header,需在 proxy_set_header 层配置的所有的 proxy_set_header。
文章作者 Xiang
上次更新 2025-08-13