美文网首页
nginx request id 穿透

nginx request id 穿透

作者: 迷茫_小青年 | 来源:发表于2024-08-28 18:32 被阅读0次

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 一致。

后端程序可以通过 http_x_request_id 获取是因为ingress 默认配置了proxy_set_header

proxy_set_header X-Request-ID $req_id; 在nginx-ingress配置文件中可以看到。

nginx-ingress 的request id 变量是 跟nginx不一样,它的是req_id, 而正常的nginx是request_id

相关文章

网友评论

      本文标题:nginx request id 穿透

      本文链接:https://www.haomeiwen.com/subject/wxmtljtx.html