Benötige hilfreiche Fehlermeldung von mod_proxy_fcgi

Benötige hilfreiche Fehlermeldung von mod_proxy_fcgi

Wenn ein nicht vorhandenes PHP-Skript angefordert wird, gibt mod_proxy_fcgi eine ziemlich nutzlose Fehlermeldung aus, die im Grunde nur besagt:

[proxy_fcgi:error] .... AH01071: Got error 'Primary script unknown\n'

Dieser Server verwendet Apache 2.4.6 (Centos 7) mit der folgenden PHP-Verarbeitung:

<FilesMatch \.php$>
  SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

Ich würde wirklich gern den tatsächlichen Skriptnamen wissen, da dieser nützliche Informationen enthalten könnte (beispielsweise einen Hinweis auf einen fehlerhaften Link oder einen Fehler in einem Seitennamen oder einfach nur zeigen könnte, dass es sich nur um einen weiteren Idioten handelt, der nach einem Server mit ungeschütztem wp-login.php sucht).

Ich habe versucht, den LogLevel von „Info“ auf „Debug“ zu ändern, aber dann wurde das Fehlerprotokoll auch mit gültigen Zugriffsdetails für PHP-Skripte gefüllt, was das Fehlerprotokoll ziemlich durcheinander bringt, da es sich dabei nicht um echte Fehler handelt.

Gibt es eine Möglichkeit, eine nützlichere Proxy_FCGI-Fehlermeldung zu erhalten, die den tatsächlichen Skriptnamen für nicht vorhandene PHP-Skripte enthält?

Antwort1

Sie können ErrorLogFormat einschließlich %L definieren und dann dasselbe in Ihrem CustomLog-Format %L tun.

Dadurch protokolliert Apache eine bestimmte ID, die einen Fehlerprotokolleintrag in den Zugriffsprotokolleintrag einbindet, und dann müssen Sie nur noch grep ausführen.

Beispiel:

ErrorLogFormat "[%{u}t] [%-m:%l] [%L] [pid %P:tid %T] %7F: %E: [client\ %a] %M% ,\ referer\ %{Referer}i"

LogFormat "%h %l %u [%L] %t \"%r\" %>s \"%{Referer}i\" \"%{User-Agent}i\"" combined

Wenn Sie also das nächste Mal einen Fehler sehen, überprüfen Sie die darin enthaltene ID und durchsuchen Sie die Datei access.log nach derselben ID

Antwort2

Ich würde mir die Zeit des protokollierten Fehlers anzeigen lassen und dann das Zugriffsprotokoll zu dieser Zeit nach Anfragen durchsuchen, die einen Fehler zurückgeben. Das sollte dabei helfen, das Skript aufzuspüren.

Antwort3

Der fragliche Fehler kommt von der FastCGI-Anwendung (was auch immer auf Port 9000 lauscht), nicht von Apache. Apache meldet lediglich, was im FastCGI- FCGI_STDERRStream zurückkommt.

Wenn Apache mit PHP-FPM kommuniziert (was wahrscheinlich ist), können Sie sich die Protokolle von PHP-FPM ansehen. Sie können die error_logAnweisung in Ihrer php-fpm.confDatei überprüfen, um herauszufinden, wo PHP-FPM Fehler protokolliert. Dort sollten weitere Hinweise zu finden sein.

Antwort4

Eine Lösung besteht darin, zu prüfen, ob die Datei existiert, bevor sie an den Handler übergeben wird. Dies ist die Standardeinstellung von DebianKonfigurationsdateischlägt vor.

<FilesMatch ".+\.ph(ar|p|tml)$">
    <If "-f %{REQUEST_FILENAME}">
        SetHandler "proxy:unix:/run/php/php-fpm.sock|fcgi://localhost"
    </If>
</FilesMatch>

Auf diese Weise wird die Datei, falls sie nicht existiert, von Apache und nicht von PHP verarbeitet.

verwandte Informationen