Nginx报upstream timed out(10060)但后端Spring Boot服务已收到请求排查
根因分析
报错中的超时时间和抓包看到的1分钟间隔完全匹配Nginx默认proxy_read_timeout配置的60秒阈值。该配置定义了Nginx向上游服务读取响应的最大间隔时间,当上游服务超过60秒没有返回任何响应数据时,Nginx就会主动断开连接并抛出该错误。
常见触发场景
- Spring Boot默认请求大小阈值过低:默认
spring.servlet.multipart.max-request-size通常为2MB,6M原始文件经Base64编码后体积会膨胀33%到8MB左右,超过阈值后服务端会直接拦截请求,不返回响应触发超时 - 大体积Base64解码阻塞:8MB的Base64字符串解码需要占用大量CPU和内存资源,若Spring Boot服务的JVM堆内存不足、CPU资源被占满,会导致解码过程耗时超过60秒,无响应返回触发超时
- Nginx请求缓冲区配置过小:默认
client_body_buffer_size通常为128KB,8MB的请求会被Nginx先写入临时磁盘文件,磁盘IO性能不足时会拉长整体请求处理周期,触发超时
解决方案
- 调整Spring Boot上传配置,在application配置文件中添加如下内容:
spring.servlet.multipart.max-file-size=20MB spring.servlet.multipart.max-request-size=30MB
- 调整Nginx对应站点的配置,添加如下参数:
client_body_buffer_size 20M; proxy_read_timeout 300s; proxy_send_timeout 300s; proxy_connect_timeout 60s;
- 优化Spring Boot服务JVM参数,将堆内存调整到2GB以上,避免大对象解码时出现GC停顿或者OOM
- 可选优化:将Base64编码上传改为multipart/form-data二进制上传,可减少33%的传输数据量,同时省掉服务端编解码的CPU开销,大幅降低超时概率
内容的提问来源于stack exchange,提问作者lannyzhang
相关产品推荐
相关产品推荐

