Как пройти проверку работоспособности AWS ELB с помощью Django ALLOWED_HOSTS = [my-site.com]

У меня есть приложение Django, развернутое на AWS через ECS (Dockerized) с использованием gunicorn и nginx. Как DEBUG=False для развертывания Django я настроил логирование на получение логов о WARNINGs & выше через mail_admins.

При стандартной настройке на конфигурации nginx (см. ниже) я начал получать тонны логов (писем) с ошибками 'BadRequest' или 'DisallowedHost' (скорее всего, боты для сканирования/скрепинга), которые отвергались Django, поскольку я установил свои ALLOWED_HOSTS=[my-site.com].

nginx.conf

upstream django-backend {
    server 172.17.0.1:8000;
}

server {
    listen 80;

    location / {
        proxy_pass http://django-backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
    }
}

Я следовал примерам из следующих решений, чтобы блокировать трафик, попадающий в мое приложение Django:

В конечном итоге nginx.conf обновляется с:

server {
    listen      80;
    server_name "";
    return      444;
}

server {
    listen 80;
    server_name my-site.com;
    # Rest of configuration
}

Это работало довольно хорошо, однако я не смог настроить nginx таким образом, чтобы позволить AWS ELB выполнять проверку здоровья, и у меня были следующие журналы в AWS:

xxx.xx.xx.xx - - [26/Feb/2024:19:30:03 +0000] "GET /health HTTP/1.1" 444 0 "-" "ELB-HealthChecker/2.0" "-"
xxx.xx.xx.xx - - [26/Feb/2024:19:30:03 +0000] "GET /health HTTP/1.1" 444 0 "-" "ELB-HealthChecker/2.0" "-"
xxx.xx.xx.xx - - [26/Feb/2024:19:30:03 +0000] "GET /health HTTP/1.1" 444 0 "-" "ELB-HealthChecker/2.0" "-"

У меня есть проверка здоровья, установленная: от @Watt Iamsuri здесь

У кого-нибудь есть предложения по решению, как пройти проверку работоспособности AWS ELB в этом случае?

Проверка работоспособности будет неудачной, так как в заголовке Host запроса при проверке работоспособности ELB установлен частный IP-адрес контейнера. Этот IP-адрес должен быть добавлен в список ALLOWED_HOSTS в настройках Django.

Вы можете настроить его на динамическое обновление:

from socket import gethostbyname
from socket import gethostname

# assuming ALLOWED_HOSTS is set in your environment as so:
# ALLOWED_HOSTS='domain.com,anotherdomain.com'

ALLOWED_HOSTS = os.environ.get("ALLOWED_HOST").split(",") #or however you set it.
ALLOWED_HOSTS.append(gethostbyname(gethostname()))

Читайте полную статью об этом здесь

Вернуться на верх