前因
最近做了个项目,访问量比较大,于是采用1台nginx,多个tomcat进行负载均衡、集群架构,其中在我的项目中有文件上传功能,写了文件上传进度监控程序。没使用nginx时上传进度能正常显示,用了之后进度不显示了,然后等待很久才出现上传成功;后端附件服务器使用阿里云的oss,刚刚开始做的时候是监听OSS上传进度。
经过
使用nginx+tomcat上传时的情况:
使用tomcat本地上传时的情况:
原因
NGINX会把整个附件数据先本地缓存,缓存完毕后转发给你的应用服务器,在这个过程之间,你的进度条永远就是0了,待转发后,你的进度条可能瞬间就可以到达一百,只转发了一次。
解决办法
在nginx.conf文件的http中加上一句配置:proxy_request_buffering off
又因为proxy_request_buffering是一个危险的配置,不能针对所有location关掉,如果有效,就针对上传地址把它关掉。
例如:
location /upload
{
proxy_set_header X-Forward-For $remote_addr;
proxy_pass http://127.0.0.1:8090;
proxy_request_buffering off;
client_max_body_size 10000m;
}
另一个问题
但是我个人发现,哪个“proxy_request_buffering”配置已经奏效了,但是发现tomcat接受完整个文件后才进去代码里面,然而我的监听进度条是等待程序返回后,才开始请求OSS上传进度。当上传到OSS中,因为我的服务器又是阿里云的,与OSS服务器是同一个局域网,上传 10M的 文件很快就上传成功,进度条瞬间就100%。
解决办法
当文件上传时,我要监听上传到tomc