通过nginx转发后应用偶发502bad gateway
序言
学习了一些东西,如何才是真正自己能用的呢?好像就是看自己的潜意识的反应,例如解决了一个问题,那么下次再碰到类似的问题,能直接下意识的去找到对应的信息,从而解决,而不是和第一次碰到一样,从头开始查一遍,如果是,那么这个问题对于你来说,可能依旧是一个新的问题。
背景:把一个应用从一个代理迁移到nginx的时候,发现应用偶尔会出现502的响应,导致收到告警,而在原来中,是没有502的,而且时间上没有规律,数量也比较少。
应用偶发502的排查
1 查看nginx日志
nginx只是一个代理,你来什么我就转发什么,出现报错的时候,第一时间就是查看access log和error log,看是否能看到蛛丝马迹。
在accss log中,可以看到客户端请求的时间很短,基本上是几毫秒就完成了请求,也就是request time很短,而且502的响应码是upstream status返回的,一般我们看到这种的时候,我们基本就会认定是后端服务的问题,例如后端的cpu/内存有压力导致,但是因为是迁移过来的,在原来的上面没有此种情况,从而开始进一步排查。
对比正常的请求,发现qps不高的时候大概只有几十的时候更加容易发生,在acess log中不同的地方就是502的响应中,upstream_header_time的时间为空,而upsteam_response_time为0.001秒或者更短,而且出现502之后,没有找下一台服务器,从而可以认为此时nginx和后端服务已经建立了连接,并且传输了数据,正常的200响应中,upstrem_header_time都是有的,另外一个不一样的就是502响应中body_byte_sent都是一个固定值229,这个地方比较迷惑的地方是,不要认为这是发送给后端服务的body大小,而是nginx发送给客户端的body大小,nginx的变量命名都是站在nginx本身来说的,所以sent表示是发送给客户端的大小。
根据access log能得到有用的信息是,和后端服务已经建立连接,但是读取头没读取到,从而导致出现502bad gateway。
查看error log,根据access log找到对应的时间点,能看到具体的报错信息:
upstream prematurely closed connection while reading response
header from upstream
或者是如下的报错信息:
Connection reset by peer) while reading response headerfrom upstream
从而大致可以判断为,是nginx的配置中的长连接参数导致连接被上游关闭,从而导致响应失败,返回502.
2 修改长连接超时参数
在nginx的默认配置中keepalive_timeout为60秒,当和后端的连接如果超过了60秒,那么nginx会回收这个链接,再创建新的连接使用。
对比迁移前的代理,查看其中配置的超时时间为20秒,从而将超时时间修改为20秒,然后再次切换到nginx中,观察半小时后,发现还是有502的响应,询问应用的研发,后端框架的超时时间是多久,说是20秒,发现这个时间时间可能不对,从而进行抓包查看。
在容器中抓包比较麻烦,容器不能装tcpdump,只能到容器所在的物理机上面的网络命名空间去抓包,从而使用nsenter进入命名空间抓包,因为这个是偶发,所以抓包的时间比较长,导致这个包会很大。
抓包之后,使用wireshark打开,在502的包前面,服务端的确发送了一个reset包,重置了连接。(在此需要注意,分析包的时候,你会发现nginx和客户端是正常的握手挥手关闭连接,不要纠结为啥正常的关闭连接了,还能收到502响应)
在对reset包进行查看tcp流的时候,查看这个链接的存活时间,发现只有5秒,而查看其他正常响应的时间,也是5秒,说明后端的框架中设置的长连接时间为5秒。
继续修改长连接参数为4秒,为什么不设置为5秒,因为也有可能那么巧合。。。可以看到reset包之前的包,nginx已经向后端服务发送了请求包,但是后端服务先发了一个fin包,然后再发送了reset包,从而导致请求发送了,但是服务端重置了连接。如果两者的时间相同,那么会在极其巧合的时间内导致502,如果应用的qps比较高,也不会产生502,因为连接被快速关闭了。
长连接的时间改的很短,造成的影响是如果qps高,会频繁的进行创建连接,销毁连接,影响性能。
至此,问题解决,从而也可以发现对于长连接来说,只要超时时间到了,一定会被回收,而不管是否还有数据在传输。另外,把nginx的时间设置成小于后端服务,也让nginx掌握控制权,进行连接的管理。超时回收连接的好处就是可以节省系统资源,不然会导致很多的连接无法关闭。
当出现问题的时候,如何发现问题:靠告警
当出现问题的时候,如何去解决:日志,监控
当出现网络问题的时候,用什么工具:tcpdump,wireshark,netstat,ss
风言风语
一个正常,一个不正常,这种排查就很麻烦,虽然有对比的数据,但是总体的排查还是比较麻烦的,而且是偶发,偶发的问题总是比直接坏了的情况更加复杂。
当一开始已经判定是这个参数的时候,就会去修改这个参数,但是实际上修改成多少,那就不好猜了,最终的定论只能通过抓包来看,不是必现的问题,抓包都要抓上几个小时,枯燥乏味的事情。
当排查一个问题的时候,如果百思不得其解,那么说明。。。有些基础的概念你不懂,要不然的话,应该很快能猜到可能出现问题的地方。
AI有决策能力吗?但是人肯定有。。。只是你的决策能力的来源于哪里,是现实?还是一些假大空?
相关文章:

通过nginx转发后应用偶发502bad gateway
序言 学习了一些东西,如何才是真正自己能用的呢?好像就是看自己的潜意识的反应,例如解决了一个问题,那么下次再碰到类似的问题,能直接下意识的去找到对应的信息,从而解决,而不是和第一次碰到一样…...
linux中如何进行yum源的挂载
linux中如何进行yum源的挂载 1.首先创建目录[rootserver /]# mkdir /rhel92.使用mount命令进行、dev/cdrom/的镜像文件进行挂载[rootserver /]# mount /dev/cdrom /rhel9/ 注意:此时设立的是临时命令。重启后则失效,若想在下次开启后仍然挂载&a…...
ffmpeg的部署踩坑及简单使用方式
ffmpeg的使用方式有以下几种: 使用原生安装包 直接在ffmpeg官网上下载安装该软件,加入到环境变量中就可以使用了 优点:简单,灵活,代码中也不用添加其他第三方的包 缺点:需要手动安装ffmpeg,这点比较麻烦 部署-windows 在windows环境下,有时就算加入到了环境变量,…...

misc刷题记录2[陇剑杯 2021]
[陇剑杯 2021]webshell (1)单位网站被黑客挂马,请您从流量中分析出webshell,进行回答: 黑客登录系统使用的密码是_____________。得到的flag请使用NSSCTF{}格式提交。 这里我的思路是,既然要选择的时间段是黑客登录网站以后&…...

AI发展面临的问题? —— AI对创造的重新定义
一、AI的问题描述 AI与数据安全问题:随着AI技术的发展和应用,数据安全问题日益突出。AI模型训练依赖于大量数据,而这些数据中可能包含个人隐私、商业秘密等敏感信息。如果数据在采集、存储、使用过程中处理不当,可能导致数据泄露或…...

k8s学习--OpenKruise详细解释以及原地升级及全链路灰度发布方案
文章目录 OpenKruise简介OpenKruise来源OpenKruise是什么?核心组件有什么?有什么特性和优势?适用于什么场景? 什么是OpenKruise的原地升级原地升级的关键特性使用原地升级的组件原地升级的工作原理 应用环境一、OpenKruise部署1.安…...

上海亚商投顾:沪指缩量调整 PCB概念股持续爆发
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 大小指数昨日走势分化,沪指全天震荡调整,创业板指午后涨超1%。消费电子板块全天强势&a…...

QT属性系统,简单属性功能快速实现 QT属性的简单理解 属性学习如此简单 一文就能读懂QT属性 QT属性最简单的学习
4.4 属性系统 Qt 元对象系统最主要的功能是实现信号和槽机制,当然也有其他功能,就是支持属性系统。有些高级语言通过编译器的 __property 或者 [property] 等关键字实现属性系统,用于提供对成员变量的访问权限,Qt 则通过自己的元对…...

【IEEE出版丨EI检索】2024新型电力系统与电力电子国际会议(NPSPE 2024)
2024新型电力系统与电力电子国际会议(NPSPE 2024)将于8月16日至18日在中国大连举行,本届大会致力于为相关领域的专家和学者提供一个探讨行业热点问题,促进科技进步,增加科研合作的平台。本届大会涵盖新型电力系统和电力…...

【Netty】nio阻塞非阻塞Selector
阻塞VS非阻塞 阻塞 阻塞模式下,相关方法都会导致线程暂停。 ServerSocketChannel.accept() 会在没有建立连接的时候让线程暂停 SocketChannel.read()会在没有数据的时候让线程暂停。 阻塞的表现就是线程暂停了,暂停期间不会占用CPU,但线程…...
ES 操作
1、删除索引的所有记录 curl -X POST "localhost:9200/<index-name>/_delete_by_query" -H Content-Type: application/json -d {"query": {"match_all": {}} }POST /content_erp_nlp_help/_delete_by_query { "query": { &quo…...
uniapp如何实现跳转
在 UniApp 中,页面跳转主要可以通过两种方式实现:使用 <navigator> 组件和调用 UniApp 提供的导航 API。以下是这两种方式的详细说明: 1. 使用 <navigator> 组件 <navigator> 组件允许你在页面上创建一个可点击的元素&am…...

Stable-Diffusion-WebUI 常用提示词插件
SixGod提示词插件 SixGod提示词插件可以帮助用户快速生成逼真、有创意的图像。其中包含,清空正向提示词”和“清空负向提示词、提示词起手式包含人物、服饰、人物发型等各个维度的提示词、一键清除正面提示词与负面提示词、随机灵感关键词、提示词分类组合随机、动…...

单片机 PWM输入捕获【学习记录】
前言 学习是永无止境的,就算之前学过的东西再次学习一遍也能狗学习到很多东西,输入捕获很早之前就用过了,但是仅仅是照搬例程没有去进行理解。温故而知新! 定时器 定时器简介 定时器的分类 高级定时器 通用定时器 基本定时器…...

3.1、前端异步编程(超详细手写实现Promise;实现all、race、allSettled、any;async/await的使用)
前端异步编程规范 Promise介绍手写Promise(resolve,reject)手写Promise(then)Promise相关 API实现allraceallSettledany async/await和Promise的关系async/await的使用 Promise介绍 Promise是一个类,可以翻…...
3.1. 马氏链-马氏链的定义和示例
马氏链的定义和示例 马氏链的定义和示例1. 马氏链的定义2. 马氏链的示例2.1. 随机游走2.2. 分支过程2.3. Ehrenfest chain2.4. 遗传模型2.5. M/G/1 队列 马氏链的定义和示例 1. 马氏链的定义 对于可数状态空间的马氏链, 马氏性指的是给定当前状态, 其他过去的状态与未来的预测…...

红利之外的A股底仓选择:A50
内容提要 华泰证券指出,当前指数层面下行风险不大,市场再入震荡期下,可关注三条配置线索:1)A50为代表的产业巨头;2)以家电/食饮/物流/出版为代表的稳健消费龙头,3)消费电…...

wondershaper 一款限制 linux 服务器网卡级别的带宽工具
文章目录 一、关于wondershaper二、文档链接三、源码下载四、限流测试五、常见报错1. /usr/local/sbin/wondershaper: line 145: tc: command not found2. Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist: No URLs.. 一、关于wonder…...
独孤思维:盲目进群,根本赚不到钱
01 我看有些伙伴,对标同行找写作素材和灵感的时候。 喜欢把对标文章发给ai提炼总结。 这个方法好是好,但是,有一个问题。 即,无法感受全文的细节。 更无法感受作者的情感和温度。 就好像电影《记忆大师》一样。 我提取了记…...

针对indexedDB的简易封装
连接数据库 我们首先创建一个DBManager类,通过这个类new出来的对象管理一个数据库 具体关于indexedDB的相关内容可以看我的这篇博客 indexedDB class DBManager{}我们首先需要打开数据库,打开数据库需要数据库名和该数据库的版本 constructor(dbName,…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...