存在しないphpスクリプトが要求された場合、mod_proxy_fcgiは、基本的に次のような意味のないエラーメッセージを表示します。
[proxy_fcgi:error] .... AH01071: Got error 'Primary script unknown\n'
このサーバーは Apache 2.4.6 (Centos 7) を使用しており、php 処理は次のように構成されています。
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
実際のスクリプト名を知りたいです。そこには役に立つ情報 (欠陥のあるリンク、ページ名のエラー、または単に保護されていない wp-login.php のあるサーバーを探している愚か者の一人であることを示す情報など) が含まれている可能性があるからです。
LogLevel を info から debug に変更しようとしましたが、エラー ログにも有効な PHP スクリプト アクセスの詳細が記録され、実際にはエラーではないため、エラー ログがかなり混乱してしまいました。
存在しない PHP スクリプトの実際のスクリプト名を含む、より便利な proxy_fcgi エラー メッセージを取得する方法はありますか?
答え1
%Lを含むErrorLogFormatを定義し、CustomLog形式%Lでも同じことができます。
これにより、Apache は特定の ID をログに記録し、エラー ログ エントリをアクセス ログ エントリにバインドします。その後は、grep を実行するだけで済みます。
例:
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
次回、エラーが発生したら、その中のIDをチェックし、access.logで同じIDを検索します。
答え2
ログに記録されたエラーの時刻を取得し、その時刻付近のアクセス ログで失敗を返すリクエストを検索します。これにより、スクリプトを追跡できるようになります。
答え3
問題のエラーは、Apache ではなく、FastCGI アプリケーション (ポート 9000 でリッスンしているもの) から発生しています。Apache は、FastCGIFCGI_STDERR
ストリームで返される内容を単に報告しているだけです。
Apache が PHP-FPM と通信している場合 (おそらくそうでしょう)、PHP-FPM のログを調べることができます。ファイルerror_log
内のディレクティブをチェックしてphp-fpm.conf
、PHP-FPM がエラーをログに記録している場所を見つけることができます。そこにはもっと多くの手がかりがあるはずです。
答え4
一つの解決策は、ハンドラに渡す前にファイルが存在するかどうかを確認することです。これは、デフォルトのDebian設定ファイル示唆します。
<FilesMatch ".+\.ph(ar|p|tml)$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:unix:/run/php/php-fpm.sock|fcgi://localhost"
</If>
</FilesMatch>
そうすれば、ファイルが存在しない場合は、PHP ではなく Apache が処理します。