web-dev-qa-db-ja.com

Nginx(リバースプロキシ+ SSLネゴシエーション)とTomcatで大きなファイルをアップロードできません

構成:

  • リバースプロキシとしてのNginx + SSLネゴシエーション
  • ApacheTomcat。

ファイルのアップロードを除いて、すべてが正常に機能しているようです。何らかの理由で、ファイルのアップロードが完了しません。以下の設定で、小さなファイル(4K)をアップロードできます。 194Kファイルでアップロードが失敗します。 「client_body_buffer_size」を256Kに増やすと、194Kファイルをアップロードできますが、500Kファイルのアップロードが失敗します。 「client_body_buffer_size」を256Kを超えて増やしても、影響はありません。

注:Tomcatに直接アクセスして500Kファイルをアップロードすると、数ミリ秒で終了します。

したがって、Nginxの構成に問題があるようです。任意の提案は大歓迎です。

    upstream Tomcat_server {
        server 127.0.0.1:9090 fail_timeout=0;
        keepalive 16;
    }

location / {
                root   /xyz;
                proxy_http_version 1.1;
           proxy_pass http://Tomcat_server;
            proxy_set_header Connection "";
            proxy_set_header Host $Host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Server $Host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_buffering         on;
            proxy_connect_timeout 75;
            proxy_send_timeout 180;
            proxy_read_timeout 1200;

        keepalive_timeout  120;
        proxy_buffer_size   128k;
        proxy_buffers   4 256k;
        proxy_busy_buffers_size   256k;
       proxy_temp_path /tmp/nginx/proxy;
       proxy_temp_file_write_size 1000m;

            }

Nginx configに他のいくつかのパラメーター(client_body_temp_path、proxy_temp_path、proxy_temp_file_write_size)を追加してみました。彼らは役に立たなかったようです。

====

更新-2013/07/30:

さらに調査したところ、196K以上のファイルのアップロードに問題があることが判明しました。 194Kファイルが機能します。 「client_body_buffer_size」の値は256Kに設定されています。

Nginxのデバッグログには、失敗した場合に次の情報が表示されます。

2013/07/30 16:29:57 [debug] 14208#0: *1 recv: fd:11 2606 of 16384
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy status 200 "200 OK"
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy header: "Server: Apache-Coyote/1.1"
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy header: "Content-Type: text/html;charset=utf-8"
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy header: "Date: Tue, 30 Jul 2013 22:29:57 GMT"
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy header: "Connection: close"
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy header done
2013/07/30 16:29:57 [debug] 14208#0: *1 xslt filter header
2013/07/30 16:29:57 [debug] 14208#0: *1 HTTP/1.1 200 OK^M
Server: nginx/1.5.2^M
Date: Tue, 30 Jul 2013 22:29:57 GMT^M
Content-Type: text/html;charset=utf-8^M
Transfer-Encoding: chunked^M
Connection: keep-alive^M

2013/07/30 16:29:57 [debug] 14208#0: *1 write new buf t:1 f:0 000000001E61DAD8, pos 000000001E61DAD8, size: 168 file: 0, size: 0
2013/07/30 16:29:57 [debug] 14208#0: *1 http write filter: l:0 f:0 s:168
2013/07/30 16:29:57 [debug] 14208#0: *1 http cacheable: 0
2013/07/30 16:29:57 [debug] 14208#0: *1 posix_memalign: 000000001E62D450:4096 @16
2013/07/30 16:29:57 [debug] 14208#0: *1 http proxy filter init s:200 h:0 c:0 l:-1
2013/07/30 16:29:57 [debug] 14208#0: *1 http upstream process upstream
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe read upstream: 1
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe preread: 2465
2013/07/30 16:29:57 [debug] 14208#0: *1 readv: 1:13778
2013/07/30 16:29:57 [debug] 14208#0: *1 readv() not ready (11: Resource temporarily unavailable)
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe recv chain: -2
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe buf free s:0 t:1 f:0 000000001E61DBD0, pos 000000001E61DC5D, size: 2465 file: 0, size: 0
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe length: -1
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe write downstream: 1
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe write busy: 0
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe write: out:0000000000000000, f:0
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe read upstream: 0
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe buf free s:0 t:1 f:0 000000001E61DBD0, pos 000000001E61DC5D, size: 2465 file: 0, size: 0
2013/07/30 16:29:57 [debug] 14208#0: *1 pipe length: -1
2013/07/30 16:29:57 [debug] 14208#0: *1 event timer add: 11: 180000:1375223577332
2013/07/30 16:29:57 [debug] 14208#0: *1 http upstream request: "/upload/html?"
2013/07/30 16:29:57 [debug] 14208#0: *1 http upstream send request handler
2013/07/30 16:29:57 [debug] 14208#0: timer delta: 6
2013/07/30 16:29:57 [debug] 14208#0: posted events 0000000000000000
2013/07/30 16:29:57 [debug] 14208#0: worker cycle
2013/07/30 16:29:57 [debug] 14208#0: epoll timer: 179994

上記のログスニペットに「httpアップストリーム送信リクエストハンドラー」がありますが、成功した場合と同様に、次のように表示されます。

2013/07/30 16:29:44 [debug] 14208#0: *1 http upstream dummy handler

「httpアップストリーム送信リクエストハンドラー」と「httpアップストリームダミーハンドラー」の意味と、それらが何を意味するのか、何か考えはありますか?

12
kpdev

あなたが探している設定はおそらく client_max_body_size

構文:client_max_body_size size;
デフォルト:client_max_body_size 1m;
コンテキスト:http、サーバー、場所

「Content-Length」リクエストヘッダーフィールドで指定された、クライアントリクエストボディの最大許容サイズを設定します。リクエストのサイズが設定された値を超えると、413(Request Entity Too Large)エラーがクライアントに返されます。ブラウザはこのエラーを正しく表示できないことに注意してください。サイズを0に設定すると、クライアントリクエストの本文サイズのチェックが無効になります。

15
Michael Härtl

私も同じ問題を抱えていました。マイケル・ハートルの答えは正しいです。私の場合、これはトリックを行ったセットアップでした:

Nginx.confに以下を追加します。

http {
     # at the END of this segment!
     client_max_body_size 1000m;
}
12
rmuller