LoginSignup
1
3

More than 1 year has passed since last update.

[「413 Request Entity Too Large 」 Nginx で、ファイルのアップロードエラーの対処方法

Last updated at Posted at 2021-11-11

はじめに

WebサーバーとしてNginxを使用したサーバーで、3GBのsqlファイルをadminerでインポートする際、413 Request Entity Too Large504 Gateway Time-outのエラー対処に手間取ったため、方法をまとめます。

基本的に、データ量が多いと、データの送受信の時間を伸ばすデータファイル容量の上限を増やす必要があります。

sqlファイルのインポートに限らず、PHPで実行時の504 Gateway Time-outエラー対処に使用できる記事になります。

前提条件

  • DB管理はadminerを使用。phpmyadminでも問題なし
  • nginxを使用
  • EC2にadminerを導入(以下の記事参考

sqlファイルのインポート方法

  1. adminer.php が配置されているディレクトリ内に、エクスポートしたsqlファイルをそのまま、アップロードします。私の場合、圧縮タイプの.gzタイプだとインポートできませんでしたので、ファイルでアップロードしました。
  2. アップロードしたsqlファイルをadminer.sqlにリネームします。
  3. 下記の画像のように、サーバーから実行をクリックします。

スクリーンショット 2021-11-11 22.44.03.png

実行すると、数十秒で以下のエラーが発生します。

504 Gateway Time-out

結論

以下の3つのファイルELBを修正します。

  • nginx.conf
  • php.ini
  • php-fpm.conf
  • ELB(使用時のみ)

nginx.conf

$ sudo vim /etc/nginx/nginx.conf

以下の6つを記述します。

/etc/nginx/nginx.conf
client_max_body_size 500m;
send_timeout 6000;
fastcgi_read_timeout 6000;
proxy_connect_timeout 6000;
proxy_read_timeout    6000;
proxy_send_timeout    6000;
設定 意味
client_max_body_size アップロードサイズ制限
send_timeout クライアント(ブラウザ)とのタイムアウトの秒数
fastcgi_read_timeout FastCGIプロセスへデータを送信するための待ち時間
proxy_connect_timeout バックエンドサーバとの接続タイムアウト時間の指定。バックエンドサーバに接続要求を送り、n秒間接続できない場合発生。
proxy_read_timeout バックエンドサーバからのデータ受信のタイムアウト秒数を指定
proxy_send_timeout バックエンドサーバへのデータ転送のタイムアウトの秒数を指定。

詳しくはこちら

以下は挿入箇所になります。
httpserverlocationのどこでもよいです。

/etc/nginx/nginx.conf
 server {
        listen       80;
        server_name  test.com;
        root         /usr/share/nginx/html/test;

        location / {


            location ~ \.php$ {
                fastcgi_pass unix:/var/run/php-fpm/www.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_script_name;
                include fastcgi_params;

                client_max_body_size 500m;
                send_timeout 6000;
                fastcgi_read_timeout 6000;
                proxy_connect_timeout 6000;
                proxy_read_timeout    6000;
                proxy_send_timeout    6000;
            }
        }
    }

php.ini

まずphp.iniファイルを検索します

$ php -i | grep php.ini

Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

$ sudo vim /etc/php.ini
/ect/php.ini
max_execution_time = 3000
memory_limit = 5000M
upload_max_filesize = 5000M
post_max_size = 5000M
設定 意味
max_execution_time PHPの最大実行時間(秒) 。「0」だと無制限になります。
memory_limit PHPのメモリ使用量の上限。「-1」だと無制限になります。
upload_max_filesize 1つのファイルアップロードサイズの上限値
post_max_size POST送信全体のデータサイズ上限

post_max_sizeは送信全体のデータサイズなので、upload_max_filesize=2Mの設定時、2Mのファイルを3つ同時に送信するためには、post_max_size=6M以上にする必要があります。

もちろんメモリ使用量は、送信全体のデータサイズ以上の量が必要なため、以下の設定にしましょう。
memory_limit ≧ post_max_size ≧ upload_max_filesize

php-fpm.conf

設定ファイルは、/etc/php-fpm.d 配下にあります。
私の場合は、/etc/php-fpm.d/www.confでした。

$ sudo vim /etc/php-fpm.d/www.conf
/etc/php-fpm.d/www.conf
;request_terminate_timeout = 0
設定 意味
request_terminate_timeout 単一のリクエストを処理する際のタイムアウト。「0」もしくは「コメントアウト」にすると、無制限(タイムアウトされない)になります。

ELB(使用時のみ)

アイドルタイムをデフォルト60秒から4000秒(最大)にします。
アイドルタイムが早いと、Webサーバーからのレスポンスを完了する前に、セッションを切ってしまいます。

スクリーンショット 2021-11-11 22.37.32.png

3つのファイル修正後、再読み込みします。

php-fpmnginxを再起動します。


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

もしくは↓

$ sudo systemctl restart php-fpm
$ sudo nginx -s reload

なにも表示されなければ、問題なく再起動、読み込みできている証拠です。

sqlファイルのインポート再実行

再度、サーバーから実行をクリックします。
以下の画像のようにページに接続が中断されました。という表示がされますが、裏でsqlファイルがインポートしている最中です。
インポートしたDBのテーブル画面(下記の画像)に移動し、ページを更新すると、少しずつDBのテーブルやデータが増えてきます。
完了するのを待ちましょう!!

サーバーから実行後、この画面に遷移しても大丈夫です!
スクリーンショット 2021-11-11 11.41.57.png

↓この画面で、ページを更新すると、少しずつDBのテーブルやデータが増えてくると思います。
スクリーンショット 2021-11-11 23.12.00.png

エラー集

メモリ上限エラー

メモリ上限が少なく設定されていることが原因です。
memory_limitをふやしましょう。

Fatal error: Allowed memory size of xxxxxx bytes exhausted

以下のコマンドで現在のメモリ使用量設定を確認できます。

$ php -i | grep memory_limit
memory_limit => 128M => 128M

ファイル容量の上限エラー

アップロードするファイル容量が大きいことが原因です。
上記の方法を設定し、アップロードのデータ容量の上限を増やしましょう。

413 Request Entity Too Large

実行時間のタイムアウト

実行時間が多くかかったことが原因です。
php.iniファイルを内のmax_execution_timeを伸ばしましょう。

Fatal error: Maximum execution time of 60 seconds exceeded
upstream timed out (110: Connection timed out) while reading response header from upstream
recv() failed (104: Connection reset by peer) while reading response header from upstream

参考

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3