phpMyAdmin で 504 Gateway Time-out が出たときの対処法


phpMyAdminからSQLをインポートしようとする際、504 タイムアウトのエラーが出ることがあります。
今回は、その様な場合に何とかphpMyAdminからインポートができる様にしたい人の為の対処法です。

対処法1. ファイルサイズの問題

/etc/php.iniで下記3項目を編集します。

  1. アップロードできるファイルのサイズの最大値
    upload_max_filesize = 512M
  2.  POSTすることのできるデータの最大値
    post_max_size = 512M
  3. スクリプトが確保できるメモリの最大値
    memory_limit = 512M

この時、上記の値が以下の関係であることに注意してください。
upload_max_filesize ≦ post_max_size ≦ memory_limit

php.ini の設定反映は、Webのミドルウェアによって反映方法が違うので注意!

  • Apache:再起動すると反映
  • nginx:php-fpm の設定の再読み込みすると反映
$ /etc/init.d/php-fpm reload

反映されているかの確認方法

phpMyAdmin のインポートのファイル選択に下記のような記載がされていたらOKです!

(最長: 512MiB)

84cff65af46ba186825421a13f8cf07c

対処法2. 時間の問題

タイムアウトまでの時間を延ばす対処方法です。

php.ini に max_execution_time という項目があります。この値を変更しましょう。

max_execution_timeは、スクリプトがパーサ(※)に強制終了されるまでの時間を設定しています。
長々としたスクリプトがサーバーへ負荷を与えることを防ぐための設定です。
単位は秒で、0に設定すると制限時間なしになります。
(※パーサ: スクリプトの構文を解析してプログラムが扱うことのできるデータ構造の集合体へ変換するプログラム)

参考:
http://php.net/manual/ja/info.configuration.php#ini.max-execution-time
http://e-words.jp/w/%E3%83%91%E3%83%BC%E3%82%B5.html

設定例

※max_execution_timeだけでなく、その他の設定もした方がなお良いと思います。

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

request_terminate_timeout は単一のリクエストを処理する際のタイムアウトの設定です。この時間を過ぎるとワーカープロセスが kill されます。 このオプションは、’max_execution_time’ ini オプションが何らかの理由でスクリプトの実行を止められなかった場合に使われます。 値 ‘0’ は ‘Off’ を意味します。使用可能な単位: s(秒)(デフォルト), m(分), h(時間) あるいは d(日)、 デフォルト値: 0

参考:
http://php.net/manual/ja/install.fpm.configuration.php#request-terminate-timeout

fastcgi_read_timeout は FastCGIの応答の読み取りタイムアウトを設定します。 それは、nginxへの要求に対して応答を取得するためにどれくらい待つかを決定します。 60(秒)がデフォルト値です。

参考:
http://server-setting.info/centos/nginx-fastcgi-cache.html

設定の反映

Apacheの場合は再起動して設定の反映をさせます。

$ service httpd restart

nginxの場合、設定反映は設定の再読み込みコマンドで反映します。

$ service php-fpm reload
$ service nginx reload

ちなみに

この設定をした上で下記エラーが出た際はphpMyAdmin の設定を見直してください。

Maximum execution time of 300 seconds exceeded in ...

phpMyAdmin の設定ファイル(/path/to/phpmyadmin/libraries/config.default.php)の下記の値を変更します。

/**
 * maximum execution time in seconds (0 for no limit)
 *
 * @global integer $cfg['ExecTimeLimit']
 */
$cfg['ExecTimeLimit'] = 300;

単位は秒で、0で無制限です。

また、max_execution_time はphpスクリプトの処理時間のみであり、DBアクセスしたときの応答が返るまでの待ち時間は含みません。
回線の速度によるタイムアウトなら、mysql.connect_timeoutを延ばしましょう。

mysql.connect_timeout
接続の有効時間(単位:秒)。Linux では、この有効時間はサーバーからの 最初の応答の待ち時間としても使用されます。

番外

設定を変更せずに、データの変更方法を変えることで可能になる場合です。

データの削除処理は重いらしいので、
大量データを削除する場合は truncate で全削除して、後から必要なデータだけを入れ直した方が早いみたいです。


この記事をかいた人

About the author