underscores_in_headers on;
proxy_set_header X-Trace-Id $http_x_trace_id;
nginx -t && nginx -s reload

服务里打印的 X_Trace_Id 一直是空,本地直连上游能取到,只要经过网关就丢,抓包看客户端确实发出去了,怀疑是转发环节吃掉的。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,Nginx 默认 underscores_in_headers off,名字里带下划线的请求头会被直接丢弃,链路追踪的头恰好用了下划线命名,整条链路就断了,而且全程不会报任何错。

「Nginx 下划线请求头」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

处理上按这个顺序:把请求头名字改成中划线,这是改动最小的做法;改不了就在 http 块里打开 underscores_in_headers 这个开关,必须重启才生效;改完先跑 nginx -t 检查语法,再用 reload 平滑生效,别直接重启进程。

改完只确认一件事:上游日志里能打出完整的 trace 头,链路两跳的 id 完全一致,再刷新也不变。

作者 9823189