J'utilise nginx comme équilibreur de charge devant plusieurs serveurs d'applications en amont et je souhaite définir un identifiant de trace à utiliser pour corréler les demandes avec les journaux du serveur d'applications. Quelle est la meilleure façon de le faire dans Nginx, existe-t-il un bon module tiers pour cela?
Sinon, un moyen assez simple serait de le baser sur l'horodatage (éventuellement plus un nombre aléatoire si ce n'est pas assez précis) et de le définir comme un en-tête supplémentaire sur la demande, mais la seule commande set_header que je vois dans les documents est de définir un en-tête de réponse.
Dans la plupart des cas, vous n'avez pas besoin d'un module personnalisé, vous pouvez simplement définir un en-tête avec une combinaison de variables intégrées de http_core_module qui est (très probablement) unique. Exemple:
location / {
proxy_pass http://upstream;
proxy_set_header X-Request-Id $pid-$msec-$remote_addr-$request_length;
}
Cela produirait un ID de demande comme "31725-1406109429.299-127.0.0.1-1227" et devrait être "suffisamment unique" pour servir d'ID de trace.
nginx 1.11.0 a ajouté la nouvelle variable $request_id
qui est un identifiant unique, vous pouvez donc faire quelque chose comme:
location / {
proxy_pass http://upstream;
proxy_set_header X-Request-Id $request_id;
}
Voir la référence sur http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id
Ancienne question, nouvelle réponse adaptée aux versions nginx 1.3.8
, 1.2.5
et ci-dessus.
Vous pouvez tilisez une combinaison de $connection
et $connection_requests
maintenant. Définissez simplement votre propre variable dans le bloc server
:
server {
...
set $trace_id $connection-$connection_requests;
...
}
Cet identifiant sera unique sur nginx à moins que le serveur ne soit redémarré.
$connection
- Le numéro de série de la connexion. Il s'agit d'un numéro unique attribué par nginx à chaque connexion. Si plusieurs demandes sont reçues sur une seule connexion, elles auront toutes le même numéro de série de connexion. Les numéros de série sont réinitialisés à la fin du processus maître nginx, ils ne seront donc pas uniques sur de longues périodes.
$connection_requests
- Le nombre de demandes effectuées via ce$connection
.
Ensuite, dans votre bloc location
, définissez l'ID de trace réel:
location / {
...
proxy_set_header X-Request-Id $trace_id;
...
}
Bonus: Faites $trace_id
unique même après le redémarrage du serveur:
set $trace_id $connection-$connection_requests-$msec;
$msec
- L'horodatage Unix actuel en secondes, avec une résolution en millisecondes (float).
Dans notre environnement de production, nous avons un module personnalisé comme celui-ci. Il peut générer un identifiant de trace unique, puis il sera poussé dans les en-têtes http qui seront envoyés au serveur en amont. Le serveur en amont vérifiera si le certain champ est défini, il obtiendra la valeur et l'écrira dans access_log, ainsi, nous pouvons tracer la demande.
Et je trouve qu'un module tiers a la même apparence: nginx-operationid , j'espère qu'il est utile.