nginx: Registrar solicitação / resposta completa com todos os cabeçalhos?

44

Temos um servidor de aplicativos que às vezes trava. Suspeitamos que seja devido a uma solicitação incorreta de um cliente.

O nginx pode registrar a solicitação / resposta completa (como capturas de violinistas) em arquivos, para que possamos ver as solicitações que foram enviadas antes do travamento?

(Nós provavelmente precisamos evitar o pcap e essa abordagem e fazer tudo no nginx)

Se o nginx não for a ferramenta certa para isso, o que (exceto um analisador de rede) pode ser?

Sam Smith
fonte
1
O mitmproxy no modo proxy reverso deve fazer o que você está procurando.
Vivek Thomas
@VivekThomas, esta é uma pergunta do nginx .... já estamos usando o nginx e não vamos mudar.
samsmith
3
@samsmith Pergunta antiga, mas talvez isso ajude outra pessoa: você não precisa desistir do nginx. Dependendo das circunstâncias, você pode redirecionar o nginx apenas para outra porta temporariamente, para permitir que o mitmproxy intercepte o tráfego e ofereça suporte à depuração. Depois de concluído, você pode apenas rotear novamente o nginx para a porta original e encerrar o mitmproxy.
Per Lundberg
1
Você pode usar o módulo ModSecurity, que pode registrar completos solicitações / respostas, consulte nginx.com/blog/modsecurity-logging-and-debugging
Willem

Respostas:

44

Para obter o corpo da solicitação enviado pelos visitantes, use client_body_in_file_only on;e registre o arquivo "temporário" no qual ele é gravado nos logs, anexando var $request_body_fileao formato de log. Arquivos "temporários" estarão localizados no diretório client_temp por padrão.

Você também pode registrar cabeçalhos de solicitação $http_<header>e enviar cabeçalhos com $sent_http_<header>.

Se você tiver um corpo e cabeçalhos de solicitação, poderá reproduzi-lo e obter a resposta que seu visitante teve.

Além disso, algo como gor deve ser altamente considerado para que você possa reproduzir o tráfego em outro ambiente em que possa deixar o nginx gravar esses arquivos temporários sem causar problemas de IO na produção (o nginx não os purificará com onvalor, é por isso que não é tão "temporário" nesse caso).

Xavier Lucas
fonte
1
@jwadsack Leia a resposta com atenção.
Xavier Lucas
4
@XavierLucas Pensei que você estivesse oferecendo duas abordagens diferentes. Não sabia que você estava dizendo as duas coisas client_body_in_file_only e $http_<header>seria necessário. Eu entendo isso agora.
jwadsack
5
Você poderia compartilhar um código mais preciso?
Velkan
3
Certamente $ http <header> só é útil se você sabe todos os nomes de cabeçalho de antecedência
Ed Randall
2
Alguém pode compartilhar um fragmento real da configuração do nginx, por favor?
Nowaker
17

O mitmproxy parece ser a ferramenta certa para fazer o que você está pedindo.

O mitmproxy é um proxy intermediário, interativo e compatível com SSL para HTTP com uma interface de console.

mitmdump é a versão da linha de comandos do mitmproxy. Pense no tcpdump para HTTP.

Recursos

  • Intercepte solicitações e respostas HTTP e modifique-as rapidamente.
  • Salve conversas HTTP completas para posterior reprodução e análise.
  • Repita o lado do cliente de uma conversa HTTP. Repita as respostas HTTP de um servidor gravado anteriormente.
  • Modo proxy reverso para encaminhar tráfego para um servidor especificado.
  • Modo proxy transparente no OSX e Linux.
  • Faça alterações de script no tráfego HTTP usando Python.
  • Certificados SSL para interceptação são gerados em tempo real.

O modo de proxy reverso permite capturar a solicitação e a resposta, assim como o Fiddler.

Vivek Thomas
fonte