web-dev-qa-db-ja.com

nginxアップロードclient_max_body_sizeの問題

Nginx/Ruby-on-Railsを実行していますが、ファイルをアップロードするためのシンプルなマルチパートフォームがあります。アップロードするファイルの最大サイズを制限するまで、すべてが正常に機能します。そのためには、nginxclient_max_body_size1m(1MB)に設定しますそのルールに違反した場合の応答でHTTP 413(リクエストエンティティが大きすぎます)ステータスを期待します。

問題は、HTTP 413エラーページを表示する代わりに1.2 MBファイルをアップロードすると、ブラウザーが少しハングし、「ページの読み込み中に接続がリセットされました」というメッセージが表示されて終了することです。

私は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

113
krukid

nginxは、クライアントが413応答を送信して接続を閉じることでclient_max_body_sizeよりも大きなボディを送信することをクライアントに通知すると「高速で失敗します」。

ほとんどのクライアントは、要求本文全体が送信されるまで応答を読み取りません。 nginxは接続を閉じるため、クライアントは閉じたソケットにデータを送信し、TCP RSTを発生させます。

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

123
Joe Shaw

最後にアップロードが停止しますか?クラッシュする前に99%? nginxは着信データをバッファリングする必要があるため、クライアントボディとバッファが重要です。 body config(リクエスト本文のデータ)は、nginxがマルチパートフォームクライアントからアプリのロジックへのバイナリデータのバルクフローを処理する方法を指定します。

clean設定は、nginxに着信バッファをファイルに保存し、後でこのファイルを削除してディスクから消去するように指示することにより、メモリと消費の制限を解放します。

body_in_file_onlycleanに設定し、client_max_body_sizeのバッファーを調整します。元の質問の構成ではsendfileがすでにオンになっており、タイムアウトも長くします。以下の設定を使用して、これを修正し、ローカル構成、サーバー、およびHTTPコンテキスト全体で適切にします。

client_body_in_file_only clean;
client_body_buffer_size 32K;

client_max_body_size 300M;

sendfile on;
send_timeout 300s;
48
Bent Cardan

ドキュメント から:

ブラウザはこのエラーを正しく表示する方法を知らないことに注意する必要があります。

Firebug または Live HTTP Headers (両方のFirefox拡張機能)などのツールを使用してHTTPを行き来して検査すると、これが起こっていると思われます実際に何が起こっているかを確認します。

7
ZoFreX