生产环境遇到这个错误
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer
博主花费了一天的时间去解决问题,查日志,各种找资料看,最终找到方案解决,废话不多说直接说有价值的东西
背景:由于文件预览的时候出现了这个问题,小文件没有问题,大文件就报错
可能出现的原因
- 服务器在接受处理用户请求时,自身的cpu、io、内存、线程等资源都是有最大限制的。当并发请求超过服务器的承载量时,服务器会停掉一些请求。(但是要注意如果实际的并发数量没有超过服务器的承载量,可能中了木马病毒问题导致的。这个时候需要分析了)
- 客户端关闭了浏览器,但是服务端还是继续发送数据。
- 浏览器端按了Stop。
- 防火墙/nginx影响了。
- 一种是他们都设置了超时机制,超过了会关闭这个TCP会话。这个可以通过重新定义心跳机制,进行会话维护。
- 一种是设置防高频策略。我的就是这种情况
以上是在网上搜的资料,这些情况说实话都不是特别有用,完全说的废话,说不到重点,最后自己找到了解决方案
由于正常spring中上传下载文件配置默认位50M,意思就是说上传50M以下都没有问题,但是我上传900K就出现了问题,最后找到一个帖子,说可能和Nginx有关系
- NGINX的配置, 发现都是默认的, 了解到 proxy_buffer_size 默认大小是 512k, 超过就会报错,Connection reset by peer, 应该是 Tomcat 的http 连接 超出了nginx 的大小限制 被强行 reset, 因而出现下载失败的问题
附spring默认文件配置代码
# 前缀prefix
spring.thymeleaf.prefix=classpath:templates/
# 后缀suffix
spring.thymeleaf.suffix=.html
# charset=<encoding> is added
spring.thymeleaf.encoding=UTF-8
#content-type
spring.thymeleaf.content-type=text/html
#set to false for hot refresh
spring.thymeleaf.cache=false
spring.thymeleaf.mode=LEGACYHTML5
spring.http.multipart.maxFileSize=50Mb
spring.http.multipart.maxRequestSize=500Mb
解决方案
- 修改nginx的缓存配置,或者关闭缓存,完美解决