我的 Elastic Beanstalk 应用程序处于恒定severe
状态...即使它运行良好。
查看“健康”屏幕,它显示 100% 的请求都是3xx
,并且查看日志,这显然得到了证实:
[29/Nov/2017:10:07:46 +0000] "GET / HTTP/1.1" 302 356 "-" "ELB-HealthChecker/2.0"
这非常有意义,因为/
302 会将您重定向到“登录”页面。
问题是,我已经告诉 AWS/
在检查运行状况时不要使用,而是使用/news
应该始终返回的200
,无论您是否登录:
我尝试将健康检查 URL 更改为其他合适的端点,并重新启动 EC2 实例,但它总是返回检查/
(根据日志)。我给了它 12 个小时,看看它是否也会及时改变。
那么为什么它会不断检查/
并返回severe
状态?我该怎么做才能解决这个问题?这可能是安全组问题吗(即使该网站向公众开放)?
答案1
错误似乎是由健康检查引起的应用程序负载均衡器,不是 Elastic Beanstalk 应用程序。ALB 需要将其目标改变在不同的地方(查看文档)。
一旦我知道了这一点,这个问题就很容易解决了:
使用控制台修改目标组的运行状况检查设置
- 打开 Amazon EC2 控制台https://console.aws.amazon.com/ec2/。
- 在导航窗格上的“负载平衡”下,选择“目标组”。
- 选择目标群组。
- 在“运行状况检查”选项卡上,选择“编辑”。
- 在编辑目标组页面上,根据需要修改设置,然后选择保存。
答案2
我在 Amazon Linux 2 上的 Elastic Beanstalk 的多容器 Docker 环境中运行 Django 服务器,这个问题让我非常头疼。我以为是 Nginx 的问题,但即使运行着 Nginx 容器,问题仍然没有解决!所以我的应用程序可以访问并运行,但状态很严重,它只在 EB 健康仪表板上显示目标不匹配错误……但没有代码!使用 Django Reinhardt 的答案,我发现错误代码显示在负载均衡器设置的目标组部分!果然,我400
在健康检查中遇到了错误。
使用这个帖子,我了解到健康检查发生在私有 AWS IP 上!如果此 IP 不在您的范围内ALLOWED_HOSTS
,则会出现 400 错误!使用 进行测试后ALLOWED_HOSTS = ['*']
(不要在生产中这样做!),问题消失了!
不确定是否仍需要 Nginx 容器。下一步是动态添加相关的 AWS IP ALLOWED HOSTS
(例如这里)
答案3
我创建了一个带有“经典”负载均衡器的新环境,并从现有环境中复制了所有设置,然后就解决了这个问题。我的“应用程序”负载均衡器配置错误,我没费心去弄清楚问题出在哪里。