你的位置:先锋影音成人影院 > 苍井空电影百度搜索 > r18 动漫 502 问题若何排查?

r18 动漫 502 问题若何排查?

发布日期:2024-11-19 15:36    点击次数:176

r18 动漫 502 问题若何排查?

刚职责那会,有一次r18 动漫,上游调用我做事的老哥说,你的做事报 "502 失误了,快去望望是为什么吧"。

那时阿谁做事里偶合有个调用日记,平时会记载千般 200,4xx 气象码的信息。于是我跑到做事日记里去搜索了一下 502 这个数字,毫无发现。于是跟老哥说," 做事日记里并莫得 502 的记载,你是不是搞错啦?"

目下念念来,几许有些不好兴味。

不知说念有几许老哥是跟那时的我是一样的,这篇著作,就来聊聊 502 失误是什么?

咱们从气象码是什么开端聊起。

HTTP 气象码

咱们平时在浏览器里逛的某宝和某度,其实皆是一个个前端网页。

一般来说,前端并不存储太大皆据,大部分时候皆需要从后端做事器那得到数据。

于是前后端之间需要通过 TCP 公约去建立结合,然后在 TCP 的基础上传输数据。

而 TCP 是基于数据流的公约,传输数据时,并不会为每个音讯加入数据限制,平直使用裸的 TCP 进行数据传输会有 "粘包" 问题。

因此需要用挑升的公约方法去对数据进行泄露。于是在此基础上规划了 HTTP 公约。详备的内容不错看我之前写的《既然有 HTTP 公约,为什么还要有 RPC》。

比如,我念念要看某个商品的具体信息,其实便是前端发的 HTTP 苦求中传入商品的 id,后端复返的 HTTP 反映中复返商品的价钱,商店名,发货地址的信息等。

通过 id 得到商品笃定

这么,名义上,咱们是在刷着千般网页,本色上背后正有屡次 HTTP 音讯在延续进行收发。

用户在网上浏览商品

但问题就来了,上头提到的皆是时时情况,要是有极度情况呢,比如前端发的数据,根底就不是个商品 id,而是一张图片,这关于后端做事端来说是不可能给出时时反映的,于是就需要规齐整套 HTTP 气象码,用来标记此次 HTTP 苦求反映历程是否时时。通过这个不错影响浏览器的行径。

比喻说一切时时,那做事端复返个 200 气象码,前端收到后,不错省心使用反映的数据。但要是做事端发现客户端发的东西极度,就反映个 4xx 气象码,兴味是这是个客户端的失误,4xx 里头的 xx 不错笔据失误的类型,再细分红千般码,比如 401 是客户端没权限,404 是客户端苦求了一个根底不存在的网页。反过来,要是是做事器有问题,就复返 5xx 气象码。

4xx 和 5xx 的分手

但问题就来了。

做事端皆有问题了,搞严要点,做事器可能平直就崩溃了,那它还若何给你复返气象码?

是的,这种情况,做事端是不可能给客户端复返气象码的。是以说,一般情况下 5xx 的气象码其实并不是做事器复返给客户端的。

它们是由网关复返的,常见的网关,比如 nginx。

nginx 的作用

回到前后端交互数据的话题上,要是前端用户少,那后端处理起苦求来,半说念落发。但跟着用户越来越多,后端做事器受资源截至,cpu 约略内存皆可能会严重不及,这时候解决决议也很粗浅,多搞几台一样的做事器,这么就能将这些前端苦求均派给几个做事器,从而莳植处理才略。

但要终了这么的斥逐,前端就得知说念后端具体有哪些个做事器,并逐个跟他们建立 TCP 结合。

前端与多个做事器之间建立结合

也不是不行,但便是艰辛。

但这时候要是能有个中间层挡在它们中间就好了,这么客户端只需要跟中间层结合,中间层再和做事器建立结合。

于是,这个中间层就成了这帮做事器的一个代理东说念主一样,客户端有啥事皆找代理东说念主,只管发出我方的苦求,再由代理东说念主去找某个做事器去完成反映。通盘过程下来,客户端只知说念我方的苦求被代理东说念主帮衬解决了,但代理东说念主具体找了阿谁做事器去完成,客户端并不知说念,也不需要知说念。

像这种,屏蔽掉具体有哪些做事器的代理方式便是所谓的反向代理。

反向代理

反过来,屏蔽掉具体有哪些客户端的代理方式,便是所谓的正向代理。

而这个中间层的脚色r18 动漫,一般由 nginx 这类网关来充任。

另外,由于背后的做事器可能性能建立各不疏通,有些 4 核 8G,有些 2 核 4G,nginx 能为它们加上不同的探询权重,权重高的多转发点苦求,通过这个方式终了不同的负载平衡战略。

nginx 复返 5xx 气象码

有了 nginx 这一中间层后,客户端从直连做事端,变成客户端直连 nginx,再由 nginx 直连做事端。从一个 TCP 结合变成两个 TCP 结合。

于是,当做事器发生极度时,nginx 发送给做事器的那条 TCP 结合就不可时时反映,nginx 在得到这一信息后,就会复返 5xx 失误码给客户端,也便是说 5xx 的报错,其实是由 nginx 识别出来,并复返给客户端的,做事端自己,并不会有 5xx 的日记信息。是以才会出现著作开首的一幕,上游收到了我做事的 502 报错,但我在我方的做事日记里却搜索不到这一信息。

产生 502 的常见原因

在 rfc7231 中相关于 502 失误码的官方证实是

502 Bad Gateway
   The 502 (Bad Gateway) status code indicates that the server, while acting as a gateway or proxy, received an invalid response from an inbound server it accessed while attempting to fulfill the request.

翻译一下便是,502 (Bad Gateway) 气象代码默示做事器在充任网关或代理时,在尝试满足苦求时从它探询的入站做事器经受到无效反映。

汝听,东说念主言否?

这关于大部分编程小白来说,不仅没证实到问题,反而只会冒出更多的问号。比如,这上头提到的无效反映到底指的是什么?

我来证实下,它其实是说,502 其实是由网关代理(nginx)发出的,是因为网关代理把客户端的苦求转发给了做事端,但做事端却发出了无效反映,而这里的无效反映,一般是指 TCP 的 RST 报文或四次挥手的 FIN 报文。

四次挥手估量寰宇背的很熟了,是以略过,咱们来要点说下 RST 报文是什么。

RST 是什么?

咱们皆知说念 TCP 时时情况下断开结合是用四次挥手,那是时时时候的优雅作念法。

但极度情况下,成人快播电影收发两边皆不一定时时,连挥手这件事自己皆可能作念不到,是以就需要一个机制去强行关闭结合。

RST 便是用于这种情况,一般用来极度地关闭一个结合。它是 TCP 包头中的一个象征位,在收到置这个象征位的数据包后,结合就会被关闭,此时经受到 RST 的一方,在哄骗层会看到一个 connection reset 或  connection refused 的报错。

TCP 报头 RST 位

而之是以发出 RST 报文,一般有两个常见原因。

做事端过早断开结合

nginx 与做事端之间有一条 TCP 结合,在 nginx 将客户端苦求转发给做事端时,他两之间按说念答理一直保抓这条结合,直到做事端将斥逐时时复返后,再断开结合。

但要是做事端过早断开结合,而 nginx 却还赓续发音讯以前,nginx 就会收到做事端内核复返的 RST 报文或四次挥手的 FIN 报文,迫使 nginx 哪里的结合斥逐。

过早断开结合的原因常见的有两个。

第一个是,做事端缔造的超频频间过短。岂论是用的哪种编程话语,一般皆有现成的 HTTP 库,做事端一般皆会有几个 timeout 参数,比如 golang 的 HTTP 做事框架里有个写超时(WriteTimeout),假定缔造了 2s,那它的含义便是,做事端在收到苦求后需要在 2s 内处理完并将斥逐写到反映中,要是等不到,就会将结合给断掉。

比如你的接口处理时候是 5s,而你的 WriteTimeout 却惟一 2s,在没比及反映写完之前,HTTP 框架就会主动将结合给断开。nginx 此时就有可能收到四次挥手的 FIN 报文(有些框架也可能发 RST 报文),然后断开结合,于是客户端就会收到一个 502 报错。

遭受这种问题,将 WriteTimeout 的时候调大一些就好了。

FIN 与 502 的关系

第二个原因,亦然变成 502 气象码最常见的原因,便是做事端哄骗进度崩了(crash)。

做事端崩了,也便是刻下莫得一个进度在监听做事器端口,而此时你却尝试向一个不存在的端口发数据,做事器的 linux 内核公约栈就会反映一个 RST 数据包。相似,这时候 nginx 也会给客户端一个 502。

RST 和 502

在开垦过程中,这种情况是最常见的。

目下咱们大部分的做事器皆会将挂掉的做事重启,因此咱们需要判断下做事是否也曾崩溃过。

要是你有对做事端的 cpu 约略内存作念过监控,不错看下 CPU 或内存的监控图是否出现过断崖式的已而下降。要是有,十有八九百,便是你的做事端哄骗本事也曾崩溃过。

cpu 已而暴跌

除此除外你还通过底下的高唱,看下进度前次的启动时候是什么时候。

ps -o lstart {pid}

比如我要看的进度 id 是 13515,高唱就需要像底下这么。

# ps -o lstart 13515
                 STARTED
Wed Aug 31 14:28:53 2022

不错看到它前次的启动时候是 8 月 31 日,这个时候要是跟你印象中的操作时候有差距,那证实进度可能是崩了之后被再行拉起了。

遭受这种问题,最迫切的是找出崩溃的原因,崩溃的原因就多种千般了,比如,对未驱动化的内存地址进行写操作,约略内存探询越界(数组 arr 长度明明惟一 2,代码却读 arr [3])。

这种情况险些皆是本事有代码逻辑问题,崩溃一般也会留住代码堆栈,不错笔据堆栈报错去排查问题,确立之后就好了。比如底下这张图是 golang 的报错堆栈信息,其他话语的也雷同。

报错堆栈

不打印堆栈的情况

但有一些情况,巧合候根底不留住堆栈。

比如内存线路导致进度占用内存越来越多,临了导致朝上做事器的最大内存截至,触发 OOM(out of memory), 进度平直就被操作系统 kill 掉。

还有更守秘的,代码逻辑里隐蔽了主动退出进度的操作。比如 golang 的日记打印里有个步伐叫 log.Fatalln (),打印完日记还会趁便奉行 os.Exit () 平直退出进度,对源码不了解的生人很容易犯这个错。

打印完趁便还退出进度

要是你很明确,你的做事莫得崩过。那赓续往下看。

网关将苦求打到了一个不存在的 IP 上

nginx 是通过建立的方式来代理多个做事器。这个建立一般是放在 /etc/ nginx / nginx.conf 中。

掀开它,你可能会看到雷同底下这么的信息。

upstream xiaobaidebug.top {
    server 10.14.12.19:9235 weight=2;
    server 10.14.16.13:8145 weight=5;
    server 10.14.12.133:9702 weight=8;
    server 10.14.11.15:7035 weight=10;
}

上头建立的含义是,要是客户端探询 xiaobaidebug.top 域名,nginx 就会将客户端的苦求转发到底下的 4 个做事器 ip 上,ip 边上还有个 weight 权重,权重越高,被转发到的次数就越多。

不错看出,nginx 具有至极丰富的建立才略。但要提防的是,这些个文献是需要我方手动建立的。关于做事器少,且不若何变化的情况,这虽然没问题。

善良的小姨子在线

但目下仍是是云原生期间了,好多公司里面皆有我方的云家具,做事当然也会上云。一般来说每次更新做事,皆可能会将做事部署到一台新的机器上。而这个 ip 也会跟着篡改,难说念每发布一次做事,皆需要手动去 nginx 上改建立吗?这显着不试验。

要是能在做事启动时,让处当事人动将我方的 ip 告诉 nginx,然后 nginx 我方生成这么的一个建立并再行加载,那事情就粗浅多了。

为了终了这么一个做事注册的功能,不少公司皆会基于 nginx 进行二次开垦。

但要是这个做事注册功能有问题,比喻说做事启动后,新做事没注册上,但老做事仍是被断送了。这时候 nginx 还将苦求打到老做事的 IP 上,由于老做事方位的机器仍是莫得这个做事了,是以做事器内核就会反映 RST,nginx 收到 RST 后回报 502 给客户端。

实例仍是断送但建立没删 IP

要排查这种问题也不难。

这个时候,你不错看下 nginx 侧是否有打印干系的日记,看下转发的 IP 端口是否相宜预期。

要是不相宜预期,不错去找找作念这个基础组件的共事,进行一波友好的交流。

回来

HTTP 气象码用来默示反映斥逐的气象,其中 200 是时时反映,4xx 是客户端失误,5xx 是做事端失误。

客户端和做事端之间加入 nginx,不错起到反向代理和负载平衡的作用,客户端只管向 nginx 苦求数据,并不留情这个苦求具体由哪个做事器来处理。

后端做事端哄骗要是发生崩溃,nginx 在探询做事端时会收到做事端复返的 RST 报文,然后给客户端复返 502 报错。502 并不是做事端哄骗发出的,而是 nginx 发出的。因此发生 502 时,后端做事端很可能莫得干系的 502 日记,需要在 nginx 侧才能看到这条 502 日记。

要是发现 502,优先通过监控排查做事端哄骗是否发生过崩溃重启,要是是的话,再看下是否留住过崩溃堆栈日记,要是莫得日记,看下是否可能是 oom 约略是其他原因导致进度主动退出。要是进度也没崩溃过,去排查下 nginx 的日记,看下是否将苦求打到了某个不闻名 IP 端口上。

本文来自微信公众号:小白 debug (ID:xiaobaidebug),作家:小白

告白声明:文内含有的对外跳转集合(包括不限于超集合、二维码、口令等方式)r18 动漫,用于传递更多信息,省俭甄选时候,斥逐仅供参考,IT之家悉数著作均包含本声明。