nginx1.20.1+springboot2(tomcat) 下载大文件抛ClientAbortException: java.net.SocketTimeoutException

在前后端分离项目中,使用Nginx分发请求,Spring Boot(Tomcat)处理下载。遇到超过1.5G大文件下载时,外网请求会抛出ClientAbortException: java.net.SocketTimeoutException。分析发现,问题可能出在Nginx的默认缓存设置,即proxy_max_temp_file_size。解决方案包括:压缩文件或调整该配置,关闭或限制硬盘缓冲大小。

问题描述:前后端分离项目,nginx用于分发请求,后端sprinboot2(tomcat)提供下载功能。通                      过前端请求下载大文件(超过1.5G)。内网测试正常。通过外网请求时

 

 分析:nginx 已设置   读取、发送超时间,

        proxy_send_timeout 1800s;
        proxy_read_timeout 1800s;

  1. 分析错误日志发现,从请求开始到抛出异常时间在5分钟以内;且直接通过springboots后端下载时间超过15分钟也没报错。因此可排由于服务器超时时间设置的问题。
  2. 从内网测试,浏览器的下载文件速率达到4M;而外网测试下载文件速率只有1.2M.因此可能的原因在于nginx的配置上;
  3. 查看nginx的配置文档,及参考网上资料可知:
  4.    nginx默认开启缓存,proxy_max_temp_file_size 默认为1024M。由于nginx与tomcat同处于内网,下载速率比较快,而浏览器从nginx下载时是先读取nginx的缓存,且由于外网带宽限制,无法及时读取缓存,nginx的临时硬盘文件缓存超过了1024M。

解决方法:

  1. 压缩需要下载的文件大小; 
  2.  修改proxy_max_temp_file_size配置,设置为0,表示关闭硬盘缓冲;或是根据实际下载文件大小调整此参数的大小

参考:Nginx下载大文件失败,java.net.sockettimeoutexception_南有乔木的博客-优快云博客

        Module ngx_http_proxy_module

### 解决Java `ClientAbortException` 和 `Broken Pipe IOException` 当遇到 `ClientAbortException: java.io.IOException: Broken pipe` 或者 `Connection reset by peer` 错误时,这通常意味着客户端在服务器尝试发送响应之前已经关闭了连接[^1]。 #### 原因分析 这类错误可能由多种原因引起: - 客户端提前终止请求 - 网络不稳定或中断 - 浏览器取消加载页面 - 防火墙或其他安全设置阻止通信 - 应用程序逻辑中的超时配置不当 为了处理这些问题,在应用程序层面可以采取一些措施来增强健壮性和用户体验。 #### 技术解决方案 ##### 优化Nginx代理缓冲区参数 对于通过 Nginx 反向代理访问的应用服务来说,调整 Nginx 的代理缓存相关配置可以帮助减少此类异常的发生频率。具体建议修改 `/etc/nginx/nginx.conf` 中的相关部分如下所示[^3]: ```nginx http { ... server { listen 80; server_name localhost; location / { proxy_pass http://backend_server; # 开启代理缓冲功能 proxy_buffering on; # 设置初始读取头信息使用的内存大小 proxy_buffer_size 4k; # 缓冲区数量和大小定义 proxy_buffers 2 4k; # 当所有缓冲区被占满后仍可使用的额外空间量 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; } ... } } ``` 上述配置能够有效地改善大流量场景下的性能表现,并降低由于网络波动带来的影响。 ##### 修改Tomcat日志级别 如果应用部署于 Tomcat 上,则可以通过适当调整其日志记录等级来过滤掉不必要的警告信息。编辑 `${CATALINA_HOME}/conf/logging.properties` 文件,找到并更改以下行的内容: ```properties org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = WARNING ``` 将其改为更高级别的 ERROR 来屏蔽该类异常的日志输出. #### Java代码级处理策略 除了基础设施上的改进外,在编写业务逻辑时也应考虑加入必要的容错机制。例如可以在捕获到此类型的 IO Exception 后优雅地结束会话而不出未处理的异常;或者设计重试机制以应对瞬态性的连接失败情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值