无法使用 Nginx(反向代理+SSL 协商)和 Tomcat 上传大文件
Posted
技术标签:
【中文标题】无法使用 Nginx(反向代理+SSL 协商)和 Tomcat 上传大文件【英文标题】:Can not upload big files with Nginx (Reverse proxy+SSL negotiation) and Tomcat 【发布时间】:2013-07-29 17:55:10 【问题描述】:配置:
nginx 作为反向代理 + SSL 协商 Apache Tomcat。似乎一切正常,除了文件上传。由于某种原因,文件上传永远不会完成。通过下面列出的配置,我可以上传小文件(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 配置(client_body_temp_path、proxy_temp_path、proxy_temp_file_write_size)。他们似乎没有帮助。
====
更新 - 2013 年 7 月 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
我在上面的日志 sn-p 中注意到“http 上游发送请求处理程序”,在成功的情况下,我看到了:
2013/07/30 16:29:44 [debug] 14208#0: *1 http upstream dummy handler
知道“http 上游发送请求处理程序”和“http 上游虚拟处理程序”是什么意思,以及它们的含义吗?
【问题讨论】:
【参考方案1】:我遇到了同样的问题。 Michael Härtl 的答案是正确的。在我的情况下,这是成功的设置:
在 nginx.conf 中添加:
http
# at the END of this segment!
client_max_body_size 1000m;
【讨论】:
您的“本段结束”评论拯救了我的一天;当我把它放在开头时,它完全被忽略了。【参考方案2】:您要查找的设置可能是client_max_body_size
。
语法:client_max_body_size 大小;默认值:client_max_body_size 1m;上下文:http、服务器、位置
设置客户端请求正文的最大允许大小,在“Content-Length”请求标头字段中指定。如果请求中的大小超过配置的值,则会向客户端返回 413(请求实体太大)错误。请注意,浏览器无法正确显示此错误。将 size 设置为 0 将禁用对客户端请求正文大小的检查。
【讨论】:
我确实在“http”级别指定了client_max_body_size:client_max_body_size 1000M; client_body_buffer_size 256k; 对我来说,解决方案是将其移动到http
块的底部,正如 @rmuller 在其他回复中所建议的那样。以上是关于无法使用 Nginx(反向代理+SSL 协商)和 Tomcat 上传大文件的主要内容,如果未能解决你的问题,请参考以下文章
设置好 NGINX 反向代理后,如何在引入 NGINX 反向代理的 NGINX 上配置 SSL 直通? [复制]