Установка идентификатора трассировки в балансировщике нагрузки nginx
Я использую nginx как балансировщик нагрузки перед несколькими серверами приложений вверх, и я хочу установить идентификатор трассировки для корреляции запросов с журналами сервера приложений. Какой лучший способ сделать это в Nginx, есть ли для этого хороший сторонний модуль?
В противном случае довольно простой способ заключается в том, чтобы основывать его на отметке времени (возможно, плюс случайное число, если это недостаточно точно) и установить его как дополнительный заголовок запроса, но единственная команда set_header, которую я вижу в документах, для установки заголовка ответа.
Ответы
Ответ 1
В большинстве случаев вам не нужен специальный модуль, вы можете просто установить
заголовок с комбинацией встроенных переменных 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"
и должен быть "достаточно уникальным", чтобы служить идентификатором следа.
Ответ 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
Ответ 3
В нашей производственной среде у нас есть такой настраиваемый модуль. Он может генерировать уникальный идентификатор трассировки, а затем он будет помещен в заголовки http, которые отправляются на восходящий сервер. Сервер восходящего потока будет проверять, установлено ли определенное поле, оно получит значение и запишет его в access_log, таким образом, мы можем отслеживать запрос.
И я считаю, что сторонний модуль выглядит просто: nginx-operationid, надеюсь, что это будет полезно.