週末ブログのアクセス数が激減して、なにか検索エンジンのアルゴリズムでも変わったのか?と思ったがもともとこのサイトは特定のコンテンツにアクセスは依存していないのでいろいろ調べると時間がたつと500エラーでサイトにアクセスできなくなることに気付いた。
- Nginxは1.2.7
- PHP 5.4.11->5.4.13にあげたら起きるようになった。
- nginxのエラーではrecv() failed (104: Connection reset by peer)が出力されている。任意のページで。頻繁ではない。
- 上記のエラー以外のリクエストでもサイトには接続できない。nginxのエラーログには出力されておらず、accessログには単なる500エラー。
- phpのエラーログは何も出力されていない。
- php-fpmのエラーログにはchild xxxx exited with code 1 after xxx.xxx seconds from startが出力されている。頻繁ではない。
- サイトに接続できないときに同じサーバの別ドメインのphpコードは動いていることがある。
- php-fpmを再起動すると接続できるがしばらくするとまた問題が起きる。
頻繁ではないというのはすべてのリクエストでエラーがでているというわけでないという意味。これが一番わからない。ログを見るとは何らかの原因でphp-fpmに問題がおき、nginxから接続できなくなり、それ以降はエラーログにも残らず500エラーのレスポンスとして処理されているような状態になっている。
エラー名でググるとrequest_terminate_timeoutを設定するというのがでてくる。腑に落ちないままやってみたが効果なし。
デバッグログを出してみたやはり子プロセスが問題あったまま動き続けている?
WARNING: pid 7583, fpm_children_bury(), line 252: [pool www] child 7584 exited with code 1 after 397.948034 seconds from start NOTICE: pid 7583, fpm_children_make(), line 421: [pool www] child 7648 started
request_terminate_timeoutの設定で回避するというのが腑に落ちないのは上記のログを見てもわかるように新しい子プロセスを起動しているのにそのあと接続できないところ。子プロセスがbusyになることが問題なのではなく、その状態になるとnginxとphp-fpmの関係が修復不能になる点。
結局PHPを5.4.11に戻した。とりあえずこれで様子を見る。ただ今回いろいろ調べて単純にphp-fpmの設定は見なおした方がいいと思った。
しかしトラブってもいいように週末パッケージを更新したのにすぐに問題がおきなくて結局日曜日の夜に気がつくとかなんの意味もない。
なんの意味もない。なんの意味もない。
月曜日はphp-fpmを定期的に再起動させるというどうしようもない回避策を行なっていました。