PHPを使用するサイトでランダムに500エラーが表示される場合の対処法

シェアする

WordPressを初めとする、PHPを使用するサイトでランダムに500エラーが発生する場合と、その解決策に関して。

広告



症状

  • Webサイトにアクセスすると、ランダムに500 Internal Server Errorエラーを表示する。
  • error_logには、次のような記録が残る。
    [Sat Aug 10 16:26:20.432523 2019] [fcgid:warn] [pid 13969] (104)Connection reset by peer: [client xxx.xxx.xxx.xxx:xxxxx] mod_fcgid: error reading data from FastCGI server, referer: https://xxxxxxxx/wp-admin/options-general.php
    [Sat Aug 10 16:26:20.432697 2019] [core:error] [pid 13969] [client xxx.xxx.xxx.xxx:xxxxx] End of script output before headers: options-writing.php, referer: https://xxxxxxxx/wp-admin/options-general.php
    
  • Apache側には、次のようなログが残っている。
    [Sat Aug 10 16:26:20.585573 2019] [fcgid:error] [pid xxxxx] mod_fcgid: process /home/xxxxxxxx/fcgi-bin/php7.2.fcgi(14898) exit(communication error), get unexpected signal 11

    理由

    該当のPHPプロセスが、何かしらの理由でSegmentation Faultにより落ちています。signal 11はSegmentation Faultが発生したことを示すシグナルです。
    Segmentation Faultが発生する理由は多数あり一概には解説できませんが、多くの場合は読み込んでいるPHPモジュールのいずれかに問題があります。

    自分でモジュールを追加した場合は、最近追加したモジュールに心当たりがないか確認してみてください。そうでない場合は、よくあるケースとしてAPCuが問題を起こしている可能性が高いです。

    APCu

    何らかの理由でAPCuが正常に動作しないか、PHPスクリプトとの相性が悪いためにこのようなエラーを生じさせていることがあります。
    このような場合は、apcu.ini内でapc.shm_sizeを増やしてみてください。バッファ容量が不足しているためにエラーを表示しているかもしれません。
    また、それでも解決しない場合はAPCuを無効にすると解決する場合があります。apc.enabled=0を設定することでAPCuを無効とすることができます。

    その後

    当サイトでも同様の事象が発生していましたが、何度もエラーが発生しているうちにsignal 6(SIGABRT)が発生したため、問題のモジュールを特定できました。

    *** Error in `/bin/php73-cgi': corrupted double-linked list (not small): 0x0000557a77190120 ***
    ======= Backtrace: =========
    /lib64/libc.so.6(+0x7f754)[0x7f22f0aeb754]
    /lib64/libc.so.6(+0x8307f)[0x7f22f0aef07f]
    /lib64/libc.so.6(__libc_malloc+0x4c)[0x7f22f0af132c]
    /lib64/libc.so.6(+0xc0401)[0x7f22f0b2c401]
    /lib64/libc.so.6(+0xc79c3)[0x7f22f0b339c3]
    /lib64/libc.so.6(glob64+0x1424)[0x7f22f0b35554]
    /bin/php73-cgi(+0x21d6d0)[0x557a763cc6d0]
    /bin/php73-cgi(execute_ex+0x4218)[0x557a7651ecd8]
    /opt/remi/php73/root/usr/lib64/php/modules/newrelic.so(+0x3dcc2)[0x7f22e4bb4cc2]
    /opt/remi/php73/root/usr/lib64/php/modules/newrelic.so(+0x23e0a)[0x7f22e4b9ae0a]
    /opt/remi/php73/root/usr/lib64/php/modules/newrelic.so(+0x244f2)[0x7f22e4b9b4f2]

    New Relic APMのPHPエージェント(newrelic.so)が問題を引き起こしていました。
    最近発生したバグかは不明ですが、500エラーの発生を引き起こす原因となっては困るので無効化しました。

  • 広告



    シェアする

    フォローする

    広告