Как пройти проверку работоспособности 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()))
Читайте полную статью об этом здесь