如何调试 ElasticBeanstalk 错误“X% 的请求因 HTTP 5xx 失败”

Posted

技术标签:

【中文标题】如何调试 ElasticBeanstalk 错误“X% 的请求因 HTTP 5xx 失败”【英文标题】:How to debug ElasticBeanstalk error "X% of the requests are failing with HTTP 5xx" 【发布时间】:2016-02-01 18:11:15 【问题描述】:

我的问题与AWS: None of the Instances are sending data 类似,但错误消息略有不同。

我有一个在 ElasticBeanstalk 上运行的 Rails 应用程序,它似乎运行正常。增强的健康监控会定期向我发送错误消息,例如:

环境健康状况已从“正常”转变为“降级”。 20.0 % 请求失败,HTTP 5xx。

百分比变化高达 100%。尽管我没有进行任何更改,但一分钟后我收到一条后续消息,告诉我一切都恢复正常了:

环境健康状况已从“退化”转变为“正常”。

我已经从 ElasticBeanstalk 下载了完整的日志,但我不知道具体在哪里查看(不同目录中大约有 20 个不同的日志文件)。

我目前正在使用具有最小数据库、服务器等实例的免费 AWS 层。这可能是原因吗?我应该查看哪些日志文件,我应该寻找什么?

【问题讨论】:

【参考方案1】:

我在 Elastic Beanstalk 上运行 rails 应用程序,并发现将 Beanstalk 视为运行您的 rails 应用程序和 Web 服务器(Passenger 或 Puma)的计算机(在本例中为 Amazon EC2 实例)很有帮助。当您收到 500 错误时,可能是因为您的 rails 应用程序未正确部署——在这种情况下,Passenger 或 Puma 将返回错误——或者您的应用程序已正确部署但遇到了错误,就像在本地计算机上一样。

在任何一种情况下,要诊断错误,请从您的 AWS 控制台下载完整日志(打开正确的应用程序环境,然后选择日志 > 请求日志 > 完整日志 > 下载)。部署错误更难诊断,但我建议从查看 var-XX/logs/log/eb-activity.log 开始。我怀疑您的错误来自您的 Rails 应用程序本身,在这种情况下,我建议查看 var-XX/app/support/logs/passenger.logproduction.log。要查找 500 错误,请搜索“500 Internal”,然后像对待任何其他 Rails 错误一样处理该错误。

【讨论】:

感谢您的提示。 Passenger.log 列出了ActionView::MissingTemplate,但命名的视图肯定存在(它是主页)。当我不使用 XML 时,错误消息提到 :formats=>[:xml] - 这可能是脚本/机器人试图访问该页面吗?这也可以解释为什么问题会自动消失? 我会尝试将respond_to :html 添加到主页的控制器中,看看是否有帮助 肯定有机器人试图访问公共站点上的特定路径。我不确定为什么,但怀疑是网络爬虫索引页面或寻找漏洞。因此,您可能会收到大约 500 个错误。我不确定为什么它会导致您的环境不被视为健康。是否设置了健康检查链接? 注意:我没有从 AWS 文档中立即发现它,但似乎健康检查器正在监视 Web 服务器(nginx、apache)和应用程序服务器(puma、passenger)日志到获取这些代码 - 正如我最初所想的那样,它只是 ELB 健康检查请求/响应。【参考方案2】:

您可以转到 EC2 实例并运行应用程序,就像在本地计算机上运行并查看日志一样。

您可以使用命令eb sshssh 进入您的EC2 实例并转到/opt/python/ 目录(对于Ruby 或其他编程语言会有所不同)。

/opt/python/run 是您可以在其中找到从 EC2 实例运行的应用程序版本的目录。在run 目录中查找目录venvapp

注意:上述文件夹结构适用于 Python,但对于任何其他编程语言,在部署后都可以找到类似的文件夹结构。只需为您的编程语言查找部署环境的标准目录结构即可。

对于 Python:

/opt/python: Root of where you application will end up.
/opt/python/current/app: The current application that is hosted in the environment.
/opt/python/on-deck/app: The app is initially put in on-deck and then, after all the deployment is complete, it will be moved to current. If you are getting failures in your container_commands, check out out the on-deck folder and not the current folder.
/opt/python/current/env: All the env variables that eb will set up for you. If you are trying to reproduce an error, you may first need to source /opt/python/current/env to get things set up as they would be when eb deploy is running.
/opt/python/run/venv: The virtual env used by your application; you will also need to run source /opt/python/run/venv/bin/activate if you are trying to reproduce an error.

【讨论】:

【参考方案3】:

我知道这有点晚了,但我想评论一下我用来查找错误的技巧,我曾经通过 ssh 连接,然后,一旦在应用程序中,我尝试输入“rails 控制台”它曾经失败,但它通常会显示您正在犯的错误。这个小技巧几次救了我的命。希望对您有所帮助!

【讨论】:

我的意思是,有时(实际上经常)只是在环境(生产中的应用程序)中运行 rails 控制台,而不是在所有日志文件中搜索,而是直接在代码中显示错误所在的文件在尝试启动 Rails 控制台后立即

以上是关于如何调试 ElasticBeanstalk 错误“X% 的请求因 HTTP 5xx 失败”的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Beanstalk 泊坞窗错误

如何使用aws elasticbeanstalk中的钩子运行部署后脚本?

elasticbeanstalk的捆绑安装错误

调试 Elastic Beanstalk Docker 运行失败?

Elastic Beanstalk CloudWatch 日志流停止工作 – 如何调试

AWS Elasticbeanstalk 部署错误