Como identificar subrequisitos nos arquivos de log do Nginx

1

Ao usar log_subrequest on no Nginx, como posso identificar linhas de log que são sub-solicitações?

O Apache tem a variável IS_SUBREQ , mas o Nginx não parece ter um equivalente.

Estou usando o módulo slice e processando meus registros com ELK e preciso separar as linhas de log dos principais solicitações de linhas de log para sub-solicitações.

Obrigado

    
por ilumos 24.03.2018 / 16:47

1 resposta

1

TL; DR

Existe um caminho, mas não sem uma pequena programação envolvida.

  • Remover parte da string de consulta de $request_uri
  • URI-unescape o resultado
  • Adicione o $query_string , se houver
  • Adicione o $query_string ao $uri
  • Compare o $uri aprimorado com o $request_uri modificado, se eles não forem iguais um ao outro, você acabou de descobrir uma sub-solicitação.

Resposta longa

Atualmente, parece não haver uma maneira de distinguir entre solicitações e sub-solicitações interativas pelo usuário com uma simples variável , como no Apache. Algo como $is_subreq simplesmente não está disponível . (nginx dev team, alguém?)

No momento, estou programando um plugin htaccess para nginx, onde eu precisava encontrar uma maneira de garantir que a solicitação atual é a original. Isso pode ser obtido por meio de comparação de $uri com $request_uri e, se forem diferentes, a solicitação será uma continuação.

Mas tenha cuidado , se você comparar com ousadia as variáveis, você falhará: $uri não possui seu $query_string e é decodificado por URL, enquanto $request_uri é deixado intocado (ainda codificado), com sua string de consulta anexada.

Aqui está um código recortado do meu projeto atual (implementação htaccess em Lua), onde você pode ver como eu fiz:

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
    
por 21.07.2018 / 12:03

Tags