アプリの特定のアドレスにHTTP POSTを実行しようとすると、500の内部サーバーエラーが発生します。私は仮想ホストファイルで指定されたカスタムログディレクトリのサーバーログを調べましたが、エラーはそこに表示されないため、これをデバッグすることはお尻の苦痛でした。
Apacheで内部500エラーをエラーログに記録するにはどうすればよいですか?
アプリの特定のアドレスにHTTP POSTを実行しようとすると、500の内部サーバーエラーが発生します。私は仮想ホストファイルで指定されたカスタムログディレクトリのサーバーログを調べましたが、エラーはそこに表示されないため、これをデバッグすることはお尻の苦痛でした。
Apacheで内部500エラーをエラーログに記録するにはどうすればよいですか?
回答:
注意:元の投稿者は特にPHPについて質問していませんでした。すべてのphp中心の回答は、実際の質問に関連しない大きな仮定を行います。
通常、スクリプトエラーログとは対照的に、デフォルトのエラーログには(より)特定のエラーがあります。多くの場合、アクセスが拒否されたり、見つからないインタープリターであったりします。
つまり、ほとんどの場合、エラーはスクリプトにあります。たとえば、perlスクリプトをアップロードしましたが、実行権限を与えていませんか?または、Linux環境でスクリプトをWindowsで作成し、改行を変換せずにサーバーにアップロードすると、このエラーが発生する可能性があります。
あなたが忘れた場合はperlで
print "content-type: text/html\r\n\r\n";
このエラーが発生します
それには多くの理由があります。そのため、最初にエラーログを確認してから、詳細情報を提供してください。
多くの場合、デフォルトのエラーログは/var/log/httpd/error_log
またはにあり/var/log/apache2/error.log
ます。
(上記のように)デフォルトのエラーログを確認する理由は、仮想ホストで定義されているように、エラーが常にカスタムエラーログにポストされるとは限らないためです。
Linuxを想定し、必ずしもperlではない
grep PHP /var/log/syslog
。おそらく私が持っていerror_log = syslog
たからでしょう/etc/php5/apache2/php.ini
。
500内部サーバーエラーがApacheエラーログに記録されないのはなぜですか?
500内部サーバーエラーの原因となるエラーは、PHPモジュールが原因です。デフォルトでは、PHPはこれらのエラーをログに記録しません。Webリクエストが物理的に可能な限り高速になることを望んでいる理由は、エラーをログに記録して攻撃者がエラーを監視できるようにすることはセキュリティ上の問題です。
内部サーバーエラーログを有効にするこれらの手順はUbuntu 12.10
、PHP 5.3.10
およびで使用できApache/2.2.22
ます。
PHPロギングがオンになっていることを確認します。
php.iniファイルを見つけます。
el@apollo:~$ locate php.ini
/etc/php5/apache2/php.ini
そのファイルをルートとして編集します。
sudo vi /etc/php5/apache2/php.ini
php.iniでこの行を見つけます。
display_errors = Off
上記の行を次のように変更します。
display_errors = On
次のファイルが表示されます。
;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
セミコロンはコメントです。つまり、行は有効になりません。これらの行を次のように変更します。
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
これがPHPと通信するのは、これらのすべてのエラーをログに記録することです。警告:パフォーマンスが大幅に低下するため、ロギングには時間がかかり、時間もかかるため、本番環境ではこれを有効にしたくない。
PHPとApacheを再起動すると、変更が適用されます。
500内部サーバーエラーを再度発生させるために行った操作を実行し、ログを確認します。
tail -f /var/log/apache2/error.log
最後に、次のような500エラーが表示されます。
[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
display_errors
画面にエラーを出力します。log_errors
エラーをログファイルに書き込みます。
Apacheエラーログとは別のファイルである可能性があるPHPエラーログを確認します。
に移動してそれを見つけphpinfo()
、error_log属性を確認します。設定されていない場合。それを設定してください:https://stackoverflow.com/a/12835262/445131
投稿しようとしているものに対してpost_max_sizeが小さすぎるか、他の最大メモリ設定の1つが低すぎる可能性があります。
私はこれに遭遇しましたが、それは私の.htaccessファイルのmod_authnz_ldapの設定ミスが原因でした。何もログに記録されていませんでしたが、500エラーが発生し続けました。
この特定の問題が発生した場合は、次のようにmod_authnz_ldapのログレベルを変更できます。
LogLevel warn authnz_ldap_module:debug
これはmod_authnz_ldapのデバッグのログレベルを使用しますが、その他すべてについて警告します(https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel)。
あなたの場合は内部サーバーエラー情報がログファイルに表示されない、あなたはおそらくする必要がApacheサービスを再起動します。
私は、Apache 2.4(少なくともWindowsプラットフォームでは)が頑固にログファイルのフラッシュを拒否する傾向があることを発見しました。代わりに、ログに記録されたデータはかなり長い間メモリに残ります。パフォーマンスの観点からは良い考えですが、開発時に混乱する可能性があります。
@ eric-leschinskiの答えは正しいです。
ただし、サーバーAPIがFPM / FastCGIの場合は別のケースがあります(Centos 8のデフォルト、またはphpinfo()関数の使用を確認できます)
この場合:
phpinfo()
phpファイルで実行します。Loaded Configuration File
paramを探して、PHPの構成ファイルの場所を確認します。Server API
パラメータを確認してください。サーバーがApacheハンドルAPIのみを使用する場合-> Apacheを再起動します。サーバーがphp-fpmを使用している場合は、php-fpmサービスを再起動する必要があります
systemctl restart php-fpm
php-fpmログフォルダーのログファイルを確認します。例えば/var/log/php-fpm/www-error.log
私の場合、それはhttpd.confのErrorLogディレクティブでした。あきらめた後、偶然に気づいただけです。発見を共有することを決定しました)今、私は500エラーを見つける場所を知っています。