Django和Elastic Beanstalk URL运行状况检查

Django和Elastic Beanstalk URL运行状况检查,第1张

概述我有一个Django webapp.它在Elastic Beanstalk上的Docker中运行. 我想指定一个health check URL用于稍微更高级的健康检查,而不是“ELB可以建立TCP连接”. 完全合理的是,ELB通过使用实例的主机名(例如ec2-127-0-0-1.compute-1.amazonaws.com)作为主机头连接到HTTP实例来完成此 *** 作. Django有ALLOWE 我有一个Django webapp.它在Elastic Beanstalk上的Docker中运行.

我想指定一个health check URL用于稍微更高级的健康检查,而不是“ELB可以建立TCP连接”.

完全合理的是,ELB通过使用实例的主机名(例如ec2-127-0-0-1.compute-1.amazonaws.com)作为主机头连接到http实例来完成此 *** 作.

Django有ALLOWED_HOSTS验证传入请求的主机头.我通过环境变量将它设置为我的应用程序的外部域.

不出所料,完全合理的是,由于缺少匹配的主机,Django因此拒绝ELB URL健康检查.

我们不想禁用ALLOWED_HOSTS,因为我们希望能够信任get_host().

到目前为止,解决方案似乎是:

>以某种方式说服Django不关心某些特定路径的ALLOWED_HOSTS(即健康检查URL)
>做一些时髦的事情,比如在启动时调用EC2 info API来获取主机的FQDN并将其附加到ALLOWED_HOSTS

这些都不是特别令人愉快.有人可以推荐更好/现有的解决方案吗?

(为避免疑问,我认为这个问题与“禁用ALLOWED_HOSTS,面向主机上过滤的httpD前端”的情况相同 – 我希望健康检查能够点击Django,而不是前面的httpD)

解决方法 如果ELB运行状况检查使用包含d性beanstalk域(* .elasticbeanstalk.com或EC2域* .amazonaws.com)的主机头发送其请求,则标准ALLOWED_HOSTS仍可用于’的通配符条目. amazonaws.com’或’.elasticbeanstalk.com’.

在我的情况下,我收到标准的ipv4地址作为健康检查主机,因此需要一个不同的解决方案.如果您根本无法预测主机,并且假设您不能预测主机可能更安全,则需要采取以下路线之一.

您可以使用Apache来处理已批准的主机,而不是将不明确的请求传播到Django.由于主机头旨在成为接收请求的服务器的主机名,因此此解决方案会更改有效请求的标头以使用预期的站点主机名.使用d性beanstalk,您需要使用.ebextensions配置Apache,如here所述.在项目根目录下的.ebextensions目录下,将以下内容添加到.config文件中.

files:  "/etc/httpd/conf.d/eb_healthcheck.conf":    mode: "000644"    owner: root    group: root    content: |        <If "req('User-Agent') == 'ELB-HealthChecker/1.0' && %{REQUEST_URI} == '/status/'">            Requestheader set Host "example.com"        </If>

使用您站点的相应域替换/状态/使用您的运行状况检查URL和example.com.这告诉Apache检查所有传入请求并使用正在请求相应运行状况检查URL的相应​​运行状况检查用户代理更改请求上的主机头.

如果您真的不想配置Apache,可以编写自定义中间件来验证运行状况检查.中间件必须覆盖Django的CommonMiddleware,它调用httpRequest的get_host()方法来验证请求的主机.你可以这样做

from django.mIDdleware.common import CommonMIDdlewareclass CommonOverrIDeMIDdleware(CommonMIDdleware):    def process_request(self,request):        if not('http_USER_AGENT' in request.Meta and request.Meta['http_USER_AGENT'] == 'ELB-HealthChecker/1.0' and request.get_full_path() == '/status/'):            return super().process_request(request)

这只允许任何健康检查请求跳过主机验证.然后在settings.py中用path.CommonOverrIDeMIDdleware替换django.mIDdleware.common.CommonMIDdleware.

我建议使用Apache配置方法来避免中间件中的任何细节,并完全将Django与主机问题隔离开来.

总结

以上是内存溢出为你收集整理的Django和Elastic Beanstalk URL运行状况检查全部内容,希望文章能够帮你解决Django和Elastic Beanstalk URL运行状况检查所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1207174.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存