【问题标题】:Setting a trace id in nginx load balancer在 nginx 负载均衡器中设置跟踪 id
【发布时间】:2013-07-18 21:29:16
【问题描述】:

我在多个上游应用服务器前使用 nginx 作为负载平衡器,我想设置一个跟踪 ID 用于将请求与应用服务器日志相关联。在 Nginx 中做到这一点的最佳方法是什么,是否有一个很好的 3rd 方模块?

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

【问题讨论】:

    标签: nginx webserver load-balancing nginx-config 3dr


    【解决方案1】:

    老问题,新答案适合nginx版本1.3.81.2.5及以上。

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

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

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

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

    $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 时间戳,以秒为单位,以毫秒为单位(浮点数)。

    【讨论】:

    • 我在我们的应用程序中使用一个变量作为 TRACE_ID。将set TRACE_ID $connection-$connection_requests; works for me ? 因为proxy_set_header 不适用于我使用这个自定义变量。
    【解决方案2】:

    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

    【讨论】:

    • 供参考:关于 $request_id 的文档在这里nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id
    • @AndrewNewdigate 嘿,安德鲁,我现在在 Gitter 上 :)。干杯。
    • $request_id 已在当前版本的 nginx 中被弃用和删除。万一今天有人想知道。您现在可以使用$connection(连接序列号)。
    • @Gerald 你能提供参考吗?我没有看到任何关于弃用的信息
    • @isapir 恰恰相反(没有检查,抱歉)。 $request_id 仅适用于 nginx Plus 1.11 版:https://docs.nginx.com/nginx/releases/#nginx-plus-release-10-r10 - 对于其他人,使用此组合:$connection-$connection_requests 也创建一个唯一的请求标识符(内部子请求保持相同)。
    【解决方案3】:

    在大多数情况下您不需要自定义模块,您可以简单地设置一个 带有 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。

    【讨论】:

    • 非常好。可以将其设置为变量以在请求中重用吗?以便它也可以在日志中使用?否则两次调用 $msec 会产生不同的值,所以我在想类似set $request_id $pid-$msec-$remote_addr-$request_length; 但到目前为止无法让它工作
    • 它对我有用,我稍后会使用这个set $tid $pid-$msec-$remote_addr-$request_length-$connection;proxy_set_header X-Tracing-Id $tid;,请检查您的使用范围...
    • 可能不想泄露 $remote_addr 以防用户想要公开分享请求 ID。
    • 如果 nginx 可以从 $pid-$msec-$remote_addr-$request_length 获取 md5 或 sha,它几乎是随机的 uid 并且值将是单一的
    【解决方案4】:

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

    我发现第 3 方模块看起来一样:nginx-operationid,希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 2013-04-28
      相关资源
      最近更新 更多