首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ELB HealthCheck的Django ALLOWED_HOSTS

使用ELB HealthCheck的Django ALLOWED_HOSTS
EN

Stack Overflow用户
提问于 2014-12-31 19:07:35
回答 6查看 4.4K关注 0票数 11

我在Elastic Beanstalk上部署了一个django应用程序。我的应用程序的HealthCheck一直失败,因为我的ALLOWED_HOSTS设置变量中没有包含ELB HealthCheck的IP。

如何修改ALLOWED_HOSTS使HealthCheck通过?我只需要传递显式的IP地址,但我相信这种情况会发生变化,所以每当IP发生变化时,检查都会再次失败,直到我添加新的IP。

EN

回答 6

Stack Overflow用户

发布于 2015-11-05 00:51:48

您的EC2实例可以查询metadata自身的相关信息,包括其IP地址(可在http://169.254.169.254/latest/meta-data/local-ipv4中找到)。

您可以通过ssh进入您的EC2实例并运行:

代码语言:javascript
复制
curl http://169.254.169.254/latest/meta-data/local-ipv4

因此,在您的配置中,您可以执行以下操作:

代码语言:javascript
复制
import requests

ALLOWED_HOSTS = ['.yourdomain.com', ]
try:
    EC2_IP = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4').text
    ALLOWED_HOSTS.append(EC2_IP)
except requests.exceptions.RequestException:
    pass

显然,如果您不想要依赖项,可以用urllib替换requests

票数 18
EN

Stack Overflow用户

发布于 2020-10-31 23:58:22

这是另一个使用Django中间件的解决方案。

Django的django.middleware.common.CommonMiddleware调用request.get_host(),后者使用ALLOWED_HOSTS验证请求。如果您只是想检查应用程序是否正在运行,您可以像这样创建一个中间件。

代码语言:javascript
复制
from django.http import HttpResponse


class HealthCheckMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.path == '/health':
            return HttpResponse('ok')
        return self.get_response(request)

settings.py中把你的HealthCheckMiddleware放在CommonMiddleware前面

代码语言:javascript
复制
MIDDLEWARE = [
    'yourdjangoapp.middleware.HealthCheckMiddleware',
    ......
    'django.middleware.common.CommonMiddleware',
    ......
]

而且,只要你的应用程序正在运行,无论配置如何,你的应用程序都会通过ok响应path /health

票数 12
EN

Stack Overflow用户

发布于 2021-11-19 16:30:49

解决方案

对我有效的解决方案是简单地安装django-ebhealthcheck库。安装后,只需在INSTALLED_APPS中添加ebhealthcheck.apps.EBHealthCheckConfig即可。

来自django-ebhealthcheck GitHub:

默认情况下,Elastic Beanstalk的健康检查系统在发出请求时会使用每个负载均衡实例的公网IP作为请求的host头部。除非添加到ALLOWED_HOSTS中,否则这会导致Django返回一个400Bad Request和一个失败的健康检查。

这个应用程序动态地将你的实例的公共IP地址添加到Django的ALLOWED_HOSTS设置中,以允许健康检查成功。这在应用程序启动时发生。

版本2.0.0及更高版本支持IMDSv2。如果您使用的是v1并且无法升级,请使用此库的版本1 (pip install django-ebhealthcheck<2.0.0)。

安装

  1. pip install django-ebhealthcheck

  1. 向您的INSTALLED_APPS:

添加ebhealthcheck.apps.EBHealthCheckConfig

代码语言:javascript
复制
INSTALLED_APPS = [
    ...
    'ebhealthcheck.apps.EBHealthCheckConfig',
    ...
]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27720254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档