接口返回502 bad gateway

问题背景

客户反馈某个接口调用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缓存存储频繁使用的指令以加速计算。‌‌1‌‌2
  • ‌**缓冲(Buffer)**‌:作为临时存储区,用于协调不同速度设备间的数据传输,确保数据流稳定。例如,视频播放时预加载数据到缓冲区,以应对网络波动,避免播放中断。
相关推荐
vipxieliang9 小时前
Spring Boot 测试策略:单元测试、切片测试与集成测试
java·spring boot·后端
估值探索者10 小时前
【Python量化技术指标实战 04】布林带通道突破,怎么知道是真突破还是假突破?
java·开发语言·python·接口·股票数据api接口
未秃头的程序猿10 小时前
同一个商户号,V2 免密代扣和 V3 分账的证书怎么共存?
java·后端·微信
captain37610 小时前
Spring Boot的配置文件
java·spring boot·后端
captain37610 小时前
Spring Boot日志
java·数据库·spring boot
Rabitebla10 小时前
【Linux】 权限篇(三):深入理解 umask 位运算与粘滞位的设计思想
java·linux·服务器·c++·笔记·学习
Pin_Qing11 小时前
缓存能活多久,现在是个要算的参数
java·大数据·开发语言·人工智能·程序人生
jyOverQ11 小时前
从零开始学 RocketMQ(四):集群部署、消息存储与高可用【保姆级教程】
java·rocketmq·java-rocketmq
小裕哥略帅11 小时前
行级数据权限控制@DataPermission
java·开发语言
ManageEngineITSM11 小时前
ITSM系统如何与企业微信、钉钉、飞书集成?提升工单处理效率的方法
java·大数据·开发语言·钉钉·企业微信·变更管理