解决AWS EBS中HTTP 502错误网关的问题

391 阅读5分钟

解决AWS EBS中HTTP 502错误网关的问题

发布者::Ram Lakshmanan inWeb Development June 1st, 2022 0 Views

我们将在这篇文章中讨论的应用程序是在亚马逊网络服务(AWS)的Elastic Beanstalk(EBS)服务上运行。这个应用程序间歇性地抛出HTTP 502 Bad Gateway错误。在这篇文章中,让我们讨论一下我们是如何在Elastic Beanstalk服务中排查和解决这个HTTP 502坏网关错误的。

AWS Elastic Beanstalk架构

这个应用程序运行在AWS Elastic Load Balancer、Nginx 1.18.0、Java 8、Tomcat 8、AWS Elastic BeanStalk服务(EBS)的Amazon Linux上。对于那些对EBS不太熟悉的人来说,下面是它的高层架构。

图:AWS Elastic Beanstalk架构

在最前面有一个AWS弹性负载平衡器。这个负载平衡器将把流量分配给一组EC2实例(可以自动扩展)。每个EC2实例将有一个Nginx网络服务器和一个Tomcat应用服务器。弹性负载平衡器发送的请求首先由Nginx服务器处理。然后Nginx服务器将请求转发给Tomcat服务器。

HTTP 502 坏网关错误

断断续续地(并不总是),这个应用程序被抛出HTTP 502坏网关错误。几秒钟后,服务将再次恢复,事情将开始正常运作。在AWS Elastic Beanstalk环境中,并不清楚是什么导致了这个HTTP 502坏网关错误。

我们首先需要了解这个HTTP 502坏网关错误意味着什么。当Web服务器/网关/代理服务器从与之对话的后端服务器得到无效的响应时,就会出现这个错误。

AWS EBS中Nginx抛出的HTTP 502

现在的问题是:EBS堆栈中有三个主要组件。

  1. 弹性负载平衡器
  2. Nginx网络服务器
  3. Tomcat应用服务器

在这3个组件中,哪一个抛出了HTTP 502的坏网关错误?

图:Nginx服务器抛出的HTTP 502坏网关错误的屏幕截图

以上是我们收到的HTTP 502坏网关错误的屏幕截图。在这张截图中,有一条线索表明谁在抛出这个HTTP 502错误。如果你注意到屏幕的高亮部分,你会看到这个HTTP 502坏网关错误是由Nginx服务器抛出的。

根据HTTP 502错误的定义,只有当Nginx从Tomcat服务器得到无效的响应时,才会抛出这个错误。因此,这条线索有助于缩小Tomcat服务器是问题的来源。

内存耗尽。杀死进程或牺牲孩子

为了确定问题的来源,我们在运行Tomcat服务器的EC2实例上执行了开源的yCrash脚本。垃圾收集日志、线程转储、堆转储、ps、top、top -H、vmstat、netstat、.....我们将捕获的工件上传到yCrash服务器中进行分析。

yCrash脚本所捕获的工件之一是内核日志文件。在这个日志文件中,可以找到所有发生在Linux内核中的事件。yCrash从日志文件中提取出关键的错误和警告,并将其呈现出来。下面是由yCrash生成的内核日志的分析报告。

图: yCrash的内核日志分析报告 "Out of memory: kill process or sacrifice child

请看内核日志中突出显示的错误信息。

[Sat May 21 17:31:00 2022] Out of memory:Kill process 24339 (java) score 874 or sacrifice child

这表明Tomcat服务器是一个Java进程,它被终止了。如果进程的内存消耗超过设备的RAM容量限制,Linux内核将终止进程。这也是发生在这个应用程序中的确切情况。每当应用程序的内存消耗超过容量限制时,Linux内核就会终止Tomcat服务器。

根本原因 - 缺乏内存

现在的问题是:Linux终止tomcat服务器是如何导致间歇性 HTTP 502错误网关的?难道不应该发生完全停电的情况吗?这是个公平的问题。

如果你还记得,这个应用程序是运行在AWS的Elastic Beanstalk(EBS)服务上。EBS服务会自动重启tomcat服务器,只要它被终止了。因此,这就很搞笑了。Linux正在终止,EBS正在重启tomcat服务器。在这个间歇期,客户遇到了HTTP 502坏网关的错误。

解决方案--升级EC2实例的RAM容量

显然,应用程序是在只有1GB内存容量的EC2实例上运行。它没有足够的内存来运行Tomcat服务器、Nginx服务器和其他内核进程。因此,当应用程序被升级到运行在2GB内存容量的EC2实例上时,问题得到了解决。

***注:*这里是另一个在非AWS环境中运行的应用程序所面临的类似问题。这可能也是一个有趣的阅读。

由我们的JCG项目合伙人Ram Lakshmanan授权发表在Java Code Geeks上。点击这里查看原文。解决AWS EBS中HTTP 502坏网关的问题

Java Code Geeks撰稿人所表达的观点属于他们自己。

2022-06-01

拉姆-拉克什马南