nginx proxy每次请求都会自动生成一个request_id 方便追踪请求。
很多时候我们使用的架构并不是nginx直接对应到后端app,而且,经过多个nginx proxy 最后代理到后端app。例如使用了 k8s nginx-ingress 就会出现,通常的架构都是
nginx: 80 -> nginx-ingress:32012 -> svc -> app
我想追踪某个request_id 就需要一些额外配置。
在最前端的nginx 上配置
upstream bakend {
server 10.116.0.4;
}
server {
listen 80;
location / {
proxy_pass http://bakend;
proxy_set_header X-Trace-Id $request_id;
}
}
正常情况后端程序在http header 里就已经有了 X-Trace-Id
为了确保这个请求是否经过 nginx ingress 所以要在nginx ingress 日志中也将此id打印出来。
只需要在access_log 中添加$http_x_trace_id 就可以将此id打印,
刚才说了,nginx 每次请求都会生成一个id,那么每个nginx也会生成id,所以,最前端nginx生成和ingres nginx 生成的id是不同的。
我们可以用最前端nginx 生成的id ,覆盖掉ingress 生成的id。
metadata:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
if ($http_x_trace_id) {
set $http_x_request_id $http_x_trace_id;
}
name: whoami-ingress
namespace: default
这个时候,后端程序获取http_x_request_id ,就会和最前端nginx 生成的request_id 一致。