在nginx负载均衡器中设置跟踪ID

dan*_*nny 24 webserver load-balancing nginx

我在几个上游应用服务器前面使用nginx作为负载均衡器,我想设置跟踪ID以用于将请求与应用服务器日志相关联.在Nginx中做到这一点的最好方法是,有一个很好的第三方模块吗?

否则一个非常简单的方法是将它从时间戳(可能加上一个随机数,如果它不够精确),并在请求上设置为额外的头,但我在文档中看到的唯一的set_header命令是设置一个响应标题.

isa*_*pir 72

nginx 1.11.0添加了$request_id一个唯一标识符的新变量,因此您可以执行以下操作:

   location / {
      proxy_pass http://upstream;
      proxy_set_header X-Request-Id $request_id;
   }
Run Code Online (Sandbox Code Playgroud)

请参阅http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id上的参考资料

  • 供参考:$ request_id的文档在http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id (2认同)

sba*_*nge 26

在大多数情况下,您不需要自定义模块,您只需使用http_core_module的嵌入变量(最可能)唯一的组合设置标头.例:

  location / {
      proxy_pass http://upstream;
      proxy_set_header X-Request-Id $pid-$msec-$remote_addr-$request_length;
  }
Run Code Online (Sandbox Code Playgroud)

这将产生一个请求ID,如"31725-1406109429.299-127.0.0.1-1227",并且应该"足够独特"作为跟踪ID.

  • 它正在为我工​​作,我正在使用这个`set $ tid $ pid- $ msec- $ remote_addr- $ request_length- $ connection;`和`proxy_set_header X-Tracing-Id $ tid;`稍后,检查你的范围用法... (6认同)

Ger*_*ald 7

老问题,适合nginx的verions新的答案1.3.81.2.5和上面。

您可以使用$connection$connection_requests现在的组合。只需在server块中定义自己的变量即可:

server {
    ...
    set  $trace_id  $connection-$connection_requests;
    ...
}
Run Code Online (Sandbox Code Playgroud)

除非重新启动服务器,否则此id在nginx中将是唯一的。

$connection- 连接序列号。这是nginx分配给每个连接的唯一编号。如果在单个连接上收到多个请求,则它们都将具有相同的连接序列号。当主Nginx进程终止时,序列号将重置,因此它们在长时间内不会唯一。

$connection_requests-通过this发出的请求数 $connection

然后,在您的location块中,设置实际的跟踪ID:

location / {
    ...
    proxy_set_header X-Request-Id $trace_id;
    ...
}
Run Code Online (Sandbox Code Playgroud)

奖励:$trace_id服务器重新启动后,独特的偶数:

set  $trace_id  $connection-$connection_requests-$msec;
Run Code Online (Sandbox Code Playgroud)

$msec -当前的unix时间戳,以秒为单位,以毫秒为单位(浮点)。