错误代码502怎么修,502网关错误怎么解决

错误代码502怎么修,502网关错误怎么解决
刚工作那会,有一次,上游调用我服务的老哥说,你的服务报”502错误了,快去看看是为什么吧”。

当时那个服务里正好有个调用日志,平时会记录各种200,4xx状态码的信息。于是我跑到服务日志里去搜索了一下502这个数字,毫无发现。于是跟老哥说,”服务日志里并没有502的记录,你是不是搞错啦?”

现在想来,多少有些不好意思。
错误代码502怎么修,502网关错误怎么解决

但问题就来了。

服务端都有问题了,搞严重点,服务器可能直接就崩溃了,那它还怎么给你返回状态码?

是的,这种情况,服务端是不可能给客户端返回状态码的。所以说,一般情况下5xx的状态码其实并不是服务器返回给客户端的。

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

nginx的作用
回到前后端交互数据的话题上,如果前端用户少,那后端处理起请求来,游刃有余。但随着用户越来越多,后端服务器受资源限制,cpu或者内存都可能会严重不足,这时候解决方案也很简单,多搞几台一样的服务器,这样就能将这些前端请求均摊给几个服务器,从而提升处理能力。

但要实现这样的效果,前端就得知道后端具体有哪些个服务器,并一一跟他们建立TCP连接。
错误代码502怎么修,502网关错误怎么解决
也不是不行,但就是麻烦。

但这时候如果能有个中间层挡在它们中间就好了,这样客户端只需要跟中间层连接,中间层再和服务器建立连接。

于是,这个中间层就成了这帮服务器的一个代理人一样,客户端有啥事都找代理人,只管发出自己的请求,再由代理人去找某个服务器去完成响应。整个过程下来,客户端只知道自己的请求被代理人帮忙搞定了,但代理人具体找了那个服务器去完成,客户端并不知道,也不需要知道。

像这种,屏蔽掉具体有哪些服务器的代理方式就是所谓的反向代理。
错误代码502怎么修,502网关错误怎么解决
反过来,屏蔽掉具体有哪些客户端的代理方式,就是所谓的正向代理。

而这个中间层的角色,一般由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怎么修,502网关错误怎么解决
我来解释下,它其实是说,502其实是由网关代理(nginx)发出的,是因为网关代理把客户端的请求转发给了服务端,但服务端却发出了无效响应,而这里的无效响应,一般是指TCP的RST报文或四次挥手的FIN报文。

四次挥手估计大家背的很熟了,所以略过,我们来重点说下RST报文是什么。

RST是什么?
我们都知道TCP正常情况下断开连接是用四次挥手,那是正常时候的优雅做法。

但异常情况下,收发双方都不一定正常,连挥手这件事本身都可能做不到,所以就需要一个机制去强行关闭连接。

RST 就是用于这种情况,一般用来异常地关闭一个连接。它是TCP包头中的一个标志位,在收到置这个标志位的数据包后,连接就会被关闭,此时接收到 RST的一方,在应用层会看到一个 connection reset 或 connection refused 的报错。
错误代码502怎么修,502网关错误怎么解决
而之所以发出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的时间调大一些就好了。
错误代码502怎么修,502网关错误怎么解决
在开发过程中,这种情况是最常见的。

现在我们大部分的服务器都会将挂掉的服务重启,因此我们需要判断下服务是否曾经崩溃过。

如果你有对服务端的cpu或者内存做过监控,可以看下CPU或内存的监控图是否出现过断崖式的突然下跌。如果有,十有八九百,就是你的服务端应用程序曾经崩溃过。
错误代码502怎么修,502网关错误怎么解决
除此之外你还通过下面的命令,看下进程上次的启动时间是什么时候。

ps -o lstart {pid}复制代码
比如我要看的进程id是13515,命令就需要像下面这样。

# ps -o lstart 13515 STARTEDWed Aug 31 14:28:53 2022复制代码
可以看到它上次的启动时间是8月31日,这个时间如果跟你印象中的操作时间有差距,那说明进程可能是崩了之后被重新拉起了。

遇到这种问题,最重要的是找出崩溃的原因,崩溃的原因就多种多样了,比如,对未初始化的内存地址进行写操作,或者内存访问越界(数组arr长度明明只有2,代码却读arr[3])。

这种情况几乎都是程序有代码逻辑问题,崩溃一般也会留下代码堆栈,可以根据堆栈报错去排查问题,修复之后就好了。比如下面这张图是golang的报错堆栈信息,其他语言的也类似。
错误代码502怎么修,502网关错误怎么解决

不打印堆栈的情况
但有一些情况,有时候根本不留下堆栈。

比如内存泄露导致进程占用内存越来越多,最后导致超过服务器的最大内存限制,触发OOM(out of memory), 进程直接就被操作系统kill掉。

还有更隐蔽的,代码逻辑里隐藏了主动退出进程的操作。比如golang的日志打印里有个方法叫log.Fatalln(),打印完日志还会顺便执行os.Exit()直接退出进程,对源码不了解的新手很容易犯这个错。
错误代码502怎么修,502网关错误怎么解决
如果你很明确,你的服务没有崩过。那继续往下看。

网关将请求打到了一个不存在的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给客户端。
错误代码502怎么修,502网关错误怎么解决
要排查这种问题也不难。

这个时候,你可以看下nginx侧是否有打印相关的日志,看下转发的IP端口是否符合预期。

如果不符合预期,可以去找找做这个基础组件的同事,进行一波友好的交流。

总结HTTP状态码用来表示响应结果的状态,其中200是正常响应,4xx是客户端错误,5xx是服务端错误。客户端和服务端之间加入nginx,可以起到反向代理和负载均衡的作用,客户端只管向nginx请求数据,并不关心这个请求具体由哪个服务器来处理。后端服务端应用如果发生崩溃,nginx在访问服务端时会收到服务端返回的RST报文,然后给客户端返回502报错。502并不是服务端应用发出的,而是nginx发出的。因此发生502时,后端服务端很可能没有没有相关的502日志,需要在nginx侧才能看到这条502日志。如果发现502,优先通过监控排查服务端应用是否发生过崩溃重启,如果是的话,再看下是否留下过崩溃堆栈日志,如果没有日志,看下是否可能是oom或者是其他原因导致进程主动退出。如果进程也没崩溃过,去排查下nginx的日志,看下是否将请求打到了某个不知名IP端口上。
来源:

本站部分内容由互联网用户自发贡献,该文观点仅代表作者本人,本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如发现本站有涉嫌抄袭侵权/违法违规等内容,请联系我们举报!一经查实,本站将立刻删除。

(0)

相关推荐

  • 如何添加mx记录(简单易学:如何添加mx记录)

    在本文《简单易学:如何添加MX记录》中,将会详细阐述MX记录的概念以及如何添加MX记录。通过本文的阅读,读者将能够充分了解MX记录的作用与重要性,掌握添加MX记录的技巧,以此保证域名高效运行,并避免因没有配置好MX记录而造成的一系列问题。 一、MX记录的概念与作用 MX记录是指邮件交换记录,它是一种用来指示接收某个邮件服务器的邮件转发规则的DNS记录类型。M…

    网站建设 2023-05-05
  • 德国的域名有哪些(以.de为中心,拟1个新标题:德国最具代表性的城市景点推荐Top 10)

    德国是一座充满历史和文化遗产的国家,对游客来说是一个非常受欢迎的旅游目的地。在德国境内,有许多城市都拥有独具特色的景点,这些景点吸引着来自世界各地的游客。本文将从四个方面为读者推荐德国最具代表性的城市景点Top 10。 一、文化古迹 1. 慕尼黑的“新城厢”:新城厢是一座由巴洛克建筑风格与文艺复兴风格相结合的宫殿,现在是巴伐利亚历史博物馆的所在地。 2. 柏…

    网站建设 2023-05-18
  • 如何查询mysql数据库密码(如何找回MySQL的数据库密码)

    MySQL是一种常用的关系型数据库,但是在管理这个数据库时,如果忘记了数据库密码,会带来很大的麻烦。本文将从以下四个方面来阐述如何找回MySQL的数据库密码,包括使用配置文件查找密码、通过应用程序获取密码、通过MySQL管理员账户更改密码、通过root账户更改密码。通过这篇文章,读者可以学习到失去MySQL数据库密码时的解决办法。 一、使用配置文件查找密码 …

    网站建设 2023-05-12
  • 怎么去创立一个网站,建网站的八个步骤

    如何建立自己的网站?本文提供详细的步骤和指南,帮助您从零开始创建您的个人网站或小岛。在数字时代,拥有一个个人网站是建立在线存在的重要一环。无论是展示作品、分享知识,还是拓展社交网络,建立自己的网站都是实现这些目标的有效方式。本文将为您提供一系列的步骤和指南,帮助您轻松创建您的网站。 ·一、规划网站。在开始建网站之前,规划是至关重要的一步。以下是需要考虑的因素…

    2023-08-30
  • 昆明网络推广公司有哪些(昆明网络推广公司排名前十的实力公司推荐)

    本文着眼于昆明网络推广公司排名前十的实力公司推荐,综合评估了这些公司的业绩、口碑、服务、技术等多个方面,选出了其中优秀的四家公司进行介绍。这篇文章旨在为读者提供有针对性的信息,帮助他们更好地选择网络推广公司。 一、口碑优良的昆明澳比网络科技 昆明澳比网络科技是一家集网络推广、网站建设、电子商务等业务为一体的公司。公司多年来致力于为各行业客户提供科学合理的网络…

    网站建设 2023-05-03
  • 本地用户和组 哪些是(本地用户与组管理的实现方法及技巧)

    本文主要介绍本地用户与组管理的实现方法及技巧。在现代计算机系统中,管理本地用户和组是非常重要的一个任务,尤其对于复杂的组织结构和敏感数据的管理工作来说更是如此。本文从四个方面对本地用户与组管理的实现方法及技巧做详细的阐述,涵盖了用户管理、组管理、安全策略、以及常用工具。” 一、用户管理 在本地用户管理中,有多种方法可以添加、修改、删除本地用户。其中最常用的方…

    网站建设 2023-05-06
  • q群怎么拉人 如何拉人入QQ群讨论

    一、引言 QQ群作为一种网络社交方式,已经成为了我们日常生活的重要组成部分。人们可以在QQ群里交流学习、分享经验、结交朋友等。而一个活跃的QQ群需要有大量的成员参与讨论,如何拉人入QQ群讨论就成为了群主和管理员必须要解决的问题。本文就从四个方面对如何拉人入QQ群讨论进行详细阐述。 二、正文 1、利用好自身资源 一个活跃的QQ群需要有大量的成员参与讨论,因此在…

    网站建设 2023-05-20
  • 网络营销的策略有哪些(网络营销:制胜关键词和策略)

    本文将介绍网络营销中制胜关键词和策略的重要性。首先,我们将为读者提供一些相关的背景信息,然后从四个方面对此进行阐述,包括关键词的选择、内容营销策略、社交媒体和搜索引擎优化等方面。最后,我们将总结本文的主要观点和结论。 一、关键词的选择 1、了解目标受众。选择关键词时,首先要确定目标受众是谁,需要考虑他们的年龄、性别、职业等因素,然后选取相关的关键词。 2、研…

    网站建设 2023-05-15
  • 中小企业怎么做推广 中小企业推广策略

    介绍:中小企业推广策略 中小企业推广策略是一项重要的任务,不仅是为了增加销售额和扩大市场份额,更是为了建立企业品牌和提高企业形象。在当今竞争激烈的市场中,中小企业需要使用多种有效的推广策略来吸引潜在客户,并使其忠诚于企业的品牌和产品。本文将从4个方面对中小企业如何做推广进行详细阐述。 正文: 一、网络推广 网络推广是现代企业推广策略中最受欢迎和常用的一种方式…

    网站建设 2023-05-21
  • 苹果怎么企业邮箱,苹果邮箱设置企业邮箱

    一休哥苹果签名简介:点击可查看联系方式1、首先我们需要去注册一个邮箱,如果没有注册的话,可以通过网站上下载安装,也是很简单的,打开自己电脑或者在浏览器搜索自己的邮箱号,找到后点击发送即可。 2、我们点击发送后会弹出一个输入框,这里需要输入密码和用户名和短信验证码,验证成功后会提示验证通过。 3、验证完成后点击保存按钮(也可以在这里下载)就可以进行下载了,文件…

    2023-08-31
  • 如何为空间指定域名(空间指定域名,一步解决网站命名难题)

    随着互联网的普及,建立自己的网站成为了越来越多人的需求。然而,命名一个网站却是一个比较困难的问题。幸运的是,现在有一种新的方法可以帮助用户轻松地解决这个问题——空间指定域名。本文将从四个方面介绍这种新方法。 一、什么是空间指定域名? 在互联网上,每一个网站都需要一个独特的网址。通常情况下,用户需要自己购买一个域名并将其指向自己的空间。但事实上,现在有些空间提…

    网站建设 2023-05-10
  • 如何做网页推广赚钱 网页推广赚钱方法

    如何做网页推广赚钱 网页推广赚钱方法 随着互联网的发展,网页推广已经成为了许多企业和个人赚取收益的一种途径。如何做好网页推广并赚取丰厚的收益成为了大家共同关心的话题。本文从网页推广的定义、网页推广的重要性、网页推广的策略和网页推广的技巧四个方面详细阐述如何做好网页推广赚取收益。 一、网页推广的定义 网页推广是指通过各种网络资源和工具对网站进行宣传、推广和营销…

    网站建设 2023-05-18