Nginx走HttpProxy连JBoss在上传文件时的一个bug,及其解决

问题描述:

Nginx作为前端HttpServer 使用HttpProxy与JBoss进行连接
在上传比较大的文件时,JBoss已经返回结果,但是Nginx不立即将结果返回给浏览器,直到Nginx的HttpProxy与JBoss因为超时而断开后才返回结果给浏览器 这样导致的结果就是用户觉得上传文件需要很长时间.

问题原因分析:

Nginx HttpProxy转发的请求是Http 1.0的,就是说是不支持Keep-Alive的,那么也就是说只有当JBoss主动断开与HttpProxy的连接,或是超时被动断开,Nginx才认为这个请求已经完结了. 在看一下业务代码,因为在上传处理逻辑中会先进行一些前置判断,一旦判断失败,会不读取上传的文件然后直接返回一个Failed的Response回去,而这个时候就会出现上述的问题.
用Wireshark抓包分析HttpProxy与JBoss之间的通信发现,当JBoss一返回Response之后Nginx就会立马停止向JBoss Post数据,但是JBoss这个时候却不会断开与Nginx的连接. 再分析一下JBoss(即Tomcat)的对于endRequest的源码:

在当Tomcat处理完servlet后在org.apache.coyote.http11.Http11AprProcessor#endRequest的过程当中org.apache.coyote.http11.filters.IdentityInputFilter#end 会去读完所有的Content-Length这个长度的请求后才会Close连接,但是这个时候Nginx已经停止Post了,那么org.apache.coyote.http11.filters.IdentityInputFilter#end 取不到要取的数据就只有等待soTimeout(即配置的connectionTimeout)之后才超时断开连接,这个时候Nginx才会返回response给真正的Client 原因就是因为Nginx的处理和JBoss的处理不兼容引起的

问题解决:

* 需要在Servlet里面读完整个Request,或用一个Filter来读完也可以

本文来源于"阿里中间件团队播客",原文发表时间" 2011-09-10"

时间: 2024-10-25 13:57:25

Nginx走HttpProxy连JBoss在上传文件时的一个bug,及其解决的相关文章

.net上传文件时,用js调用后台函数,出现HTMLfile拒绝访问

问题描述 .net上传文件时,用js调用后台函数,出现HTMLfile拒绝访问 .net上传文件时,用js调用后台函数,出现HTMLfile拒绝访问,拜求大神指点, 解决方案 fileupload 控件中 选择文件,这时候文件还没有上次,只是在浏览器端. 文件上传后,在服务器端处理(大部分情况是postback). 这时候没法执行js. 不太明白你的问题,最好上点代码.

请问使用iframe进行无刷新上传文件时,好像没有效果?

问题描述 请问使用iframe进行无刷新上传文件时,好像没有效果? 在网上找了关于iframe 无刷新上传文件,上传时没有反应,这一般是什么原因?会不会是浏览器的原因啊? 解决方案 你代码有问题..和浏览器没关系.如果你跨域上传文件,是无法获取iframe里面的内容的 给iframe添加onload事件,获取iframe里面额返回值进行判断,不要依赖动态页返回的内容,要不如果动态页报错没有输出js回调或者提示信息就和没反应一样了

字符串-网页上传文件时怎么把文件加密后上传

问题描述 网页上传文件时怎么把文件加密后上传 我想在html页面选择一个上传文件,在js获得这个文件的信息,然后对这个文件进行对称加密后再上传.初步想法是把文件是以数据流发到后台再生成一个完整文件的,但怎么获得这个文件的数据流?另一个想法是把先把文件转成字符串,然后加密,再把字符串生成文件2,然后上传,但怎样才能转成字符串并且把加密的字符串转回文件?请大神解答,感激不尽 解决方案 在Web架构中如果要保密, 最简单最安全的方法是使用HTTPS协议. 用js获取文件数据流是可以的, 但需要新版浏览

winhttp 亚马逊云盘-使用winhttp向亚马逊云盘上传文件时,报12030错误

问题描述 使用winhttp向亚马逊云盘上传文件时,报12030错误 我用winhttp协议做上传文件时,上传文件到云盘,上传中途在WinHttpWriteData 处出错,报12030,有谁知道,有避免的方法吗 解决方案 12030 ERROR_INTERNET_CONNECTION_ABORTED The connection with the server has been terminated. 是不是有中文名等特殊字符 解决方案二: 不是这个原因,我传小文件就能传成功,传大文件就会报那

lrzsz-求解在win中使用secureCRT登录linux在rz上传文件时获取文件名

问题描述 求解在win中使用secureCRT登录linux在rz上传文件时获取文件名 简单来说我就是想实现,我使用rz上传脚本完成后对这个脚本文件进行处理,比如把里面的"test"改成"true" 解决方案 http://tieba.baidu.com/p/4338828408

PHP上传文件时自动分配路径的方法_php技巧

本文实例讲述了PHP上传文件时自动分配路径的方法.分享给大家供大家参考.具体分析如下: 网站上传文件时,如果是小的企业站,放在一个目录还没问题,当网站大了,上传的文件多了,我们就不能放在同一个目录了,这里我们就来讲讲用PHP自动给上传的文件分配路径的方法. PHP分配上传文件的路径实例 主要程序片段如下: 复制代码 代码如下: <?php    /*数字方式分配路径*/    function allotPath($id, $extend='jpg') {       $folders = st

input file-C#上传文件时找不到文件~求解~!!

问题描述 C#上传文件时找不到文件~求解~!! //后台代码 public static class Qiniu_API { public static string Bucket = """";//空间名 public static string Domain = """";//域名 static Qiniu_API() { Config.ACCESS_KEY = ""<AK>"&q

asp.net,VS2012中如何在上传文件时可以一起选择多个不同种类的文件

问题描述 asp.net,VS2012中如何在上传文件时可以一起选择多个不同种类的文件 asp.net,VS2012中如何在上传文件时可以一起选择多个不同种类的文件,求大神解答,新手..,拜托了....

怪事,uploadify上传文件时,能在页面上任何位置输入中文。

问题描述 uploadify上传文件时,能在页面上任何位置输入中文.jqueryeasyui+uploadify,先在页面任何地方点下,上传文件,同时输入中文.页面任何地方都能输入.有人遇到过吗?怎么解决的? 解决方案 解决方案二:没看明白....截个图看看解决方案三:如图:解决方案四:解决,onselect的时间,把焦点定到一个输入框,就这样吧.解决方案五:引用3楼yufan27209的回复: 解决,onselect的时间,把焦点定到一个输入框,就这样吧. 解决了就好我刚刚才看到我用uploa