深入分析nginx偶尔502错误根因-以及常见错误总结

news/2024/5/7 11:38:26

以架构师的能力标准去分析每个问题,过后由表及里分析问题的本质,复盘总结经验,并把总结内容记录下来。当你解决各种各样的问题,也就积累了丰富的解决问题的经验,解决问题的能力也将自然得到极大的提升。励志做架构师的撸码人,认知很重要。

本文主要想表达的是解决问题的态度。

一、问题和目的


1、问题现象:

接入层nginx集群某个接口偶尔出现502,但是业务nginx没有看到502日志,业务服务端口正常。

2、 本次总结的目的:积累沉淀

1)、知识学习路径:

1、最好的学习,实现90%的知识转化,分享是最好的方式。

2、知识输出:把知识内化为自己的智慧。

3、把智慧升华为世界观和方法论。

2)、不要轻视任何小问题,追根溯源问题的本质,才积累丰富的解决问题的经验。

首先需要了解nginx运行原理。Nginx工作原理和优化总结。_nginx原理-CSDN博客

nginx的健康检查机制:Nginx健康检查机制-CSDN博客

海恩法则

    · 事故的发生是量的积累的结果。
    · 再好的技术、再完美的规章 , 在实际操作层面也无法取代人自身的素质和责任心 。

薛定谔的猫

    “薛定谔的猫”告诉我们,事物发展不是确定的,而是量子态的叠加。

墨菲定律

    · 任何事情都没有表面看起来那么简单 。
    · 所有事情的发展都会比你预计的时间长 。
    · 会出错的事总会出错。
    · 如果你担心某种情况发生,那么它更有可能发生 。

蝴蝶效应

    世界会因一些微小因素的变动,而发生很大的变化。

熵增原理

    “热力学第二定律”(熵增原理)告诉我们,世界总是在变得更加混乱无序。  

      警示我们对生产环境发生的任何怪异现象和问题都不要轻易忽视,对于其背后的原因一定要彻查。同样,海恩法则也强调任何严重事故的背后 都是多次小问题的积累,积累到一定的量级后会导致质变,严重的问题就会浮出水面 。 那么,我们需要对线上服务产生的任何征兆,哪怕是一个小问题,也要刨根问底: 这就需要我们有技术攻关的能力,对任何现象都要秉着以下原则: 为什么发生? 发生了怎么应对? 怎么恢复? 怎么避免? 对问题要彻查,不能因为问题的现象不明显而忽略 。

3)、总结错误处理经验,快速定位和解决问题。

不回避问题,不怕攻关,不惧挑战。在其位要积极主动去分析排查问题,而不是被动去接受问题。

解决问题的思路是一种思维工具,通过提出问题、分析问题和解决问题的过程,可以帮助我们主动思考和积极学习。在解决问题过程中帮助我们更深入地理解和应用知识技能。

二、问题定位


出现这种问题,肯定是需要彻查日志定位和分析。

1、查接入层nginx日志:

nginx出现错误日志:(110: Connection timed out) while reading response header from upstream 一般是nginx读取来自upstream的响应头时超时。 

主要接口xxxx/container请求超时。

2、排查是否存在:no live upsteams

接口/user/autch/check出现no live upsteams,即报出502错误。

3、业务nginx查询接口xxxx/container日志情况:

接口xxxx/container请求频繁(相对历史),http code=499,即service服务处理超时,接入层直接断开请求了。

初步定位:

由于接口接口xxxx/container大量请求超时,可能导致接入层nginx会剔除业务nginx服务,然后接口/user/autch/check出现no live upsteams,即报出502错误。

验证定位:

接口xxxx/container限流降级,在业务nginx特殊处理直接返回200:

localtion /xxxx/container {

                return 200 "ok";

}

nginx -s reload后,接入层nginx的502日志消失。确定接口xxxx/container大量请求超时引起。

三、问题分析


1、为啥业务nginx明明存活负载很低,但是接入层偶尔出现502。

这个就需要了解nginx的健康检查机制:

我们接入层nginx upstream配置:

upstream upstream_6f6a3h8a0e5e1
{

     server 192.168.1.21;

     server 192.168.1.22;
}

nginx本身是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带的 ngx_http_proxy_module 模块 和ngx_http_upstream_module模块中的相关指令来完成当后端节点出现故障时,自动切换到健康节点来提供访问。

ngx_http_upstream_module模块中的server指令范例:

upstream name {
                server 10.1.1.110:8080 max_fails=1 fail_timeout=10s;
                server 10.1.1.122:8080 max_fails=1 fail_timeout=10s;
        }
当upstream没有配置max_fails和fail_timeout,即nginx使用默认值fail_timeout为10s,max_fails为1次。

由于Nginx ngx_http_upstream_module模块是基于连接探测的,如果发现后端异常,在单位周期为fail_timeout设置的时间中失败次数达到max_fails次,这个周期次数内,如果后端同一个节点不可用,那么就将把节点标记为不可用,并等待下一个周期(同样时长为fail_timeout)再一次去请求,判断是否连接是否成功。
即在10s以内后端失败了1次【即一次请求超时】,那么这个后端就被标识为不可用了,所以在接下来的10s期间,nginx都会把请求分配给正常的后端【即多次的请求正常】。

关于502伴随出现错误no live upstreams while connecting to upstream的原因:在文章Nginx中常见问题与错误处理-CSDN博客

2、为啥业务nginx 出现499,接入层nginx显示响应超时。

这是因为接入层nginx配置响应超时为30s:

proxy_read_timeout 30s;
proxy_connect_timeout 5s;

而业务nginx超时是60s,即接入层nginx超时30s会主动断开和业务nginx连接。

此时业务nginx请求日志就会出现499.

四、解决问题


本质还是需要优化超时接口,但是为了预防某个接口出现问题进而导致整个服务不能用的情况,需要做一些预防措施。

方案1:优化 upstream 默认健康检测,主要降低出现502到概率。

upstream upstream_6f6a3h8a0e5e1 {

     server 192.168.1.21 max_fails=3 fail_timeout=60s;

     server 192.168.1.22 max_fails=3 fail_timeout=60s;
}

即在30s以内后端失败了3次那么这个后端才被标识为不可用了。

方案二:nginx_upstream_check_module模块主动检测:

在nginx.conf配置文件里面的upstream加入健康检查,如下:    upstream name {
           server 192.168.0.21:80;
           server 192.168.0.22:80;
           check interval=3000 rise=2 fall=5 timeout=1000 type=tcp;
           
    }

对name这个负载均衡条目中的所有节点,每个3秒检测一次端口是否存活,请求2次正常则标记 realserver状态为up,如果检测 5 次都失败,则标记 realserver的状态为down,超时时间为1秒。

目前这个是比较好的解决方案,确保正常流量都能进入到后端业务服务进行处理。

具体安装:

yum -y install pcre-devel openssl openssl-devel
 
cd  /usr/local/src/
wget http://nginx.org/download/nginx-1.12.1.tar.gz
tar -zxvf nginx-1.12.1.tar.gz

 
cd /usr/local/src
wget https://codeload.github.com/openresty/echo-nginx-module/tar.gz/refs/tags/v0.62
tar zxvf v0.62
 
#下载 nginx_upstream_check_module模块
cd /usr/local/src
wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master
unzip master
 
#为nginx打补丁
cd  nginx-1.12.1
#查看对应nginx版本: ll ../nginx_upstream_check_module-master/
patch -p1 < ../nginx_upstream_check_module-master/check_1.12.1+.patch
 
#安装nginx
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_stub_status_module  --with-http_ssl_module   --add-module=/usr/local/src/echo-nginx-module-0.62 --add-module=/usr/local/src/nginx_upstream_check_module-master
 
make -j2  
make install
 
原因:我安装的nginx版本为1.12.1,在安装nginx_upstream_check_module模块时忘记修改补丁文件版本(先安装了1.5.12+,后面发现错了又安装1.12.1+),导致在在make时报错.

关于nginx健康检查机制:Nginx健康检查机制-CSDN博客

五、nginx常见错误总结


Nginx中常见问题与错误处理-CSDN博客

错误日志[Error.log]

错误信息错误说明
“upstream prematurely(过早的) closed connection”请求uri的时候出现的异常,是由于upstream还未返回应答给用户时用户断掉连接造成的,对系统没有影响,可以忽略
“recv() failed (104: Connection reset by peer)”(1)服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉; (2)客户关掉了浏览器,而服务器还在给客户端发送数据; (3)浏览器端按了Stop
“(111: Connection refused) while connecting to upstream”用户在连接时,若遇到后端upstream挂掉或者不通,会收到该错误
“(111: Connection refused) while reading response header from upstream”用户在连接成功后读取数据时,若遇到后端upstream挂掉或者不通,会收到该错误
“(111: Connection refused) while sending request to upstream”Nginx和upstream连接成功后发送数据时,若遇到后端upstream挂掉或者不通,会收到该错误
“(110: Connection timed out) while connecting to upstream”nginx连接后面的upstream时超时
“(110: Connection timed out) while reading upstream”

nginx读取来自upstream的响应时超时

“(110: Connection timed out) while reading response header from upstream”nginx读取来自upstream的响应头时超时
“(110: Connection timed out) while reading upstream”nginx读取来自upstream的响应时超时
“(104: Connection reset by peer) while connecting to upstream”upstream发送了RST,将连接重置
“upstream sent invalid header while reading response header from upstream”upstream发送的响应头无效
“upstream sent no valid HTTP/1.0 header while reading response header from upstream”upstream发送的响应头无效
“client intended to send too large body”用于设置允许接受的客户端请求内容的最大值,默认值是1M,client发送的body超过了设置值
“reopening logs”用户发送kill  -USR1命令
“gracefully shutting down”,用户发送kill  -WINCH命令
“no servers are inside upstream”upstream下未配置server
“no live upstreams while connecting to upstream”upstream下的server全都挂了
“SSL_do_handshake() failed”SSL握手失败
“SSL_write() failed (SSL:) while sending to client”
“(13: Permission denied) while reading upstream”
“(98: Address already in use) while connecting to upstream”
“(99: Cannot assign requested address) while connecting to upstream”
“ngx_slab_alloc() failed: no memory in SSL session shared cache”ssl_session_cache大小不够等原因造成
“could not add new SSL session to the session cache while SSL handshaking”ssl_session_cache大小不够等原因造成
“send() failed (111: Connection refused)”

http://www.mrgr.cn/p/07164866

相关文章

二项式系数

火大二项式系数 更完整的思考过程以及代数推理过程都可以看数学书,所以我尽量给每个式子都赋予组合意义。 因为在有足够强的代数推理能力之前,没有组合意义往往是困难的。 恒等式赋予组合意义往往都是左边右边分开找意义。 常见公式: \[\begin{aligned} \binom{n}{k}&=\…

Verilog2001中bit slicing特性

1、问题来源 HDLBits题目:Mux256to1v 实现256-1且位宽为4的多路选择器 从下图可以发现,直接使用in[ sel4+3 : sel4 ]是不行的,会报错2、两种解决方法利用bit slicing特性 bit slicing特性的内容可以参考link1module top_module( input [1023:0] in,input [7:0] sel,output […

TODO-力扣-661. 图片平滑器

1.题目 题目地址(661. 图片平滑器 - 力扣(LeetCode)) https://leetcode.cn/problems/image-smoother/ 题目描述 图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。 每个单元格的 平均灰度 定义为:该单元格…

力扣-提交执行报错类型

1.参考 参考链接:提交执行报错 1.1 超出内存限制1.2 数组访问越界1.3 初始化有误1.4 递归基线错误

uniapp H5实现签名

第一种&#xff1a;跳转签名页面 1、创建审核页面audit.vue <template><view><uni-section title""><view class"auditClass"><uni-forms :model"baseFormData" ref"baseFormRef" :rules"rules&quo…

zigbee开发,低功耗,通信加密开发

一。低功耗 1.低功耗应用场景1、不利于更换电池的设备2、手持便携设备3、实时性要求不高的设备 2.低功耗工作原理1、时钟降至最低2、暂时不用的外设关闭、需要在启动3、I/O配置 用电情况可以简化为: 等一会运行一下。 3.zigbee实现低功耗 1.协调器+路由器+终端 补充:CC2530(…

爽了!免费的SSL,还能自动续期!

作者:小傅哥 博客:https://bugstack.cn沉淀、分享、成长,让自己和他人都能有所收获!😄大家好,我是技术UP主小傅哥。 兄弟👬🏻,当你手里有不少域名,每个域名又配置子域名,那么ssl将是一笔不小的费用。当然各个云厂商,也都有提供免费的ssl证书,但这里有一个问题,…

【C++】---STL之list的模拟实现

【C】---STL之list的模拟实现 一、list模拟实现思路二、结点类的实现三、list迭代器的实现1、ListIterator类2、构造函数3、operator*运算符重载5、operator->运算符重载6、operator&#xff01;运算符重载7、operator运算符重载8、前置9、后置10、前置--11、后置-- 四、lis…

华为云Stack8.3面向香港正式发布,六大亮点激发云上跃迁

近日,在华为云香港峰会2024上,华为混合云副总裁胡玉海面向香港市场发布华为云Stack8.3,提供110+本地云服务和六大亮点,帮助中国香港政企持续提升用云深度,激发业务创新。本文分享自华为云社区《华为云Stack8.3面向香港正式发布,六大亮点激发云上跃迁》,作者:华为云头条…

【AIGC调研系列】Bunny-Llama-3-8B-V与其他多模态大模型相比的优劣

Bunny-Llama-3-8B-V作为基于Llama-3的多模态大模型&#xff0c;其优势主要体现在以下几个方面&#xff1a; 性能超越其他模型&#xff1a;根据我搜索到的资料&#xff0c;Bunny-Llama-3-8B-V在多个主流Benchmark上表现良好&#xff0c;超越了LLaVA-7B、LLaVA-13B、Mini-Gemini…

抽象的代理模式1.0版本

前言&#xff1a; 在阅读Spring Security官方文档时&#xff0c;里面设计到了一种设计模式——代理模式Proxy 众里寻她千百度&#xff0c;蓦然回首&#xff0c;那人却在灯火阑珊处 开始 在之前的文章里陈述了一个观点——编程语言和语言没有区别 现看看我们日常生活中的代理…

怎么设置 idea terminal 窗口的编码格式

1 修改Terminal 窗口为 Git bash 窗口 打开 settings 设置界面&#xff0c;选择 Tools 中的 Terminal (File -> settings -> Tools -> Terminal) 修改 Shell path 为你的 Git bash 安装路径&#xff0c;我的在 C:\my_software\java\Git\bin\bash.exe 2 解决中文显示…

python r代表什么意思

r/R&#xff0c;即raw的缩写&#xff0c;意思是未经加工的&#xff1b;自然状态的&#xff1b;未经处理的&#xff1b;未经分析的&#xff1b;原始的。 在Python中r/R表示非转义的原始字符串。与普通字符相比&#xff0c;其他相对特殊的字符&#xff0c;其中可能包含转义字符&…

添加阿里云yum源

添加阿里云yum源 要添加阿里云的 yum 源&#xff0c;可以执行以下步骤&#xff1a; 首先&#xff0c;备份你的现有 yum 源配置文件&#xff0c;以防止意外更改&#xff1a; sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup然后&#xf…

探讨mfc100u.dll丢失的解决方法,修复mfc100u.dll有效方法解析

mfc100u.dll丢失是一个比较常见的情况&#xff0c;由于你电脑的各种操作&#xff0c;是有可能引起dll文件的缺失的&#xff0c;而mfc100u.dll就是其中的一个重要的dll文件&#xff0c;它的确实严重的话是会导致程序打不开&#xff0c;系统错误的。今天我们就来给大家科普一下mf…

【白盒测试】单元测试的理论基础及用例设计技术(6种)详解

目录 &#x1f31e;前言 &#x1f3de;️1. 单元测试的理论基础 &#x1f30a;1.1 单元测试是什么 &#x1f30a;1.2 单元测试的好处 &#x1f30a;1.3 单元测试的要求 &#x1f30a;1.4 测试框架-Junit4的介绍 &#x1f30a;1.5 单元测试为什么要mock &#x1f3de;️…

【产品经理修炼之道】- 从需求到功能的转化过程

产品经理的最大作用是将需求转化为产品或者功能&#xff0c;从需求到功能&#xff0c;会经历哪些过程&#xff1f;本文总结了从需求到功能的转化过程&#xff0c;希望对你进一步了解有所帮助。 “大部分的产品经理特别是数字化产品经理其核心价值就是如何去解决如何把需求转化为…

韩国机器人公司Rainbow Robotics推出RB-Y1轮式双臂机器人

文 | BFT机器人 近日&#xff0c;韩国机器人领域的佼佼者Rainbow Robotics揭开了RB-Y1移动机器人的神秘面纱&#xff0c;这款机器人以其创新的设计和卓越的功能引起了业界的广泛关注。与此同时&#xff0c;Rainbow Robotics还携手舍弗勒集团&#xff08;提供汽车、工业技术服务…

[转帖]历代x86架构IPC提升及12代酷睿与至强洋垃圾的简单对比

https://www.bilibili.com/read/cv16170718/ 好奇查找了一下历代x86架构CPU的IPC性能提升,发现知乎用户@MebiuW已经总结了10代酷睿和ZEN3之前历代架构的情况,于是摘录下来。IPC指的是每个周期CPU核心处理的指令数,频率代表CPU核心每1秒钟计算多少个周期,二者的乘积就是CPU…

浅谈菊风实时音视频 (RTC)与实时操作系统 (RTOS) 在智能硬件领域应用

近年来&#xff0c;菊风通过实时音视频赋能智能手表、智能门禁、智能门锁/门铃、智能眼镜等数十种智能硬件&#xff0c;与一众合作伙伴共同探索在IoT智能硬件领域的不同场景应用&#xff0c;积累了丰富的实践经验。在智能硬件中&#xff0c;RTOS因其轻量化的系统内核&#xff0…