Interner Fehler 500 Apache, aber nichts in den Protokollen?

122

Ich erhalte 500 interne Serverfehler, wenn ich versuche, einen HTTP-POST an eine bestimmte Adresse in meiner App zu erstellen. Ich habe mir die Serverprotokolle in dem benutzerdefinierten Protokollverzeichnis angesehen, das in der Datei für virtuelle Hosts angegeben ist, aber der Fehler wird dort nicht angezeigt. Das Debuggen war also ein Problem.

Wie veranlasst ich Apache, interne 500-Fehler im Fehlerprotokoll zu protokollieren?

wcolbert
quelle
1
Ich hatte das gleiche Problem mit PHP mit virtuellen Hosts ... keine Fehler (Apache2, Ubuntu). Am Ende fehlten PHP-Module (MySQL,
1
Bei uns wurden sie an das Zugriffsprotokoll gesendet (vermutlich, weil es aus Apaches Sicht korrekt funktionierte und sie lediglich aus einer tieferen Schicht weitergab - in unserem Fall Passenger / Rails). Setzen Sie diese Notiz einfach hier ein, falls sich jemand am Kopf kratzt.
Tom Hundt

Antworten:

-3

Bitte beachten Sie: Das Originalposter fragte nicht speziell nach PHP. Alle PHP-zentrierten Antworten machen große Annahmen, die für die eigentliche Frage nicht relevant sind.

Das Standardfehlerprotokoll weist im Gegensatz zu den Skriptfehlerprotokollen normalerweise den (spezifischeren) Fehler auf. Oft werden Berechtigungen verweigert oder sogar ein Dolmetscher kann nicht gefunden werden.

Dies bedeutet, dass der Fehler fast immer in Ihrem Skript liegt. Beispiel: Sie haben ein Perl-Skript hochgeladen, ihm aber keine Ausführungsberechtigungen erteilt? oder vielleicht wurde es in einer Linux-Umgebung beschädigt, wenn Sie das Skript in Windows schreiben und es dann auf den Server hochladen, ohne dass die Zeilenenden konvertiert werden, wird dieser Fehler angezeigt.

in Perl, wenn Sie vergessen

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

Sie werden diesen Fehler erhalten

Dafür gibt es viele Gründe. Bitte überprüfen Sie zuerst Ihr Fehlerprotokoll und geben Sie dann weitere Informationen an.

Das Standardfehlerprotokoll befindet sich häufig in /var/log/httpd/error_logoder /var/log/apache2/error.log.

Der Grund, warum Sie sich die Standardfehlerprotokolle (wie oben angegeben) ansehen, ist, dass Fehler nicht immer in das benutzerdefinierte Fehlerprotokoll gebucht werden, wie im virtuellen Host definiert.

Nimmt Linux und nicht unbedingt Perl an

DeveloperChris
quelle
6
Ich habe den Server ErrorLog überprüft und dort ist nichts zu finden.
Wcolbert
1
Sie haben Recht, es stellte sich heraus, dass es ein Problem mit dem PHP-Skript war. Die PEAR-Bibliothek wurde nicht installiert. Ich habe es auf meinem VPS installiert und alles ist gut. Vielen Dank an alle!
Wcolbert
260
Wie kann "Bitte Protokolle überprüfen" die akzeptierte Antwort auf "Warum sind meine Protokolle leer" sein?
Álvaro González
4
Ich habe den Benutzer auf die Standardfehlerprotokolle hingewiesen, nicht auf die benutzerdefinierten Fehlerprotokolle. Wenn ein Skript aus irgendeinem Grund fehlschlägt, wird der Fehler häufig an die Standardfehlerprotokolle weitergeleitet
DeveloperChris
1
Mit PHP hatte ich nichts in den konfigurierten Apache-Fehlerprotokollen, fand aber die Fehler mit grep PHP /var/log/syslog. Wahrscheinlich , weil ich hatte error_log = syslogin /etc/php5/apache2/php.ini.
Mivk
145

Warum werden die 500 internen Serverfehler nicht in Ihren Apache-Fehlerprotokollen protokolliert?

Die Fehler, die Ihren 500 Internal Server Error verursachen, stammen von einem PHP-Modul. Standardmäßig protokolliert PHP diese Fehler NICHT. Der Grund dafür ist, dass Webanfragen so schnell wie möglich ausgeführt werden sollen und es ein Sicherheitsrisiko darstellt, Fehler auf dem Bildschirm zu protokollieren, auf dem Angreifer sie beobachten können.

Diese Anweisungen zum Aktivieren der internen Serverfehlerprotokollierung gelten für Ubuntu 12.10mit PHP 5.3.10und Apache/2.2.22.

Stellen Sie sicher, dass die PHP-Protokollierung aktiviert ist:

  1. Suchen Sie Ihre php.ini-Datei:

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
  2. Bearbeiten Sie diese Datei als root:

    sudo vi /etc/php5/apache2/php.ini
    
  3. Finden Sie diese Zeile in php.ini:

    display_errors = Off
    
  4. Ändern Sie die obige Zeile in folgende:

    display_errors = On
    
  5. Weiter unten in der Datei sehen Sie Folgendes:

    ;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. Die Semikolons sind Kommentare, dh die Zeilen werden nicht wirksam. Ändern Sie diese Zeilen so, dass sie folgendermaßen aussehen:

    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
    

    Dies kommuniziert mit PHP, dass wir alle diese Fehler protokollieren möchten. Achtung, es wird einen großen Leistungseinbruch geben, daher möchten Sie nicht, dass dies in der Produktion aktiviert wird, da die Protokollierung Arbeit kostet und Arbeit Zeit kostet, Zeit Geld kostet.

  7. Durch einen Neustart von PHP und Apache sollte die Änderung übernommen werden.

  8. Tun Sie, was Sie getan haben, um den 500 Internal Server-Fehler erneut zu verursachen, und überprüfen Sie das Protokoll:

    tail -f /var/log/apache2/error.log
    
  9. Sie sollten den 500-Fehler am Ende sehen, ungefähr so:

    [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
quelle
46
display_errorsdruckt Fehler auf dem Bildschirm . log_errorsschreibt Fehler in die Protokolldatei .
daVe
11
Dies sollte die kanonische Antwort auf diese Frage sein.
David
9
@WanLiqun Es ist eine ziemlich gute Information, aber es gilt nur für PHP, das in der Frage nicht einmal erwähnt wird.
Álvaro González
1
"Die Fehler, die Ihren 500 Internal Server Error verursachen, stammen von einem PHP-Modul. Standardmäßig protokolliert PHP diese Fehler NICHT." Wer hat PHP erwähnt? Das Deaktivieren der Server 500-Protokollierung in PHP ist eine Annahme und meistens eine falsche Annahme. Apache protokolliert Server 500-Fehler von einem fehlerhaften Modul (in diesem Fall PHP), aber meistens geht es zu /var/log/apache2/error.log (unter der Annahme von Debian oder ähnlichem)
DeveloperChris
4
Diese Antwort beginnt mit einem schlechten Rat, um Fehler auf den Bildschirm zu bringen.
luqo33
11

Überprüfen Sie Ihr PHP-Fehlerprotokoll, das möglicherweise eine von Ihrem Apache-Fehlerprotokoll getrennte Datei ist.

Finden Sie es, indem Sie zu gehen phpinfo()und nach dem Attribut error_log suchen. Wenn es nicht eingestellt ist. Stellen Sie es ein: https://stackoverflow.com/a/12835262/445131

Möglicherweise ist Ihre post_max_size zu klein für das, was Sie veröffentlichen möchten, oder eine der anderen maximalen Speichereinstellungen ist zu niedrig.

jsonH
quelle
1
Die Frage war: "Wie kann Apache interne 500-Fehler im Fehlerprotokoll protokollieren?" Dies sollte wahrscheinlich ein Kommentar sein.
JWW
11

Ich bin gerade darauf gestoßen und es lag an einer Fehlkonfiguration von mod_authnz_ldap in meiner .htaccess-Datei. Es wurde absolut nichts protokolliert, aber ich bekam immer wieder einen Fehler von 500.

Wenn Sie auf dieses spezielle Problem stoßen, können Sie die Protokollstufe von mod_authnz_ldap folgendermaßen ändern:

LogLevel warn authnz_ldap_module:debug

Das verwendet eine Protokoll-Debug-Ebene für mod_authnz_ldap, warnt jedoch vor allem anderen ( https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel ).

Bmaupin
quelle
1
Die Frage war: "Wie kann Apache interne 500-Fehler im Fehlerprotokoll protokollieren?" Dies sollte wahrscheinlich ein Kommentar sein.
JWW
Gute Beobachtung. Ich habe Anweisungen zum Protokollieren dieser Fehler hinzugefügt.
Bmaupin
7

Wenn dein internen Serverfehlerinformationen nicht in Protokolldateien angezeigt werden, müssen Sie wahrscheinlich den Apache-Dienst neu starten .

Ich habe festgestellt, dass Apache 2.4 (zumindest auf Windows-Plattformen) das Löschen von Protokolldateien hartnäckig ablehnt. Stattdessen bleiben protokollierte Daten eine ganze Weile im Speicher. Unter dem Gesichtspunkt der Leistung ist dies eine gute Idee, die jedoch bei der Entwicklung verwirrend sein kann.

Álvaro González
quelle
Dies war die richtige Antwort für mich unter Linux. Selbst nachdem das ursprüngliche error.log (das eine Zeichengerätedatei war) gelöscht und durch ein touch 777 error.log ersetzt wurde, schrieb Apache erst nach einem Neustart darauf.
Adelmar
2

Die Antworten von @ eric-leschinski sind richtig.

Es gibt jedoch einen anderen Fall, wenn Ihre Server-API FPM / FastCGI ist (Standard unter Centos 8 oder Sie können die Funktion phpinfo () verwenden).

In diesem Fall:

  1. Führen Sie phpinfo()in einer PHP-Datei;
  2. Suchen Sie nach Loaded Configuration Fileparam, um zu sehen, wo sich die Konfigurationsdatei für Ihr PHP befindet.
  3. Bearbeiten Sie die Konfigurationsdatei wie die Antwort von @ eric-leschinski.
  4. Überprüfen Sie Server APIparam. Wenn Ihr Server nur die Apache-Handle-API verwendet -> starten Sie den Apache neu. Wenn Ihr Server php-fpm verwendet, müssen Sie den php-fpm-Dienst neu starten

    systemctl starte php-fpm neu

    Überprüfen Sie die Protokolldatei im Protokollordner php-fpm. z.B/var/log/php-fpm/www-error.log

Ngô Văn Thao
quelle
1

In meinem Fall war es die ErrorLog-Direktive in httpd.conf. Ich habe es nur aus Versehen bemerkt, nachdem ich aufgegeben habe. Beschlossen, die Entdeckung zu teilen) Jetzt weiß ich, wo die 500-Fehler zu finden sind.

Eugene Lycenok
quelle
Können Sie bitte mehr Details in Ihre Antwort setzen
Yahya Hussein
Ich verwende Magento (CMS - Content Management System) für Apache. Auf meiner Seite mit Magento-Kernklassen ist ein Fehler 500 aufgetreten. Ich konnte nicht finden, wo ich die Fehlermeldung sehen konnte. Nach einigen Antworten hier habe ich versucht, in Apache-Protokollen / etc / httpd / logs / error_log zu suchen. Aber da war nichts. Später fand ich heraus, dass in meiner httpd.conf eine Zeile für diesen bestimmten Webhost vorhanden ist, die den Protokollpfad definiert: <VirtualHost. ... ErrorLog / usr / www / log / error_log Ich musste also nach einem spezifischeren Host-Protokoll suchen, nicht nach dem allgemeinen Apache-Protokoll.
Eugene Lycenok
1

Fügen Sie HttpProtocolOptions UnsafeIhrer Apache-Konfigurationsdatei hinzu und starten Sie den Apache-Server neu. Es zeigt die Fehlerdetails.

Säbel
quelle
0

Überprüfen Sie, ob die Version von PHP, die Sie ausführen, mit Ihrer Codebasis übereinstimmt. In Ihrer lokalen Umgebung wird beispielsweise PHP 5.4 ausgeführt (und die Dinge laufen einwandfrei), und Sie testen Ihren Code möglicherweise auf einem neuen Computer, auf dem PHP 5.3 installiert ist. Wenn Sie 5.4-Syntax wie [] für array () verwenden, erhalten Sie die oben beschriebene Situation.

John Erck
quelle
Die Frage war: "Wie kann Apache interne 500-Fehler im Fehlerprotokoll protokollieren?" Dies sollte wahrscheinlich ein Kommentar sein.
JWW
0

Versuchen Sie, auf eine statische Datei zuzugreifen. Wenn dies auch nicht funktioniert, gehen Sie zu allen Verzeichnissen vom Stammverzeichnis "/" oder "c: \" in das Verzeichnis Ihrer Datei und prüfen Sie, ob sie ".htaccess" -Dateien enthalten.

Ich habe einmal eine Datei in "c: \" hinterlassen und sie hatte die seltsamsten Ergebnisse.

Lothar
quelle
1
Die Frage war: "Wie kann Apache interne 500-Fehler im Fehlerprotokoll protokollieren?"
JWW
0

Bitte überprüfen Sie, ob Sie die Fehlerberichterstattung irgendwo in Ihrem Code deaktivieren.

Es gab eine Stelle in meinem Code, an der ich ihn deaktiviert habe, also habe ich den Debug-Code danach hinzugefügt:

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);
Schwarz
quelle