我在几个上游应用服务器前面使用nginx作为负载均衡器,我想设置跟踪ID以用于将请求与应用服务器日志相关联。在Nginx中最好的方法是什么,是否有一个很好的第三方模块呢?
否则一个非常简单的方法是将它基于时间戳(可能加上一个随机数,如果这不够精确)并在请求中将其设置为额外的头,但我在文档中看到的唯一的set_header命令是用于设置响应标头。
答案 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.8
,1.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,希望它有用。