Назад | Перейти на главную страницу

Как определить подзапросы в файлах журнала Nginx

Когда используешь log_subrequest on в Nginx, как определить строки журнала, являющиеся подзапросами?

В Apache есть переменная IS_SUBREQ но у Nginx, похоже, нет эквивалента.

Я использую slice модуль и обработка моих журналов с помощью ELK и необходимо отделить строки журнала для основных запросов от строк журнала для подзапросов.

Спасибо

TL; DR

Способ есть, но без небольшого программирования.

  • Удалить часть строки запроса из $request_uri
  • URI-неэкранировать результат
  • Добавить $query_string, если есть
  • Добавить $query_string к $uri
  • Сравните улучшенные $uri с измененным $request_uri, если они не равны друг другу, вы только что обнаружили подзапрос.

Длинный ответ

В настоящее время, похоже, нет способа отличить запросы, взаимодействующие с пользователем, и подзапросы с помощью простого переменная как в апаче. Что-то вроде $is_subreq просто не доступен. (команда разработчиков nginx, кто-нибудь?)

В настоящий момент я программирую плагин htaccess для nginx, где мне нужно было найти способ убедиться, что текущий запрос является исходным. Это может быть достигнуто сравнение $uri с участием $request_uri, и если они отличаются, запрос является продолжением.

Но быть осторожен, если смело сравнивать переменные, не получится: $uri не хватает $query_string и декодируется URL-адресом, а $request_uri остается нетронутым (все еще закодированным) с прикрепленной строкой запроса.

Вот фрагмент кода из моего реального проекта (реализация htaccess в Lua), где вы можете увидеть, как я это сделал:

local org_request_uri = ngx.var.request_uri
-- The original requested URI including query string.
-- Make sure uri doesn't end on '?', as request_uri will never match that.
org_request_uri_path = org_request_uri:match('^[^%?]+')
if org_request_uri:len() > org_request_uri_path:len() then
    org_request_uri = ngx.unescape_uri(org_request_uri_path)..
        org_request_uri:sub(org_request_uri_path:len()+1)
else
    org_request_uri = ngx.unescape_uri(org_request_uri_path)
end

local request_uri = ngx.var.uri -- The actual requested URI including query string
if ngx.var.query_string then
    request_uri = request_uri..'?'..ngx.var.query_string
end