Erro interno 500 do Apache, mas nada nos logs?

122

Estou recebendo 500 erros de servidor interno quando tento fazer um POST HTTP para um endereço específico em meu aplicativo. Verifiquei os logs do servidor no diretório de log personalizado especificado no arquivo de hosts virtuais, mas o erro não aparece lá, portanto, depurar isso tem sido uma dor de cabeça.

Como faço para que o Apache registre erros internos 500 no log de erros?

wcolbert
fonte
1
Eu tive o mesmo problema ao usar PHP com hosts virtuais .... sem erros (Apache2, Ubuntu). Acabou faltando módulos PHP (mysql, json, etc.)
1
No nosso, ele os estava enviando para o log de acesso (presumivelmente porque do ponto de vista do Apache estava funcionando corretamente e apenas repassando-os, de uma camada mais profunda - no nosso caso, Passenger / Rails). Basta colocar esta nota aqui para o caso de alguém estar coçando a cabeça.
Tom Hundt

Respostas:

-4

Observação: o autor original não estava perguntando especificamente sobre PHP. Todas as respostas centradas em php fazem grandes suposições não relevantes para a questão real.

O log de erros padrão, em oposição aos logs de erros de scripts, geralmente tem o erro (mais) específico. frequentemente, serão permissões negadas ou até mesmo um intérprete que não pode ser encontrado.

Isso significa que a falha quase sempre está no seu script. por exemplo, você carregou um script perl, mas não deu a ele permissões de execução? ou talvez tenha sido corrompido em um ambiente Linux, se você escrever o script no Windows e depois carregá-lo no servidor sem que as terminações de linha sejam convertidas, você obterá este erro.

em perl se você esquecer

print "content-type: text/html\r\n\r\n";

você obterá este erro

Existem muitas razões para isso. portanto, primeiro verifique seu log de erros e, em seguida, forneça mais algumas informações.

O log de erro padrão geralmente está em /var/log/httpd/error_logou /var/log/apache2/error.log.

O motivo de você olhar os logs de erros padrão (conforme indicado acima) é porque os erros nem sempre são postados no log de erros personalizado, conforme definido no host virtual.

Assume linux e não necessariamente perl

DeveloperChris
fonte
6
Verifiquei o ErrorLog do servidor e não encontrei nada lá.
wcolbert
1
Você está correto, acabou sendo um problema com o script php. A biblioteca PEAR não foi instalada. Instalei no meu VPS e está tudo bem. Obrigado a todos!
wcolbert
260
Como "verifique os logs" pode ser a resposta aceita para "por que meus logs estão vazios"?
Álvaro González
4
Apontei ao usuário os logs de erros padrão, não os logs de erros personalizados. Freqüentemente, quando um script falha por algum motivo, o erro é roteado para os logs de erro padrão
DeveloperChris
1
Com o PHP, eu não tinha nada nos logs de erros do apache configurados, mas encontrei os erros com grep PHP /var/log/syslog. Provavelmente porque eu tinha error_log = syslogno /etc/php5/apache2/php.ini.
mivk de
145

Por que os 500 erros internos do servidor não estão sendo registrados em seus logs de erro do apache?

Os erros que causam seu 500 Internal Server Error vêm de um módulo PHP. Por padrão, o PHP NÃO registra esses erros. O motivo é que você deseja que as solicitações da Web ocorram o mais rápido fisicamente possível e é um risco à segurança registrar os erros na tela onde os invasores possam observá-los.

Estas instruções para ativar o registro de erro interno do servidor são para Ubuntu 12.10com PHP 5.3.10e Apache/2.2.22.

Certifique-se de que o registro do PHP esteja ativado:

  1. Localize seu arquivo php.ini:

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
  2. Edite esse arquivo como root:

    sudo vi /etc/php5/apache2/php.ini
    
  3. Encontre esta linha em php.ini:

    display_errors = Off
    
  4. Altere a linha acima para esta:

    display_errors = On
    
  5. Mais abaixo no arquivo, você verá o seguinte:

    ;display_startup_errors
    ;   Default Value: Off
    ;   Development Value: On
    ;   Production Value: Off
    
    ;error_reporting
    ;   Default Value: E_ALL & ~E_NOTICE
    ;   Development Value: E_ALL | E_STRICT
    ;   Production Value: E_ALL & ~E_DEPRECATED
    
  6. Os pontos-e-vírgulas são comentários, o que significa que as linhas não têm efeito. Altere essas linhas para que fiquem assim:

    display_startup_errors = On
    ;   Default Value: Off
    ;   Development Value: On
    ;   Production Value: Off
    
    error_reporting = E_ALL
    ;   Default Value: E_ALL & ~E_NOTICE
    ;   Development Value: E_ALL | E_STRICT
    ;   Production Value: E_ALL & ~E_DEPRECATED
    

    O que isso comunica ao PHP é que queremos registrar todos esses erros. Aviso, haverá um grande impacto no desempenho, então você não quer que isso seja habilitado na produção porque o registro exige trabalho e trabalho leva tempo, tempo custa dinheiro.

  7. Reiniciar o PHP e o Apache deve aplicar a mudança.

  8. Faça o que você fez para causar o erro 500 Internal Server novamente e verifique o log:

    tail -f /var/log/apache2/error.log
    
  9. Você deve ver o erro 500 no final, algo assim:

    [Wed Dec 11 01:00:40 2013] [error] [client 192.168.11.11] PHP Fatal error:  
    Call to undefined function Foobar\\byob\\penguin\\alert() in /yourproject/
    your_src/symfony/Controller/MessedUpController.php on line 249, referer: 
    https://nuclearreactor.com/abouttoblowup
    
Eric Leschinski
fonte
46
display_errorsimprime erros na tela . log_errorsgrava erros no arquivo de log .
dia
11
Esta deve ser a resposta canônica para esta pergunta.
David
9
@WanLiqun É uma informação muito boa, mas só se aplica ao PHP, que nem mesmo é mencionado na pergunta.
Álvaro González
1
"Os erros que causam o 500 Erro Interno do Servidor vêm de um módulo PHP. Por padrão, o PHP NÃO registra esses erros." Quem mencionou o PHP? Server 500 Logging sendo desativado no PHP é uma suposição, e na maioria das vezes, uma suposição errada. O Apache registrará os erros do servidor 500 de um módulo com falha (neste caso php), mas na maioria das vezes irá para /var/log/apache2/error.log (assumindo debian ou similar)
DeveloperChris
4
Essa resposta começa com um conselho ruim para despejar os erros na tela.
luqo33
11

Verifique o log de erros do php, que pode ser um arquivo separado do log de erros do apache.

Encontre-o acessando phpinfo()e verifique o atributo error_log. Se não estiver definido. Configure-o: https://stackoverflow.com/a/12835262/445131

Talvez o seu post_max_size seja muito pequeno para o que você está tentando postar, ou uma das outras configurações de memória máxima seja muito baixa.

jsonH
fonte
1
A pergunta era: "Como faço para que o Apache registre erros internos 500 no log de erros?" Isso provavelmente deve ser um comentário.
jww
11

Acabei de encontrar isso e foi devido a uma configuração incorreta de mod_authnz_ldap em meu arquivo .htaccess. Absolutamente nada estava sendo registrado, mas continuei recebendo um erro 500.

Se você se deparar com esse problema específico, pode alterar o nível de registro de mod_authnz_ldap assim:

LogLevel warn authnz_ldap_module:debug

Isso usará um nível de log de depuração para mod_authnz_ldap, mas avisará para todo o resto ( https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel ).

bmaupin
fonte
1
A pergunta era: "Como faço para que o Apache registre erros internos 500 no log de erros?" Isso provavelmente deve ser um comentário.
jww
Boa observação. Eu adicionei instruções para registrar esses erros.
bmaupin
7

Se as informações de erro interno do servidor não aparecerem nos arquivos de log, você provavelmente precisará reiniciar o serviço Apache .

Descobri que o Apache 2.4 (pelo menos na plataforma Windows) tende a se recusar obstinadamente a liberar arquivos de log - em vez disso, os dados registrados permanecem na memória por um bom tempo. É uma boa ideia do ponto de vista do desempenho, mas pode ser confusa durante o desenvolvimento.

Álvaro González
fonte
Esta foi a resposta correta para mim no Linux. Mesmo depois de excluir o error.log original (que era um arquivo de dispositivo de caractere) e substituí-lo por um error.log touch 777, o Apache não gravava nele até ser reiniciado.
Adelmar
2

As respostas de @ eric-leschinski estão corretas.

Mas há outro caso se a API do seu servidor for FPM / FastCGI (padrão no Centos 8 ou você pode verificar usar a função phpinfo ())

Nesse caso:

  1. Execute phpinfo()em um arquivo php;
  2. Procurando por Loaded Configuration Fileparam para ver onde está o arquivo de configuração do seu PHP.
  3. Edite o arquivo de configuração como a resposta de @eric-leschinski.
  4. Verifique os Server APIparâmetros. Se o seu servidor usa apenas apache handle API -> reinicie o apache. Se o seu servidor usa php-fpm você deve reiniciar o serviço php-fpm

    systemctl restart php-fpm

    Verifique o arquivo de log na pasta de log php-fpm. por exemplo/var/log/php-fpm/www-error.log

Ngô Văn Thao
fonte
1

No meu caso, foi a diretiva ErrorLog em httpd.conf. Apenas acidentalmente percebi isso depois que desisti. Decidi compartilhar a descoberta) Agora eu sei onde encontrar os 500 erros.

Eugene Lycenok
fonte
Você pode colocar mais detalhes em sua resposta
Yahya Hussein
Estou usando Magento (CMS - Content Management System) para Apache. Houve um erro 500 em minha página usando classes principais do Magento. Não consegui encontrar onde vejo a mensagem de erro. De acordo com algumas respostas aqui tentei pesquisar em logs do apache / etc / httpd / logs / error_log. Mas não havia nada lá. Mais tarde, descobri que existe uma linha no meu httpd.conf para esse host específico, definindo o caminho do log: <VirtualHost. ... ErrorLog / usr / www / log / error_log Então eu precisei olhar para um log de host mais específico, não o log comum do apache.
Eugene Lycenok
1

Adicione HttpProtocolOptions Unsafeao seu arquivo de configuração do apache e reinicie o servidor apache. Mostra os detalhes do erro.

Sabre
fonte
0

Verifique se a versão do php que você está executando corresponde à sua base de código. Por exemplo, seu ambiente local pode estar executando o php 5.4 (e as coisas estão funcionando bem) e talvez você esteja testando seu código em uma nova máquina que possui o php 5.3 instalado. Se você estiver usando a sintaxe 5.4 como [] para array (), você obterá a situação descrita acima.

John Erck
fonte
A pergunta era: "Como faço para que o Apache registre erros internos 500 no log de erros?" Isso provavelmente deve ser um comentário.
jww
0

Tente acessar um arquivo estático. Se isso não funcionar, vá para todos os diretórios da raiz "/" ou "c: \" para o diretório do seu arquivo e verifique se eles contêm arquivos ".htaccess".

Certa vez, deixei um arquivo em "c: \" e ele teve os resultados mais estranhos.

Lothar
fonte
1
A pergunta era: "Como faço para que o Apache registre erros internos 500 no log de erros?"
jww
0

Verifique se você está desabilitando o relatório de erros em algum lugar do seu código.

Havia um lugar em meu código onde eu o desabilitei, então adicionei o código de depuração depois dele:

require_once("inc/req.php");   <-- Error reporting is disabled here

// overwrite it
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Preto
fonte