AWS EBS 中 HTTP 502错误网关的故障排除

了解如何在 AWS EBS 中故障诊断 HTTP502错误网关


我们将在本文中讨论的应用程序是在 Amazon Web Services (AWS)中的 Elastic Bean}(EBS)服务上运行的。这个应用程序间歇性地抛出 HTTP502Bad 网关错误。在这篇文章中,让我们讨论如何在 Elastic Bean}服务中排除和解决这个 HTTP 502错误网关错误。

AWS Elastic Beanstalk Architecture

AWS Elastic Beanstalk结构

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

AWS EBS 中 HTTP 502错误网关的故障排除

图: AWS Elastic Beanstalk


有一个自动气象站弹性负载平衡器的前沿。这个负载均衡器将把流量分配给一组 EC2实例(可以自动缩放)。每个 EC2实例将有一个 Nginx Web 服务器和一个 Tomcat 应用程序服务器。弹性负载均衡器发送的请求首先由 Nginx 服务器处理。然后 Nginx 服务器将请求转发到 tomcat 服务器。

HTTP 502 Bad Gateway Error


这个应用程序间歇性地(并非总是)抛出 HTTP502错误网关错误。几秒钟后,服务将再次恢复,事情将开始正常运作。目前还不清楚是什么原因导致了 AWS Elastic Bean}环境中的 HTTP502错误网关。

我们首先需要理解这个 HTTP502错误网关错误意味着什么。当 Web 服务器/网关/代理服务器从与之交谈的后端服务器获得无效响应时,将抛出此错误。

HTTP 502 Thrown by Nginx in AWS EBS

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

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

在这3个组件中哪一个是抛出 HTTP502坏网关错误?

AWS EBS 中 HTTP 502错误网关的故障排除

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

上面是我们接收到的 HTTP502坏网关错误的截图。在这个屏幕截图中有一个线索来指示是谁抛出了这个 HTTP502错误。如果您注意到屏幕上突出显示的部分,您将看到 Nginx 服务器抛出这个 HTTP502坏网关错误。

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

Out of Memory: Kill Process or Sacrifice Child

为了确定问题的根源,我们在运行 tomcat 服务器的 EC2实例上执行了开源的 yCrash 脚本。YCrash 脚本从技术堆栈中捕获了16个不同的工件,其中包括: 垃圾收集日志、线程转储、堆转储、 ps、 top、 top-H、 vmstat、 netstat,... ..。我们将捕获的构件上传到 yCrash 服务器进行分析。

YCrash 脚本捕获的构件之一是内核日志文件。在这个日志文件中,可以找到 Linux 内核中发生的所有事件。YCrash 从日志文件中提取出关键错误和警告并显示它们。下面是 yCrash 生成的内核日志的分析报告。

AWS EBS 中 HTTP 502错误网关的故障排除

图: yCrash 的内核日志分析报告“内存不足: 终止进程或牺牲子进程”

请参阅内核日志中突出显示的错误消息:

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

它表示作为 Java 进程的 Tomcat 服务器已经终止。如果进程的内存消耗超过了设备的 RAM 容量限制,Linux 内核将终止进程。这也是在这个应用程序中发生的确切场景。只要应用程序的内存消耗超过容量限制,Linux 内核就会终止 tomcat 服务器。

根本原因-内存不足

现在的问题是: Linux 如何终止可能导致间歇性 HTTP 502错误网关错误的 tomcat 服务器?难道不应该完全停机吗?这是个合理的问题。

如果您还记得,这个应用程序正在 AWS Elastic Bean}(EBS)服务上运行。每当 tomcat 服务终止时,EBS 服务将自动重新启动 tomcat 服务器。所以很搞笑。Linux 正在终止,EBS 正在重新启动 tomcat 服务器。在这个间歇期间,客户经历 HTTP502坏网关错误。

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

显然,应用程序运行在仅有1GB RAM 容量的 EC2实例上。运行 tomcat 服务器、 Nginx 服务器和其他内核进程的内存不足。因此,当应用程序升级为在2GB RAM 容量的 EC2实例上运行时,问题得到了解决。

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



发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章