前端导出文件 java.io.IOException: Connection reset by peer
一、场景
后端生成zip压缩文件,前端直接导出。
问题:文件小的时候正常导出,大的时候,接口收不到返回的文件流;本地测试没问题,部署线上有问题;
二、原因分析
后台打印日志,发现如下报错日志
java.io.IOException: Connection reset by peer
查阅得知,断开连接,最大原因两种情况:
1.后台配置,上传下载文件限制
2.nginx配置文件流缓冲区
三、解决方案
修改nginx配置文件,修改大小或者直接proxy_buffering 设置成 off ,生效
server { listen 80; server_name www.xxx.com; proxy_buffering on; // 开启文件缓冲(默认) proxy_buffer_size 2048k; // Nginx使用该大小申请read_buf proxy_buffers 2 2048k; // buffer个数 和 每个buffer大小。 proxy_busy_buffers_size 4k; proxy_temp_path /tmp/nginx_proxy_tmp 1 2; proxy_max_temp_file_size 20M; proxy_temp_file_write_size 8k; location / { proxy_pass http://192.168.10.110:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
不同nginx配置不一样,都是修改缓冲区大小限制,gzip 改为 off 生效
server { listen 18081; server_name localhost; root html; index index.html index.html; gzip on; gzip_buffers 32 4K; gzip_comp_level 6; gzip_min_length 100; gzip_types text/html text/xml text/plain text/css text/javascript text/csv application/javascript application/json application/xml; gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持) gzip_vary on; # 增加ssl #ssl on; #如果强制HTTPs访问,这行要打开 #ssl_certificate cert/a.pem; #ssl_certificate_key cert/a.key; #ssl_session_cache shared:SSL:1m; #ssl_session_timeout 5m; # 指定密码为openssl支持的格式 #ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #ssl_ciphers HIGH:!aNULL:!MD5; # 密码加密方式 #ssl_prefer_server_ciphers on; # 依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
四、说明
1. proxy_buffering
语法:proxy_buffering on|off
默认值:proxy_buffering on
上下文:http,server,location
作用:该指令开启从后端被代理服务器的响应body缓冲。
如果proxy_buffering开启,nginx假定被代理的后端服务器会以最快速度响应,并把内容保存在由指令 proxy_buffer_size 和 proxy_buffers 指定的缓冲区里边.
如果响应body无法放在内存里边,那么部分内容会被写到磁盘上。
如果proxy_buffering被关闭了,那么响应body会按照获取body的多少立刻同步传送到客户端。nginx不尝试计算被代理服务器整个响应body的大小,nginx能从服务器接受的最大数据,是由指令 proxy_buffer_size指定的。
对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作。
但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的
2. proxy_buffers
语法:proxy_buffers 数量 size 默认值:proxy_buffers 256 8k 上下文:http,server,location
作用:设置存储被代理服务器响应的body所占用的buffer个数和每个buffer大小。
具体的意思是说,开辟256个长度为8k大小的read_buf用来存储body,当然不是连接建立初始化时就开辟256个,而是当当前buf不够存响应body时才会新申请一个,最多申请256个buf。