ALLOWED_HOSTS не работает в моем приложении Django, развернутом в Elastic Beanstalk - PullRequest
1 голос
/ 30 марта 2019

Я развернул приложение Django на AWS Elastic Beanstalk и получаю сообщение об ошибке «Недопустимый заголовок HTTP_HOST», даже когда добавляю его в настройки разрешенных хостов.

Я получаю эту ошибку:

Invalid HTTP_HOST header: 'recordings-env.kf4qfzaijd.us-west-2.elasticbeanstalk.com'. You may need to add 'recordings-env.kf4qfzaijd.us-west-2.elasticbeanstalk.com' to ALLOWED_HOSTS.

Вот что у меня в settings.py

settings.py

ALLOWED_HOSTS = [
    '127.0.0.1',
    'localhost',
    '.amazonaws.com',
    '.elasticbeanstalk.com',
    'recordings-env.kf4qfzaijd.us-west-2.elasticbeanstalk.com',
]

Я думаю, что проблема в том, что мои настройки не обновляются, потому что не работает, если я поставлю ALLOWED_HOSTS = ['*']. Я оставил DEBUG = True и в запросе получаю информацию: ALLOWED_HOSTS: ['localhost']

после его изменения я запускаю eb deploy без ошибок.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Я понял, что мои изменения не были развернуты, потому что мне сначала нужно было зафиксировать , и я этого не знал (мое первое развертывание на eb).Итак, это была проблема.

0 голосов
/ 30 марта 2019

Это немного сложно, потому что вам нужно динамически объявить свой ALLOWED_HOSTS с EB. Эта статья содержит некоторую полезную информацию в Gotcha # 3 о том, как этого достичь

Я бы создал отдельный файл настроек под названием что-то вроде settings_production.py, тогда вы могли бы поместить туда следующий код:

MySite / settings_production.py

from mysite.settings import *


def is_ec2_linux():
    """Detect if we are running on an EC2 Linux Instance
       See http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
    """
    if os.path.isfile("/sys/hypervisor/uuid"):
        with open("/sys/hypervisor/uuid") as f:
            uuid = f.read()
            return uuid.startswith("ec2")
    return False


def get_linux_ec2_private_ip():
    """Get the private IP Address of the machine if running on an EC2 linux server"""
    from urllib.request import urlopen
    if not is_ec2_linux():
        return None
    try:
        response = urlopen('http://169.254.169.254/latest/meta-data/local-ipv4')
        return response.read().decode("utf-8")
    except:
        return None
    finally:
        if response:
            response.close()


# ElasticBeanstalk healthcheck sends requests with host header = internal ip
# So we detect if we are in elastic beanstalk,
# and add the instances private ip address
private_ip = get_linux_ec2_private_ip()
if private_ip:
    ALLOWED_HOSTS += [private_ip, 'your-django-env.elasticbeanstalk.com']

# Other production overrides
DEBUG = False


Теперь вы задали для переменной env переменной «DJANGO_SETTINGS_MODULE» значение mysite.production_settings (т.е. в вашей среде EB).

UPDATE:

Я решил взять это для пробного запуска, и мне удалось его запустить и запустить. Я обнаружил несколько вещей, хотя. Приведенный выше код добавляет внутренний IP-адрес каждого экземпляра к ALLOWED_HOSTS. Это сделано исключительно для проверки работоспособности, чтобы консоль AWS могла пропинговать экземпляры внутри системы и получать ответ 200OK. Я оставляю вышеупомянутое решение, поскольку оно все еще полезно для этой цели. Это не решит вашу конкретную ошибку, хотя. Для обслуживания вам просто нужно добавить свой адрес электронной почты, вот и все. Вы можете найти его в консоли AWS (выделено красным ниже) или в cli, набрав eb status и проверив свойство CNAME.

enter image description here

CONFIG:

Вот мои основные конфигурационные файлы, которые я вручную создал в своем источнике:

.ebextensions / django.config


option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: mysite/wsgi.py
  aws:elasticbeanstalk:application:environment:
    DJANGO_SETTINGS_MODULE: mysite.settings_production

.ebextensions / дб-migrate.config


container_commands:
  01_migrate:
    command: "django-admin.py migrate"
    leader_only: true
option_settings:
  aws:elasticbeanstalk:application:environment:
    DJANGO_SETTINGS_MODULE: mysite.settings_production
...