いくつかのアップストリームアプリサーバーの前でnginxをロードバランサーとして使用していて、リクエストをアプリサーバーログと関連付けるために使用するトレースIDを設定します。 Nginxでそれを行うための最良の方法は何ですか、これのための優れたサードパーティモジュールはありますか?
それ以外の場合、非常に簡単な方法は、タイムスタンプ(正確でない場合は乱数に加えて)に基づいてそれをリクエストの追加ヘッダーとして設定することですが、ドキュメントで確認できる唯一のset_headerコマンドは、応答ヘッダー。
ほとんどの場合、カスタムモジュールは必要ありません。(おそらく)一意である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として機能するのに「十分に一意」である必要があります。
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 のリファレンスを参照してください
古い質問、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タイムスタンプ(ミリ秒)(秒単位)。
実稼働環境では、このようなカスタムモジュールがあります。一意のトレースIDを生成し、上流のサーバーに送信するhttpヘッダーにプッシュされます。アップストリームサーバーは、特定のフィールドが設定されているかどうかをチェックし、値を取得してそれをaccess_logに書き込むため、リクエストを追跡できます。
そして、私はサードパーティのモジュールが同じように見えるだけだと思います: nginx-operationid 、それが役に立てば幸いです。