web-dev-qa-db-ja.com

nginxロードバランサーでトレースIDを設定する

いくつかのアップストリームアプリサーバーの前でnginxをロードバランサーとして使用していて、リクエストをアプリサーバーログと関連付けるために使用するトレースIDを設定します。 Nginxでそれを行うための最良の方法は何ですか、これのための優れたサードパーティモジュールはありますか?

それ以外の場合、非常に簡単な方法は、タイムスタンプ(正確でない場合は乱数に加えて)に基づいてそれをリクエストの追加ヘッダーとして設定することですが、ドキュメントで確認できる唯一のset_headerコマンドは、応答ヘッダー。

28
danny

ほとんどの場合、カスタムモジュールは必要ありません。(おそらく)一意であるhttp_core_moduleの埋め込み変数の組み合わせでヘッダーを設定するだけです。例:

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

これにより、「31725-1406109429.299-127.0.0.1-1227」のようなリクエストIDが生成され、トレースIDとして機能するのに「十分に一意」である必要があります。

24
sbange

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 のリファレンスを参照してください

69
isapir

古い質問、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タイムスタンプ(ミリ秒)(秒単位)。

7
Gerald

実稼働環境では、このようなカスタムモジュールがあります。一意のトレースIDを生成し、上流のサーバーに送信するhttpヘッダーにプッシュされます。アップストリームサーバーは、特定のフィールドが設定されているかどうかをチェックし、値を取得してそれをaccess_logに書き込むため、リクエストを追跡できます。

そして、私はサードパーティのモジュールが同じように見えるだけだと思います: nginx-operationid 、それが役に立てば幸いです。

0
TroyCheng