前端导出文件 java.io.IOException: Connection reset by peer

发布时间 2024-01-05 14:02:48作者: 盼星星盼太阳

一、场景

后端生成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。