アプリの特定のアドレスにHTTP POSTを作成しようとすると、500内部サーバーエラーが発生します。仮想ホストファイルで指定されたカスタムログディレクトリ内のサーバーログを調べましたが、エラーが表示されないため、デバッグを行うのが面倒でした。
Apacheでエラーログに内部500エラーを記録するにはどうすればよいですか?
なぜ500内部サーバーエラーがApacheエラーログに記録されないのですか?
500 Internal Server Errorの原因となるエラーは、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 Internal Serverエラーの原因となることを再度実行し、ログを確認します。
vi /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
私はこれに遭遇しましたが、それは.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エラーログとは別のファイルである可能性があるphpエラーログを確認します。
phpinfo()
にアクセスして、error_log属性を確認してください。設定されていない場合。設定してください: https://stackoverflow.com/a/12835262/445131
Post_max_sizeが投稿しようとしているものに対して小さすぎるか、他の最大メモリ設定の1つが低すぎる可能性があります。
Internal Server Error情報がログファイルに表示されない場合、おそらくApacheサービスを再起動する必要があります。
Apache 2.4(少なくともWindowsプラットフォームでは)はログファイルのフラッシュを頑固に拒否する傾向があることがわかりました。代わりに、ログに記録されたデータはかなり長い間メモリに残ります。パフォーマンスの観点からは良いアイデアですが、開発時には混乱を招く可能性があります。
静的ファイルにアクセスしてみてください。これが機能しない場合は、ルート「/」または「c:\」からファイルのディレクトリまでのすべてのディレクトリに移動し、「。htaccess」ファイルが含まれているかどうかを確認します。
「c:\」にファイルを残したことがありますが、最も奇妙な結果になりました。
HttpProtocolOptions Unsafe
をApache構成ファイルに追加し、Apacheサーバーを再起動します。エラーの詳細が表示されます。
私の場合は、httpd.confのErrorLogディレクティブでした。私はあきらめた後、すでに誤ってそれに気づいた。発見を共有することにしました)今、私は500エラーを見つける場所を知っています。
実行しているphpのバージョンがコードベースと一致することを確認してください。たとえば、ローカル環境でphp 5.4を実行している場合(および正常に動作する場合)、php 5.3がインストールされている新しいマシンでコードをテストしている場合があります。 array()に[]などの5.4構文を使用している場合、上記の状況が発生します。