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

时间:2013-07-19 14:33:19

标签: nginx webserver load-balancing

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

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

4 个答案:

答案 0 :(得分:65)

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

   location / {
      proxy_pass http://upstream;
      proxy_set_header X-Request-Id $request_id;
   }

请参阅http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id

上的参考资料

答案 1 :(得分:24)

在大多数情况下,您不需要自定义模块,您只需设置一个 标头与http_core_module的嵌入变量的组合 这是(最有可能)独特的。例如:

  location / {
      proxy_pass http://upstream;
      proxy_set_header X-Request-Id $pid-$msec-$remote_addr-$request_length;
  }

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

答案 2 :(得分:6)

旧问题,新答案适合nginx版本1.3.81.2.5及更高版本。

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

server {
    ...
    set  $trace_id  $connection-$connection_requests;
    ...
}

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

  

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

  

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

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

location / {
    ...
    proxy_set_header X-Request-Id $trace_id;
    ...
}

奖金:即使服务器重新启动后,也要使$trace_id唯一:

set  $trace_id  $connection-$connection_requests-$msec;
  

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

答案 3 :(得分:0)

在我们的生产环境中,我们有一个像这样的自定义模块。它可以生成唯一的跟踪ID,然后将其推送到发送到上游服务器的http报头。上游服务器将检查是否设置了某个字段,它将获取该值并将其写入access_log,因此,我们可以跟踪该请求。

我发现第三方模块看起来一模一样:nginx-operationid,希望它有用。