php-fpm+nginxで「504 Gateway Time-out」が出た時の対処法

過去にphp-fpm(FastCGI)+nginx環境で「504 Gateway Time-out」が出たので、その時の対処法を記載します。

504 Gateway Time-outとは、クライアントからのリクエストを受けたサーバが更に別サーバにリクエストを送信した際に、別サーバからの応答が一定時間以内に返って来ていないことを表しています。

f:id:eno0514:20160416223941p:plain
参照: The point of no return » Blog Archive » Nginx with PHP-FPM on CentOS 6

最初に試してほしい対処法は処理の実行時間を延ばすことです。

必要な設定は以下の3つになります。

php.ini
max_execution_time = 180
 
• php-fpm.conf
request_terminate_timeout 180
 
• nginx.conf
fastcgi_read_timeout 180

*数値は任意の値

• max_execution_time
PHPスクリプトの実行時間
• request_terminate_timeout
リクエストを終了するまでの待ち時間
fastcgi_read_timeout
FastCGIプロセスへデータを送信するための待ち時間

3つのファイルの設定を変更して、

$ sudo service php-fpm reload
$ sudo service nginx reload

php-fpm、Nginxの設定ファイルを再読み込みすれば終わりです。

1つ注意してほしい点がありまして、それはmax_execution_timeの設定です。

この設定で制限できる実行時間とは、PHPスクリプトの処理時間のみを指しています。
例えば、データベースにアクセスしたときの応答が返ってくるまでの待ち時間などは含みません。
データベースの反応が遅くなるときは、どの処理に時間がかかっているのかを検出する必要があります。

max_execution_timeはサーバーの負荷を防止するのが目的のため、単純に設定値を大きくするのは得策ではありません。
設定値を大きくするのはバッチ処理など重い処理を行う必要がある場合などに留めておきましょう。

以上になります。

参考:
504 Gateway Timeout and How to Fix it | Nginx Tips
仕事で使える魔法のLAMP(37):安全を考えてPHPの実行時設定を調整する - @IT