问题描述
导出操作。小于200k的excel正常下载,大于200K的下载失败,异常信息如下:
Cannot forward to error page for request [/xx/xx] as the response has
already been committed. As a result,the response may have the wrong
status code. If your application is running on WebSphere Application
Server you may beable to resolve this problem by setting
com.ibm.ws.webcontainer.invokeFlushAfterService to false"
问题解析
“Connection reset by peer”表示当前服务器接受到了通信对端发送的TCP RST信号,即通信对端已经关闭了连接,通过RST信号希望接收方关闭连接。
很明显主动触发了关闭连接。可能造成这个问题的因素:
1.关联服务出现错误或者崩溃。
2.excel文件较大,读取超时。
3.关联服务长时间未返回,比如数据查询时间过长,但设置了超时时间,超过规定时间关闭连接。
使用生产的dist和war,模拟无法复现。导出excel文件增加到了10M(100000多条)也无法复现。代码正常没有问题。
所以可能改造成下载失败的问题在nginx的限制。
问题原因
nginx 缓冲区设置关闭了。缓存过多会导致下载连接中断。
解决办法
proxy_buffering on
开启缓冲区配置。
缓冲区机制
proxy_buffering
默认缓冲区是开启的。
当缓冲区开启时,nginx会被代理的后端服务器会以最快速度响应,并把内容保存在由指令 proxy_buffer_size 和 proxy_buffers指定的缓冲区里边.如果响应内容无法放在内存里边,那么部分内容会被写到磁盘上。
当缓冲区被关闭了,那么响应内容会按照获取的全部内容,不管这个内容的大小有多少,都会立刻同步发送到客户端。缓冲区关闭状态下的nginx不去计算代理服务器整个响应内容的大小,nginx能从服务器接受的最大数据,是由指令 proxy_buffer_size指定的.
如果是经常轮询(long-polling)的Comet应用来说,关闭proxy_buffering是必要的,不然异步响应将被缓存导致Comet中断。