Обработка динамических IP в Django ALLOWED_HOSTS с помощью nginx

У меня проблемы с моим nginx.conf, который, как я полагаю, заставляет экземпляр перезапускаться снова и снова, поскольку проверка работоспособности не удается на моей службе управляемых контейнеров.

Я запускаю свою установку в AWS Lightsail Containers, где у меня запущены три контейнера:

  • nginx
  • django
  • nextjs

При публикации нового выпуска на моем экземпляре AWS Lightsail он работает нормально в течение нескольких минут, затем возникает ошибка 503, из-за которой экземпляр перезагружается - работает несколько минут, затем снова перезагружается.

Просмотрев журналы, я вижу, что проверка здоровья не удалась, и django выбрасывает ошибку, говоря, что я должен добавить IP-адрес запроса в список разрешенных хостов:

[28/Aug/2021:13:56:23] Invalid HTTP_HOST header: 'x.x.x.x'. You may need to add 'x.x.x.x' to ALLOWED_HOSTS.
[28/Aug/2021:13:56:23] Bad Request: /health.txt

Проблема в том, что мой контейнерный сервис lightsail не имеет статического IP (и я не верю, что могу получить статический IP).

My current nginx.conf is below (feedback is appreciated). My question here is how should I deal with this issue? I feel like setting ALLOWED_HOSTS = ['*'] is not a great approach. Can I hardcode the host for the healthcheck or similar?

nginx.conf:

upstream backend {
    server ${BACKEND_HOST}:${BACKEND_PORT};
}
upstream frontend {
    server ${FRONTEND_HOST}:${FRONTEND_PORT};
}

server {
    listen 80 default_server;
    server_name kalasknack.dev;
    server_tokens off;

    gzip on;
    gzip_proxied any;
    gzip_comp_level 4;
    gzip_types text/css application/javascript image/svg+xml;

    location /robots.txt {
        include proxy_params;
        proxy_pass http://backend;
    }

    location /health.txt {
        include proxy_params;
        proxy_pass http://backend;
    }

    location /api {
        include proxy_params;
        proxy_pass http://backend;
    }

    location /admin {
        include proxy_params;
        proxy_pass http://backend;
    }
    
    location / {
        proxy_pass http://frontend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

}

Я использую AWS EC2, для прохождения проверки здоровья я получаю ip экземпляра динамически, а затем вставляю его в ALLOWED_HOSTS (думаю, это должно работать и для Lightsail Containers):

import requests

def get_instance_ip():
    try:
        ip = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4').text
    except requests.exceptions.ConnectionError:
        return None
    return ip

AWS_IP = get_ec2_instance_ip()

if AWS_IP is not None:
    ALLOWED_HOSTS += [AWS_IP]

Вы также можете создать промежуточное ПО, которое всегда возвращает код состояния 200 для пути, используемого проверкой здоровья (вставьте пользовательское промежуточное ПО перед django.middleware.security.SecurityMiddleware в MIDDLEWARE, чтобы избежать ошибки Invalid HTTP_HOST header).

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