我有一个在Elastic 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
连接当健康检查ping一个站点时,它是ping你的自定义域(example.com
)还是正在使用elasticbeanstalk.com
域?我该怎么做才能解决这个问题或进一步诊断错误?我宁愿不允许在elasticbeanstalk.com
域中的流量,因为我认为我不能获得SSL。
失败的原因是健康检查检查EC2实例私有IP。这可以随ELB而改变,因此您需要动态获取实例的私有IP并将其添加到主机。见How to dynamically add EC2 ip addresses to Django ALLOWED_HOSTS
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)
(可能)不好的答案
我在另一个SO post找到了这个答案。虽然它解决了这个问题,但我认为这不是一个好的答案,可能不安全。
如果您将此代码添加到.ebextensions/something.config
文件中,它会将具有特定状态请求的Health Checker的任何请求重定向到您的域。
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>
将/status/
替换为Config -> Loan Balancer -> Health Check Path
中指定的运行状况检查URL,并将sub.example.com
替换为您的域名。他们还更新了健康检查器,所以它现在是ELB-HealthChecker/2.0
- 另一件需要注意的事情。
但是:出于安全原因,它可能不太好,我认为这可能是欺骗性的。如果您使用默认的/
链接,有人可以欺骗ELB-HealthChecker/2.0
,然后轻松猜测您的链接。我不太熟悉某人可以用set Host
命令做什么,它可能是无害的。