2013-07-19 2 views
13

Ich verwende nginx als Load Balancer vor mehreren vorgelagerten Anwendungsservern und ich möchte eine Ablaufverfolgungs-ID festlegen, die verwendet wird, um Anforderungen mit den App Server-Protokollen zu korrelieren. Was ist der beste Weg, dies in Nginx zu tun, gibt es ein gutes 3rd-Party-Modul dafür?Festlegen einer Ablaufverfolgungs-ID in nginx load balancer

Sonst wäre es eine ziemlich einfache Art, es vom Zeitstempel (möglicherweise plus eine Zufallszahl, wenn das nicht präzise genug ist) zu basieren und es als zusätzlichen Header für die Anfrage festzulegen, aber den einzigen Befehl set_header, den ich in den Dokumenten sehe dient zum Einstellen eines Antwortheaders.

Antwort

19

In den meisten Fällen Sie keine benutzerdefinierten Modul benötigen, können Sie einfach festlegen einen Header mit einer Kombination von eingebetteten Variablen von http_core_module , die (wahrscheinlich) einzigartig ist. Beispiel:

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

Dies würde eine Anforderungs-ID wie „31725-1406109429.299-127.0.0.1-1227“ ergeben und sollte „eindeutig genug“ sein als Spur-ID zu dienen.

+0

sehr schön. Kann es zur Wiederverwendung innerhalb der Anfrage auf eine Variable gesetzt werden? damit es auch in den Protokollen verwendet werden kann? ansonsten ruft $ msec zweimal einen anderen Wert auf, also denke ich etwas wie 'set $ request_id $ pid- $ msec $ remote_addr- $ request_length;' aber bis jetzt konnte es nicht funktionieren – isapir

+6

es funktioniert für Ich benutze diese 'set $ tid $ pid- $ msec- $ remote_addr- $ request_length- $ Verbindung;' und 'proxy_set_header X-Tracing-Id $ tid;' überprüfen Sie später Ihren Umfang der Nutzung ... – sbange

+0

ja, ich habe es auch zu arbeiten. Danke. – isapir

0

In unserer Produktionsumgebung haben wir ein benutzerdefiniertes Modul wie dieses. Es kann eine eindeutige Ablaufverfolgungs-ID generieren und wird dann in HTTP-Header übertragen, die an den Upstream-Server gesendet werden. Der Upstream-Server prüft, ob das bestimmte Feld gesetzt ist, es erhält den Wert und schreibt ihn in access_log, somit können wir die Anfrage verfolgen.

Und ich finde ein 3rd-Party-Modul sieht einfach gleich aus: nginx-operationid, hoffe es ist hilfreich.

36

nginx 1.11.0 hinzugefügt, um die neue Variable $request_id, die eine eindeutige Kennung, so dass Sie so etwas wie zu tun:

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

Siehe Hinweis bei http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id

+2

Als Referenz: Dokumentation auf $ request_id ist hier http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id –

+0

@AndrewNewdigate hey Andrew Ich bin gerade auf Gitter :). Prost. –

+0

Das ist schön, ich würde das jetzt nutzen, danke! – sbange

Verwandte Themen