Errore interno 500 Apache, ma niente nei log?


122

Ricevo 500 errori del server interno quando provo a fare un HTTP POST a un indirizzo specifico nella mia app. Ho esaminato i log del server nella directory dei log personalizzati specificata nel file degli host virtuali, ma l'errore non viene visualizzato lì, quindi il debug è stato un rompicoglioni.

Come posso fare in modo che Apache registri gli errori interni 500 nel registro degli errori?


1
Ho avuto lo stesso problema usando PHP con host virtuali .... nessun errore (Apache2, Ubuntu). Alla fine mancavano i moduli PHP (mysql, json, ecc.)

1
Sul nostro, li stava inviando al registro di accesso (presumibilmente perché dal punto di vista di Apache, funzionava correttamente e si limitava a trasmetterli, da uno strato più profondo - nel nostro caso, Passenger / Rails). Metto qui questa nota nel caso qualcuno si grattasse la testa.
Tom Hundt

Risposte:


-4

Nota: il poster originale non chiedeva specificamente di PHP. Tutte le risposte php centric fanno grandi supposizioni non rilevanti per la domanda reale.

Il registro degli errori predefinito rispetto ai registri degli errori degli script di solito ha l'errore (più) specifico. spesso saranno i permessi negati o anche un interprete che non può essere trovato.

Ciò significa che la colpa è quasi sempre del tuo copione. es. hai caricato uno script perl ma non gli hai dato i permessi di esecuzione? o forse è stato danneggiato in un ambiente Linux se scrivi lo script in Windows e poi lo carichi sul server senza che le terminazioni di riga vengano convertite, otterrai questo errore.

in perl se dimentichi

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

otterrai questo errore

Ci sono molte ragioni per questo. quindi controlla prima il registro degli errori e poi fornisci ulteriori informazioni.

Il registro degli errori predefinito è spesso in /var/log/httpd/error_logo /var/log/apache2/error.log.

Il motivo per cui guardi i log degli errori predefiniti (come indicato sopra) è perché gli errori non vengono sempre inseriti nel log degli errori personalizzato come definito nell'host virtuale.

Presuppone linux e non necessariamente perl


6
Ho controllato il server ErrorLog e non c'è niente da trovare lì.
wcolbert

1
Hai ragione, si è scoperto essere un problema con lo script php. La libreria PEAR non è stata installata. L'ho installato sul mio VPS e va tutto bene. Ringrazia tutti!
wcolbert

260
Come può "per favore controlla i log" essere la risposta accettata a "perché i miei log sono vuoti"?
Álvaro González

4
Ho indicato all'utente i log degli errori predefiniti non i log degli errori personalizzati. Spesso quando uno script non riesce per qualche motivo, l'errore viene instradato ai log degli errori predefiniti
DeveloperChris

1
Con PHP, non avevo nulla nei log degli errori di Apache configurati, ma ho trovato gli errori con grep PHP /var/log/syslog. Probabilmente perché c'ero error_log = syslogdentro /etc/php5/apache2/php.ini.
mivk

145

Perché i 500 errori del server interno non vengono registrati nei log degli errori di Apache?

Gli errori che causano l'errore 500 interno del server provengono da un modulo PHP. Per impostazione predefinita, PHP NON registra questi errori. Il motivo è che vuoi che le richieste web vadano più velocemente fisicamente possibile ed è un rischio per la sicurezza registrare gli errori sullo schermo dove gli aggressori possono osservarli.

Queste istruzioni per abilitare la registrazione degli errori del server interno sono per Ubuntu 12.10con PHP 5.3.10e Apache/2.2.22.

Assicurati che la registrazione PHP sia attiva:

  1. Individua il tuo file php.ini:

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
  2. Modifica quel file come root:

    sudo vi /etc/php5/apache2/php.ini
    
  3. Trova questa riga in php.ini:

    display_errors = Off
    
  4. Cambia la riga sopra in questo:

    display_errors = On
    
  5. Più in basso nel file vedrai questo:

    ;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. I punti e virgola sono commenti, il che significa che le righe non hanno effetto. Cambia quelle linee in modo che abbiano questo aspetto:

    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
    

    Ciò che questo comunica a PHP è che vogliamo registrare tutti questi errori. Attenzione, ci sarà un grande calo delle prestazioni, quindi non vuoi che sia abilitato in produzione perché la registrazione richiede lavoro e il lavoro richiede tempo, il tempo costa denaro.

  7. Il riavvio di PHP e Apache dovrebbe applicare la modifica.

  8. Fai di nuovo ciò che hai fatto per causare nuovamente l'errore 500 Internal Server e controlla il registro:

    tail -f /var/log/apache2/error.log
    
  9. Dovresti vedere l'errore 500 alla fine, qualcosa del genere:

    [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
    

46
display_errorsstampa gli errori sullo schermo . log_errorsscrive gli errori nel file di registro .
daVe

11
Questa dovrebbe essere la risposta canonica a questa domanda.
David

9
@WanLiqun È un'informazione abbastanza buona ma si applica solo a PHP, che non è nemmeno menzionato nella domanda.
Álvaro González

1
"Gli errori che causano l'errore 500 interno del server provengono da un modulo PHP. Per impostazione predefinita, PHP NON registra questi errori." Chi ha menzionato PHP? Server 500 Logging disabilitato in PHP è un presupposto e molto spesso un presupposto sbagliato. Apache registrerà gli errori del server 500 da un modulo in errore (in questo caso php) ma molto spesso andrà a /var/log/apache2/error.log (assumendo debian o simili)
DeveloperChris

4
Questa risposta inizia con un cattivo consiglio di scaricare gli errori sullo schermo.
luqo33

11

Controlla il tuo log degli errori di php che potrebbe essere un file separato dal tuo log degli errori di Apache.

phpinfo()Trovalo andando a e controlla l'attributo error_log. Se non è impostato. Impostalo: https://stackoverflow.com/a/12835262/445131

Forse il tuo post_max_size è troppo piccolo per quello che stai cercando di pubblicare, o una delle altre impostazioni di memoria massima è troppo bassa.


1
La domanda era: "Come faccio a far registrare ad Apache gli errori 500 interni nel registro degli errori?" Questo dovrebbe probabilmente essere un commento.
jww

11

Mi sono appena imbattuto in questo ed era a causa di un errore di configurazione di mod_authnz_ldap nel mio file .htaccess. Non veniva registrato assolutamente nulla, ma continuavo a ricevere un errore 500.

Se incontri questo particolare problema, puoi modificare il livello di log di mod_authnz_ldap in questo modo:

LogLevel warn authnz_ldap_module:debug

Ciò utilizzerà un livello di log di debug per mod_authnz_ldap ma avverte per tutto il resto ( https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel ).


1
La domanda era: "Come faccio a far registrare ad Apache gli errori 500 interni nel registro degli errori?" Questo dovrebbe probabilmente essere un commento.
jww

Buona osservazione. Ho aggiunto le istruzioni per registrare questi errori.
bmaupin

7

Se le informazioni sull'errore del server interno non vengono visualizzate nei file di registro, probabilmente è necessario riavviare il servizio Apache .

Ho scoperto che Apache 2.4 (almeno su piattaforma Windows) tende a rifiutarsi ostinatamente di svuotare i file di registro, invece i dati registrati rimangono in memoria per un bel po '. È una buona idea dal punto di vista delle prestazioni, ma può creare confusione durante lo sviluppo.


Questa era la risposta corretta per me su Linux. Anche dopo aver eliminato il file error.log originale (che era un file di dispositivo a caratteri) e averlo sostituito con un tocco 777 error.log, Apache non scriveva su di esso fino al riavvio.
Adelmar

2

Le risposte di @ eric-leschinski sono corrette.

Ma c'è un altro caso se l'API del tuo server è FPM / FastCGI (predefinito su Centos 8 o puoi controllare usa la funzione phpinfo ())

In questo caso:

  1. Esegui phpinfo()in un file php;
  2. Alla ricerca di Loaded Configuration Fileparam per vedere dove si trova il file di configurazione per il tuo PHP.
  3. Modifica il file di configurazione come la risposta di @ eric-leschinski.
  4. Controlla Server APIparam. Se il tuo server usa solo l'API handle di apache -> riavvia apache. Se il tuo server usa php-fpm devi riavviare il servizio php-fpm

    systemctl riavvia php-fpm

    Controlla il file di registro nella cartella di registro di php-fpm. per esempio/var/log/php-fpm/www-error.log


1

Nel mio caso era la direttiva ErrorLog in httpd.conf. L'ho notato per caso già dopo aver rinunciato. Ho deciso di condividere la scoperta) Ora so dove trovare i 500 errori.


Puoi per favore inserire maggiori dettagli nella tua risposta
Yahya Hussein

Sto usando Magento (CMS - Content Management System) per Apache. Si è verificato un errore 500 sulla mia pagina utilizzando le classi principali di Magento. Non sono riuscito a trovare dove ho potuto vedere il messaggio di errore. Secondo alcune risposte qui ho provato a cercare nei log di Apache / etc / httpd / logs / error_log. Ma non c'era niente lì. Successivamente ho scoperto che c'è una riga nel mio httpd.conf per quello specifico host web, che definisce il percorso di log: <VirtualHost. ... ErrorLog / usr / www / log / error_log Quindi avevo bisogno di cercare un registro host più specifico, non il comune registro di Apache.
Eugene Lycenok

1

Aggiungi HttpProtocolOptions Unsafeal tuo file di configurazione di Apache e riavvia il server Apache. Mostra i dettagli dell'errore.


0

Verifica che la versione di php che stai utilizzando corrisponda alla tua base di codice. Ad esempio, il tuo ambiente locale potrebbe eseguire php 5.4 (e le cose funzionano bene) e forse stai testando il tuo codice su una nuova macchina su cui è installato php 5.3. Se stai usando la sintassi 5.4 come [] per array (), otterrai la situazione che hai descritto sopra.


La domanda era: "Come faccio a far registrare ad Apache gli errori 500 interni nel registro degli errori?" Questo dovrebbe probabilmente essere un commento.
jww

0

Prova ad accedere a un file statico. Se anche questo non funziona, vai in tutte le directory dalla radice "/" o "c: \" alla directory del tuo file e controlla se contengono file ".htaccess".

Una volta ho lasciato un file in "c: \" e ha avuto i risultati più strani.


1
La domanda era: "Come faccio a far registrare ad Apache gli errori 500 interni nel registro degli errori?"
jww

0

Controlla se hai disabilitato la segnalazione degli errori da qualche parte nel tuo codice.

C'era un punto nel mio codice in cui l'ho disabilitato, quindi ho aggiunto il codice di debug dopo di esso:

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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.