在nginx负载平衡器中设置跟踪id

在nginx负载平衡器中设置跟踪id,nginx,webserver,load-balancing,Nginx,Webserver,Load Balancing,我在几个上游应用服务器前面使用nginx作为负载平衡器,我想设置一个跟踪id,用于将请求与应用服务器日志关联起来。在Nginx中实现这一点的最佳方式是什么,是否有一个好的第三方模块 否则,一个非常简单的方法是根据时间戳(如果不够精确,可能加上一个随机数)将其设置为请求的额外头,但我在文档中看到的唯一set_header命令是用于设置响应头。在我们的生产环境中,我们有这样一个自定义模块。它可以生成一个唯一的跟踪id,然后将其推送到http头中,并发送到上游服务器。上游服务器将检查是否设置了某个字段

我在几个上游应用服务器前面使用nginx作为负载平衡器,我想设置一个跟踪id,用于将请求与应用服务器日志关联起来。在Nginx中实现这一点的最佳方式是什么,是否有一个好的第三方模块


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

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


我发现第三方模块看起来是一样的:,希望有帮助。

在大多数情况下,您不需要自定义模块,只需设置一个 带有http_core_模块嵌入变量组合的标头 这很可能是独一无二的。例如:

  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。

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

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

参见

旧问题的参考,新答案适用于nginx verions
1.3.8
1.2.5
及以上版本

您现在可以使用
$connection
$connection\u请求的组合。
只需在
服务器
块中定义您自己的变量:

server {
    ...
    set  $trace_id  $connection-$connection_requests;
    ...
}
除非重新启动服务器,否则此id在整个nginx中是唯一的

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

$connection\u requests
-通过此
$connection

然后,在
位置
块中,设置实际跟踪ID:

location / {
    ...
    proxy_set_header X-Request-Id $trace_id;
    ...
}
奖励:即使在服务器重新启动后,也要使
$trace\u id
唯一:

set  $trace_id  $connection-$connection_requests-$msec;
$msec
-以秒为单位的当前unix时间戳,分辨率为毫秒(浮点)


很不错的。是否可以将其设置为一个变量,以便在请求中重用?这样它也可以在日志中使用?否则,两次调用$msec将生成不同的值,因此我考虑类似于
set$request\u id$pid-$msec-$remote\u addr-$request\u length但到目前为止无法使其工作。它对我有效,我正在使用此
设置$tid$pid-$msec-$remote\u addr-$request\u length-$connection和<代码>代理集>标题X-Tracing-Id$tid稍后,检查您的使用范围…可能不想泄露$remote\u addr,以防用户想要公开共享请求id。如果nginx可以从
$pid-$msec-$remote\u addr-$request\u length
中获取md5或sha,它几乎是随机的uid,值将是单一的供参考:关于$request\u id的文档在这里@andownewdigate嘿Andrew I'm现在在Gitter上:)。干杯。
$request\u id
在当前版本的nginx中已被弃用和删除。以防现在有人怀疑。您现在可以使用
$connection
(连接序列号)。@Gerald您能提供一个参考吗?我看不到任何关于这个问题的信息deprecation@isapir相反(对不起,没有检查)
$request\u id
仅在nginx Plus版本1.11中提供:-对于其他应用程序,请使用此组合:
$connection-$connection\u requests
,它也会创建一个唯一的请求标识符(对于内部子请求保持相同)。我在应用程序中使用一个变量作为TRACE\u id。将
设置跟踪ID$connection-$connection\u请求;适用于我?
因为使用此自定义变量时,代理集标题不适用于我。