Установка идентификатора трассировки в балансировщике нагрузки 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, надеюсь, что это будет полезно.