Tenha pedidos de log do Apache quando eles entrarem, e não quando terminarem

9

Estou tentando diagnosticar um problema bizarro de travamento do servidor (o servidor responde a pings, mas não aceita conexões SSH até a reinicialização. 0% da CPU ) em que a reinicialização do servidor faz com que tudo volte ao normal. Eu gostaria que meus logs de acesso do Apache (ou algum outro log) incluíssem todas as solicitações feitas corretamente quando a falha ocorreu, mas infelizmente o Apache não registra solicitações até que elas sejam concluídas. Significando que, se uma solicitação está travando o servidor, essa solicitação nunca termina e, portanto, não aparece nos logs.

Existe alguma maneira de configurar o Apache para criar um arquivo de log que é gravado quando as solicitações chegam?

Ben Dilts
fonte
Dê uma olhada também na sua configuração de DNS, um servidor DNS quebrado ou paralisado pode causar todos os tipos de problemas com o SSH e não conseguir fazer login. [Quem sabe o que isso pode fazer com o apache - verifique se as pesquisas de nome de host estão desativadas.]
Sean Kimball

Respostas:

15

Acho que o que você precisa de log forense, consulte este link: http://httpd.apache.org/docs/current/mod/mod_log_forensic.html

snippet:

Formato de registro forense:

Cada solicitação é registrada duas vezes. A primeira vez é antes de ser processado (após receber os cabeçalhos). A segunda entrada de log é gravada após o processamento da solicitação ao mesmo tempo em que ocorre o log normal.

Para identificar cada solicitação, um ID de solicitação exclusivo é atribuído. Esse ID forense pode ter registro cruzado no log de transferência normal usando a sequência de formato% {forensic-id} n. Se você estiver usando mod_unique_id, seu ID gerado será usado.

A primeira linha registra o ID forense, a linha de solicitação e todos os cabeçalhos recebidos, separados por caracteres de barra vertical (|). Uma linha de amostra é semelhante à seguinte (todas em uma linha):

+ yQtJf8CoAB4AAFNXBIEAAAAA | GET /manual/de/images/down.gif HTTP / 1.1 | Host: localhost% 3a8080 | Agente do usuário: Mozilla / 5.0 (X11; U; Linux i686; en-US; rv% 3a1.6) Gecko / 20040216 Firefox / 0.8 | Aceitar: imagem / png, etc ...

O caractere mais no início indica que esta é a primeira linha de log desta solicitação. A segunda linha contém apenas um caractere de menos e o ID novamente:

-yQtJf8CoAB4AAFNXBIEAAAAA

O script check_forensic usa como argumento o nome do arquivo de log. Ele procura esses pares +/- ID e reclama se uma solicitação não foi concluída.

sandroid
fonte
Era isso que eu estava procurando, mas não parece que eu possa limpar esse log periodicamente (rm /var/log/apache2/forensic.log a cada hora) ou o log forense apenas interrompe até que eu reinicie o apache. Ideias?
Ben Dilts
certamente, se você tiver algum registro apache, isso acontecerá. Tente usar o logrotate ou qualquer outro equivalente existente em seu ambiente para rolar logs periodicamente (em termos de tempo ou tamanho). Se não, em vez de excluí-lo, tente mover o arquivo, em seguida, toque /var/log/apache2/forensic.log (verifique as permissões embora)
Sandroid
2

A resposta da Sandroid é adequada para sua pergunta, mas você também deve considerar executar uma captura de pacote de rede. Se você tiver os recursos, espelhar a porta no comutador e usar uma segunda máquina executando o WireShark para registrar todo o tráfego IP pode realmente ajudar. Se algo estiver levando o servidor ao ponto em que serviços não HTTP não estão respondendo, pode ser que esteja retirando a pilha de IPs antes que os dados incorretos cheguem ao Apache.

Se você pode garantir que a máquina que está executando a captura tenha hardware e / ou drivers de rede diferentes dos outros. Seria péssimo bater dois pelo preço de um. ;-)

Marca
fonte