質問: 発生している問題 --------- Nginx(1.10) + PHP-FPM(7.0) + MariaDB(10.0) + CodeIgniter(3.1.9) でサイトを構築しています。 以下のプログラムを実行すると、504 Gateway Time-out が発生します。 ``` while(true){ sleep(30); } ``` NginxやPHP-FPMにタイムアウトを設定しているため、このエラー自体は通常の動きだと思うのですが、1箇所で504エラーが発生すると、同サイトへのすべてのアクセスが504エラーとなるため、対応方法を知りたいと考えています。 ヒントになりそうな情報などでもよいので、ご存知の方がいらっしゃれば教えていただきたいです。よろしくお願いいたします。 わかっていること --------- #### PHP-FPM・MariaDB を再起動すると回復する すべてのアクセスが504エラーとなったときに PHP-FPM もしくは MariaDB を再起動すると回復します。(Nginxは再起動しても回復しませんでした。) #### DBプロセスをkillすると回復する 問題のプログラムを実行時にDBプロセスを確認すると、以下プロセスの11299 が開始され、プロセスが残り続けます。それ以降のアクセスは 11303 のようにロック状態となります。11299 をkillすると、回復します。 ``` MariaDB [(none)]> show processlist; +-------+----------+-----------+----------------+---------+------+-----------+-----------------------------------------------------+----------+ | Id | User | Host | db | Command | Time | State | Info | Progress | +-------+----------+-----------+----------------+---------+------+-----------+-----------------------------------------------------+----------+ | 11282 | root | localhost | NULL | Query | 0 | init | show processlist | 0.000 | | 11299 | UserName | localhost | DatabaseName | Sleep | 81 | | NULL | 0.000 | | 11303 | UserName | localhost | DatabaseName | Query | 71 | User lock | SELECT GET_LOCK('27fac...', 300) AS ci_session_lock | 0.000 | +-------+----------+-----------+----------------+---------+------+-----------+-----------------------------------------------------+----------+ MariaDB [(none)]> kill 11299; ``` #### CodeIgniter特有の問題の可能性が高い 通常のPHPプログラムとしてsleepを実行すれば、想定通りの動作(1箇所のみ504エラーで同サイトへのすべてのアクセスは問題なく処理できる)となります。 #### エラーメッセージは特になし nginx・php-fpm・mariadbについてエラーログを確認しましたが、気になる点はありませんでした。 試したこと ------ #### pconnectの設定値がFALSEであることを確認しました http://ryokwkm2.hatenadiary.jp/entry/2015/09/28/161925 #### CodeIgniterを最新にしてみました
回答: 一旦自己解決しました。 ログの見落としがありました。。 ``` WARNING: [pool www] server reached pm.max_children setting (5), consider raising it ``` というログが出力されており、pm.max_childrenの上限を変更することで動作するようになりました。 またその後の調査で MariaDB・CodeIgniter を利用していない場合にも、発生することがわかりました。 以下PHPファイルを用意し、5つ(pm.max_children数)のブラウザタブからアクセスすると、再現しました。 ``` ``` おそらく以下のような状況が発生していたのではと考えています。 > > 既存の PHP リクエストがタイムリーに処理されない場合、新しい PHP リクエストは待機モードのままになります。Nginx の fastcgi_read_timeoutの値を超えると、504 Gateway Time-outエラーが発生します。 > > https://jp.alibabacloud.com/help/faq-detail/55207.htm > > > もし私の認識に間違いがあったり、pm.max_children変更以外の解決方法などあれば、回答いただければと思います。