1. ホーム
  2. http

[解決済み] nginx アップロードのclient_max_body_size問題

2022-08-21 07:47:01

質問

nginx/ruby-on-rails を使用していて、ファイルをアップロードするためのシンプルなマルチパートフォームを持っています。 アップロードするファイルの最大サイズを制限することに決めるまでは、すべてうまくいっていました。 これを実現するために、nginx の client_max_body_size 1m (1MB) で、そのルールが破られたときの応答として、HTTP 413 (Request Entity Too Large) ステータスを期待します。

問題点 は、1.2 MB のファイルをアップロードすると、HTTP 413 エラー ページが表示されるのではなく、ブラウザが少しハングして、" Connection was reset while the page was loading" というメッセージで終了することです。

nginx が提供するすべてのオプションを試しましたが、何も動作しないようです。どなたか、これについて何かアイデアをお持ちではないでしょうか?

私の nginx.conf です。

worker_processes  1;
timer_resolution  1000ms;
events {
    worker_connections  1024;
}

http {
    passenger_root /the_passenger_root;
    passenger_ruby /the_ruby;

    include       mime.types;
    default_type  application/octet-stream;

    sendfile           on;
    keepalive_timeout  65;

    server {
      listen 80;
      server_name www.x.com;
      client_max_body_size 1M;
      passenger_use_global_queue on;
      root /the_root;
      passenger_enabled on;

      error_page 404 /404.html;
      error_page 413 /413.html;    
    }    
}

ありがとうございます。


**Edit**

環境/UA: Windows XP/Firefox 3.6.13

どのように解決するのですか?

を超えるサイズのボディを送信しようとしていることをクライアントが通知すると、nginx は "fail fast" となります。 client_max_body_size を超えるサイズのボディを送信しようとすると、413 レスポンスを送信して接続を閉じます。

ほとんどのクライアントは、リクエストボディ全体が送信されるまでレスポンスを読みません。 nginxは接続を閉じるので、クライアントは閉じたソケットにデータを送信し、TCP RSTを引き起こします。

HTTP クライアントがサポートしている場合、これを処理する最良の方法は Expect: 100-Continue ヘッダを送ることです。 Nginx は 1.2.7 以降、これを正しくサポートしており、返信には 413 Request Entity Too Large レスポンスではなく 100 Continue もし Content-Length が最大ボディサイズを超えている場合。