Nginx/Ruby-on-Railsを実行していますが、ファイルをアップロードするためのシンプルなマルチパートフォームがあります。アップロードするファイルの最大サイズを制限するまで、すべてが正常に機能します。そのためには、nginxclient_max_body_size
を1m(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
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
応答で応答します。
最後にアップロードが停止しますか?クラッシュする前に99%? nginxは着信データをバッファリングする必要があるため、クライアントボディとバッファが重要です。 body config(リクエスト本文のデータ)は、nginxがマルチパートフォームクライアントからアプリのロジックへのバイナリデータのバルクフローを処理する方法を指定します。
clean
設定は、nginxに着信バッファをファイルに保存し、後でこのファイルを削除してディスクから消去するように指示することにより、メモリと消費の制限を解放します。
body_in_file_only
をclean
に設定し、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;
ドキュメント から:
ブラウザはこのエラーを正しく表示する方法を知らないことに注意する必要があります。
Firebug または Live HTTP Headers (両方のFirefox拡張機能)などのツールを使用してHTTPを行き来して検査すると、これが起こっていると思われます実際に何が起こっているかを確認します。