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?


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.


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. ;-)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.