gpt4 book ai didi

Django和Elastic Beanstalk URL运行状况检查

转载 作者:行者123 更新时间:2023-12-04 06:34:04 24 4
gpt4 key购买 nike

我有一个Django Webapp。它在Elastic Beanstalk上的Docker内部运行。

我想指定health check URL来进行比“ELB可以建立TCP连接”更高级的运行状况检查。

完全合理地,ELB通过使用实例的主机名(例如ec2-127-0-0-1.compute-1.amazonaws.com)作为Host header 通过HTTP连接到实例来实现此目的。

Django有 ALLOWED_HOSTS ,用于验证传入请求的Host header 。我通过环境变量将其设置为应用程序的外部域。

不足为奇且完全合理的是,由于缺少匹配的Host,Django因此拒绝了ELB URL运行状况检查。

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

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

  • 以某种方式说服Django不在乎某些特定路径(即运行状况检查URL)的ALLOWED_HOSTS
  • 做一些时髦的事情,例如在启动时调用EC2 info API以获取主机的FQDN并将其附加到ALLOWED_HOSTS

  • 这些似乎都不是特别令人愉快。谁能推荐一个更好的/现有的解决方案?

    (为避免疑问,我认为此问题与“Disabled ALLOWED_HOSTS,前置在主机上过滤的HTTPD”的情况相同-我希望运行状况检查能打到Django,而不是前置HTTPD)

    最佳答案

    如果ELB运行状况检查正在发送带有包含弹性beantalk域(* .elasticbeanstalk.com或EC2域* .amazonaws.com)的主机头的请求,则标准ALLOWED_HOSTS仍可以与'.amazonaws.com'或通配符条目一起使用'.elasticbeanstalk.com'

    以我为例,我收到了标准的ipv4地址作为运行状况检查的主机,因此需要其他解决方案。如果您根本无法预测主机,并且更安全地假设您无法预测主机,则需要采取以下路线之一。

    您可以使用Apache处理批准的主机,而不是向Django传播含糊不清的请求。由于主机 header 旨在用作接收请求的服务器的主机名,因此该解决方案将有效请求的 header 更改为使用预期的站点主机名。使用弹性beantalk,您需要按照here所述使用.ebextensions配置Apache。在项目根目录下的.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>

    使用您的健康状况检查网址替换 /status/,并使用您网站的相应域替换 example.com。这告诉Apache检查所有传入的请求,并使用请求适当的健康检查URL的适当的健康检查用户代理更改请求的主机 header 。

    如果您真的不想配置Apache,则可以编写自定义中间件来验证运行状况检查。中间件必须重写Django的 CommonMiddleware ,后者调用 HttpRequestget_host()方法来验证请求的主机。你可以做这样的事情
    from django.middleware.common import CommonMiddleware


    class 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)

    这仅允许任何运行状况检查请求跳过主机验证。然后,将 django.middleware.common.CommonMiddleware中的 path.CommonOverrideMiddleware替换为 settings.py

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

    关于Django和Elastic Beanstalk URL运行状况检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35726032/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com