内部エラー500 Apache、しかしログには何もない?


122

アプリの特定のアドレスにHTTP POSTを実行しようとすると、500の内部サーバーエラーが発生します。私は仮想ホストファイルで指定されたカスタムログディレクトリのサーバーログを調べましたが、エラーはそこに表示されないため、これをデバッグすることはお尻の苦痛でした。

Apacheで内部500エラーをエラーログに記録するにはどうすればよいですか?


1
仮想ホストでPHPを使用すると同じ問題が発生しました...エラーはありません(Apache2、Ubuntu)。

1
私たちでは、それらをアクセスログに送信していました(おそらくApacheの観点から、それは正しく機能していて、より深い層(この場合、Passenger / Rails)から単に渡すだけでした)。誰かが自分の頭を傷つけている場合に備えて、このメモをここに置いてください。
トムハント2016

回答:


-4

注意:元の投稿者は特に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ではない


6
サーバーのErrorLogを確認したところ、何も見つかりませんでした。
wcolbert

1
あなたは正しいです、それはphpスクリプトの問題であることが判明しました。PEARライブラリがインストールされていません。VPSにインストールしましたが、すべて順調です。皆さんありがとう!
wcolbert

260
「ログを確認してください」が「ログが空である理由」に対する回答として受け入れられるにはどうすればよいですか
アルバロ・ゴンサレス

4
カスタムエラーログではなく、デフォルトのエラーログをユーザーに示しました。多くの場合、スクリプトが何らかの理由で失敗すると、エラーはデフォルトのエラーログに送られます
DeveloperChris

1
PHPでは、設定されたapacheエラーログには何もありませんでしたが、でエラーが見つかりましたgrep PHP /var/log/syslog。おそらく私が持っていerror_log = syslogたからでしょう/etc/php5/apache2/php.ini
mivk 2016年

145

500内部サーバーエラーがApacheエラーログに記録されないのはなぜですか?

500内部サーバーエラーの原因となるエラーは、PHPモジュールが原因です。デフォルトでは、PHPはこれらのエラーをログに記録しません。Webリクエストが物理的に可能な限り高速になることを望んでいる理由は、エラーをログに記録して攻撃者がエラーを監視できるようにすることはセキュリティ上の問題です。

内部サーバーエラーログを有効にするこれらの手順はUbuntu 12.10PHP 5.3.10およびで使用できApache/2.2.22ます。

PHPロギングがオンになっていることを確認します。

  1. php.iniファイルを見つけます。

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
  2. そのファイルをルートとして編集します。

    sudo vi /etc/php5/apache2/php.ini
    
  3. php.iniでこの行を見つけます。

    display_errors = Off
    
  4. 上記の行を次のように変更します。

    display_errors = On
    
  5. 次のファイルが表示されます。

    ;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. セミコロンはコメントです。つまり、行は有効になりません。これらの行を次のように変更します。

    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と通信するのは、これらのすべてのエラーをログに記録することです。警告:パフォーマンスが大幅に低下するため、ロギングには時間がかかり、時間もかかるため、本番環境ではこれを有効にしたくない。

  7. PHPとApacheを再起動すると、変更が適用されます。

  8. 500内部サーバーエラーを再度発生させるために行った操作を実行し、ログを確認します。

    tail -f /var/log/apache2/error.log
    
  9. 最後に、次のような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
    

46
display_errors画面にエラーを出力しますlog_errorsエラーをログファイルに書き込みます
daVe 2014

11
これは、この質問に対する標準的な答えになるはずです。
デビッド

9
@WanLiqunかなり良い情報ですが、質問に言及されていないPHPにのみ適用されます。
アルバロ・ゴンサレス

1
「500内部サーバーエラーの原因となるエラーは、PHPモジュールが原因です。デフォルトでは、PHPはこれらのエラーをログに記録しません。」誰がPHPについて言及しましたか?PHPでServer 500 Loggingが無効になっていることは想定であり、多くの場合、間違った想定です。Apacheは障害のあるモジュール(この場合はphp)からのサーバー500エラーをログに記録しますが、ほとんどの場合、/ var / log / apache2 / error.log(debianまたは類似のものと想定)に行きます
DeveloperChris

4
この答えは、画面にエラーをダンプするための悪いアドバイスから始まります。
luqo33

11

Apacheエラーログとは別のファイルである可能性があるPHPエラーログを確認します。

に移動してそれを見つけphpinfo()、error_log属性を確認します。設定されていない場合。それを設定してくださいhttps//stackoverflow.com/a/12835262/445131

投稿しようとしているものに対してpost_max_sizeが小さすぎるか、他の最大メモリ設定の1つが低すぎる可能性があります。


1
問題は、「Apacheに内部500エラーをエラーログに記録させるにはどうすればよいですか?」これはおそらくコメントになるはずです。
jww 2017

11

私はこれに遭遇しましたが、それは私の.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)。


1
問題は、「Apacheに内部500エラーをエラーログに記録させるにはどうすればよいですか?」これはおそらくコメントになるはずです。
jww 2017

良い観察。これらのエラーをログに記録する手順を追加しました。
bmaupin

7

あなたの場合は内部サーバーエラー情報がログファイルに表示されない、あなたはおそらくする必要がApacheサービスを再起動します

私は、Apache 2.4(少なくともWindowsプラットフォームでは)が頑固にログファイルのフラッシュを拒否する傾向があることを発見しました。代わりに、ログに記録されたデータはかなり長い間メモリに残ります。パフォーマンスの観点からは良い考えですが、開発時に混乱する可能性があります。


これは私にとってLinuxの正解でした。元のerror.log(これはキャラクターデバイスファイルでした)を削除してtouch 777 error.logに置き換えた後でも、Apacheは再起動されるまで書き込みません。
アデルマー、2015

2

@ eric-leschinskiの答えは正しいです。

ただし、サーバーAPIがFPM / FastCGIの場合は別のケースがあります(Centos 8のデフォルト、またはphpinfo()関数の使用を確認できます)

この場合:

  1. phpinfo()phpファイルで実行します。
  2. Loaded Configuration Fileparamを探して、PHPの構成ファイルの場所を確認します。
  3. @ eric-leschinskiの回答のように設定ファイルを編集します。
  4. Server APIパラメータを確認してください。サーバーがApacheハンドルAPIのみを使用する場合-> Apacheを再起動します。サーバーがphp-fpmを使用している場合は、php-fpmサービスを再起動する必要があります

    systemctl restart php-fpm

    php-fpmログフォルダーのログファイルを確認します。例えば/var/log/php-fpm/www-error.log


1

私の場合、それはhttpd.confのErrorLogディレクティブでした。あきらめた後、偶然に気づいただけです。発見を共有することを決定しました)今、私は500エラーを見つける場所を知っています。


回答に詳細を
Yahya Hussein

ApacheにはMagento(CMS-Content Management System)を使用しています。Magentoコアクラスを使用しているページにエラー500がありました。エラーメッセージが表示される場所が見つかりませんでした。ここでのいくつかの回答によると、私はApacheログ/ etc / httpd / logs / error_logを検索しようとしました。しかし、そこには何もありませんでした。後で、そのhttpd.confに特定のWebホストの行があり、ログパスを定義していることがわかりました:<VirtualHost。... ErrorLog / usr / www / log / error_logしたがって、一般的なApacheログではなく、より具体的なホストログを調べる必要がありました。
ユージーンリセノク2018

1

HttpProtocolOptions UnsafeApache設定ファイルに追加して、Apacheサーバーを再起動します。エラーの詳細が表示されます。


0

実行しているphpのバージョンがコードベースと一致していることを確認してください。たとえば、ローカル環境でphp 5.4が実行されていて(問題なく動作している)、php 5.3がインストールされている新しいマシンでコードをテストしている可能性があります。array()に[]などの5.4構文を使用している場合は、上記のような状況になります。


問題は、「Apacheに内部500エラーをエラーログに記録させるにはどうすればよいですか?」これはおそらくコメントになるはずです。
jww 2017

0

静的ファイルにアクセスしてみてください。これも機能しない場合は、ルート「/」または「c:\」からファイルのディレクトリまでのすべてのディレクトリに移動し、「。htaccess」ファイルが含まれているかどうかを確認します。

私はかつて「c:\」にファイルを残し、それは最も奇妙な結果をもたらしました。


1
問題は、「Apacheに内部500エラーをエラーログに記録させるにはどうすればよいですか?」
jww

0

コードのどこかでエラー報告を無効にしていないか確認してください。

コード内に無効にした場所があったので、その後にデバッグコードを追加しました。

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.