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上的参考资料
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.
老问题,适合nginx的verions新的答案1.3.8,1.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时间戳,以秒为单位,以毫秒为单位(浮点)。
| 归档时间: |
|
| 查看次数: |
17661 次 |
| 最近记录: |