问题背景
客户反馈某个接口调用502 bad gateway,还跟参数有关,有些可以正常返回。
日志定位
nginx负载日志
recv() failed (104: Connection reset by peer) while reading response header from upstream
java服务端日志
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is java.io.IOException: Connection reset by peer
网上搜到了一个类似报错的分析

问题分析&解决方案
直接使用应用ip+端口访问接口是正常的,通过负载代理就502了,难道负载到应用机器的网络有问题?或者nginx超时时间配置不合理?服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉?
1 网络问题如何排查?
(1)telnet 应用ip 端口 确定负载网络通的
(2)长ping 应用ip,确定有没有丢包的
2 nginx超时配置如何确定是否合理?connect_timeout send_timeout read_timeout
https://zhuanlan.zhihu.com/p/1921624746690352482
其他配置:
client_max_body_size 10M; # 请求体的最大长度,如果请求体超过这个大小,Nginx 将返回 413 Request Entity Too Large 错误。
proxy_buffer_size:设置单个缓冲区的最大大小。
proxy_buffers :定义缓冲区的数量和每个缓冲区的大小。例如,proxy_buffers 4 16k; 表示有4个缓冲区,每个缓冲区的大小为16k。
client_header_buffer_size 10k;
client_body_buffer_size 100k; #用于读取客户端请求体的缓冲区大小。如果请求体的大小超过这个值,Nginx 会将请求体写入到磁盘上的临时文件中。
large_client_header_buffers 4 64k; #这个指令用于设置处理请求和响应头部时使用的缓冲区数量和大小。当 HTTP 头部超过单个缓冲区的大小时,Nginx 会使用额外的缓冲区。
gzip on; # 启用Gzip压缩。 启用Gzip压缩以减少传输数据量。
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 指定哪些内容类型启用压缩。
3 服务器并发超过承载量如何排查?
(1)查看cpu,内存是否打满 top命令
题外话:缓存和缓冲区别
缓存主要用于加速数据读取,通过存储频繁访问的数据副本来减少访问延迟,如本地缓存ehcache,分布式缓存redis等;而缓冲主要用于平滑数据流,通过临时存储数据来解决生产者和消费者之间的速度不匹配问题。
- **缓存(Cache)**:基于时间局部性原理,将常用数据副本存储在高速设备(如CPU缓存或内存)中,以减少对慢速存储介质(如磁盘)的重复访问,从而提升读取效率。例如,CPU缓存存储频繁使用的指令以加速计算。12
- **缓冲(Buffer)**:作为临时存储区,用于协调不同速度设备间的数据传输,确保数据流稳定。例如,视频播放时预加载数据到缓冲区,以应对网络波动,避免播放中断。