Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can not upload big files with Nginx (Reverse proxy+SSL negotiation) and Tomcat

Configuration:

  • Nginx as reverse proxy + SSL negotiation
  • Apache Tomcat.

Everything seems to work fine, except for the file upload. For some reason file upload never completes. With the configuration listed below, I am able to upload small files (4K). Upload fails on a 194K file. When I increase "client_body_buffer_size" to 256K, I can upload the 194K file, but a 500K file upload fails. Increasing "client_body_buffer_size" beyond 256K has no impact.

Note: When I access Tomcat directly and upload the 500K file, it finishes in a few milliseconds.

So, looks like something is wrong with Nginx configuration. Any suggestions are greatly appreciated.

    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;

            }

I have tried adding several other parameters to nginx config (client_body_temp_path, proxy_temp_path, proxy_temp_file_write_size). They didn't seem to help.

====

Update - 2013/07/30:

Further investigation revealed that we have problem uploading 196K file and upwards. 194K file works. "client_body_buffer_size" value is set to 256K.

Nginx debug logs show the following in case of failue:

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

I notice "http upstream send request handler" in above log snippet, where as in success case, I see this:

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

Any idea what "http upstream send request handler" and "http upstream dummy handler" mean, and what they signify?

like image 393
kpdev Avatar asked Jul 29 '13 19:07

kpdev


1 Answers

I had the same problem. The answer of Michael Härtl is correct. In my case this was the setup that did the trick:

In nginx.conf add:

http {
     # at the END of this segment!
     client_max_body_size 1000m;
}
like image 155
rmuller Avatar answered Sep 27 '22 21:09

rmuller