我在弹性beanstalk上有一个Django应用程序。我可以在example.com
访问我的网站。我已经设置了自动HTTPS重定向,以便它始终将其引向HTTPS。我已经设置了它,因此您无法查看网站example.elasticbeanstalk.com
域 - 如果您去那里,您最终会得到响应代码400。
我的自动缩放组负载平衡。我的应用程序正在使用状态代码400的健康检查失败,即使我可以导航到我的网站上的响应代码200也没有问题。我的日志显示:
***amazon IP*** (-) - - [date] "GET / HTTP/1.1" 400 26 "-" "ELB-HealthChecker/2.0"
我猜该错误是来自
- 不允许在
example.elasticbeanstalk.com
上连接 - haivng自动http-> https重定向(尽管我猜到了302)
当健康检查站点一个站点时,是ping ping your tomain(example.com
)还是固定elasticbeanstalk.com
域?我该怎么做才能解决此问题或进一步诊断错误?我宁愿不允许在elasticbeanstalk.com
域上流量,因为我认为我不能在此上获得SSL。
如果您最近迁移到Amazon Linux 2并被IMDSV2击中,那么您必须使用Security令牌
import requests
EC2_PRIVATE_IP = None
try:
security_token = requests.put(
'http://169.254.169.254/latest/api/token',
headers={'X-aws-ec2-metadata-token-ttl-seconds': '60'}).text
EC2_PRIVATE_IP = requests.get(
'http://169.254.169.254/latest/meta-data/local-ipv4',
headers={'X-aws-ec2-metadata-token': security_token},
timeout=0.01).text
except requests.exceptions.RequestException:
pass
if EC2_PRIVATE_IP:
ALLOWED_HOSTS.append(EC2_PRIVATE_IP)
失败的原因是健康检查检查EC2实例私有IP。这可以随着ELB的形式而变化,因此您需要动态获取实例的私有IP并将其添加到主机。查看如何将EC2 IP地址动态添加到Django washe_host
import requests
EC2_PRIVATE_IP = None
try: EC2_PRIVATE_IP = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4', timeout=0.01).text
except requests.exceptions.RequestException: pass
if EC2_PRIVATE_IP: ALLOWED_HOSTS.append(EC2_PRIVATE_IP)
(潜在的)不良答案
我在另一个帖子中找到了这个答案。尽管它解决了问题,但我认为这不是一个很好的答案,也可能是不安全的。
如果将此代码添加到.ebextensions/something.config
文件中,它将重定向带有特定状态请求的健康检查器的任何请求。
files:
"/etc/httpd/conf.d/eb_healthcheck.conf":
mode: "000644"
owner: root
group: root
content: |
<If "req('User-Agent') == 'ELB-HealthChecker/2.0' && %{REQUEST_URI} == '/status/'">
RequestHeader set Host "sub.example.com"
</If>
用健康检查URL在Config -> Loan Balancer -> Health Check Path
中指定的内容以及sub.example.com
替换/status/
,并用您的域。他们还更新了健康检查器,因此现在是ELB-HealthChecker/2.0
- 要注意的另一件事。
但是:出于安全原因,这可能不是很好,我认为这可能会被欺骗。如果您使用的是默认的/
链接,则有人可以欺骗ELB-HealthChecker/2.0
,然后轻松猜测您的链接。我对某人可以用set Host
命令做什么,这可能是无害的。
只是为了跟进。我在AWS Linux 2上与Django一起在AWS Linux 2上运行了一个多容器的Docker环境。即使我的应用程序可以访问,我的环境仍处于永久性严重状态!多亏了上面的答案,我了解到健康检查是在根本不是弹性豆stall URL的地址发生的!此外,在EB环境健康页面上看不到HTTP状态,我必须转到EC2页面,然后转到"目标组"。在负载平衡器下的健康检查选项卡,以发现我的应用程序正在将400
代码返回到健康检查中。为了快速测试解决方案,我刚刚添加了ALLOWED_HOSTS = ['*']
(不适合生产!),并且果然,问题消失了!
我最初认为这是一个nginx问题,因此我配置了一个与Django应用程序容器一起使用的NGINX容器。不确定是否有必要。一个完全令人沮丧且无证件的问题,但这是由于弹性豆stal的领土。