Базовая конфигурация Nginx с django на EC2:

Базовая конфигурация Nginx с django на EC2:

Я хочу настроить свое докеризированное приложение django с nginx и запустить его на экземпляре EC2, но не могу заставить его работать. Я новичок в nginx.

Моя ошибка, когда я docker-compose -f production.yml upэто делаю:

клиент отправил недопустимый метод при чтении строки запроса клиента, клиент: 80.153.184.19, сервер: ec2-XXXXX.eu-central-2.compute.amazonaws.com, запрос: "�U�F'��Io�q�+!�P��

И я такой: "Что за фигня? Неужели нет какой-то базовой конфигурации, чтобы всё работало гладко?"

Мой конфиг nginx myconf:

server {

    set $my_host $host;
    if ($host ~ "\d+\.\d+\.\d+\.\d+") {
        set $my_host "ec2-XXXXX.eu-central-2.compute.amazonaws.com";
    }

    listen 80;
    server_name ec2-XXXXX.eu-central-2.compute.amazonaws.com;
    charset utf-8;
    error_log /dev/stdout info;
    access_log /dev/stdout;

    location / {
        proxy_pass http://django:5000;
        proxy_set_header Host $my_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

Мой docker-compose:

version: '3'

#volumes:
#  production_caddy: {}

services:
  django:
    build:
      context: .
      dockerfile: ./compose/production/django/Dockerfile
    image: heatbeat_website_production_django
    env_file:
      - ./.envs/.production/.django
      - ./.envs/.production/.postgres
    command: /start

  nginx:
    build:
      context: .
      dockerfile: ./compose/production/nginx/Dockerfile
    ports:
      - "0.0.0.0:8080:80"
    depends_on:
      - django

  redis:
    image: redis:5.0

мой dockerfile для nginx:

FROM tutum/nginx
RUN rm /etc/nginx/sites-enabled/default
COPY ./compose/production/nginx/myconf.conf /etc/nginx/sites-enabled/default

Я буду очень благодарен за любую помощь... Я совсем застрял... Заранее спасибо!

решение1

Меня интересует этот раздел:

    set $my_host $host;
    if ($host ~ "\d+\.\d+\.\d+\.\d+") {
        set $my_host "ec2-XXXXX.eu-central-2.compute.amazonaws.com";
    }

В журнале моего приложения я вижу такие исключения:

django.core.exceptions.DisallowedHost: Invalid HTTP_HOST header: '54.148.178.171'...

Когда я делаю обратный прокси, я вижу, что IP находится внутри AWS. Но я не могу идентифицировать ресурс. Я вижу, что вы используете каноническое имя сервера и перезаписываете IP на него, но разве это не противоречит цели ALLOWED_HOSTS?


Хорошо, я понял, почему ваше решение меня смутило. Вы берете любой IP-адрес и сопоставляете его. Типичная проблема — захватить IP-адрес ELB, который меняется со временем. Поэтому гораздо безопаснее поместить его в блок местоположения. В примере ниже у меня есть «aws.elb.com» в моем списке ALLOWED_HOSTS, а на вкладке ELP Health Check я указал цель ping как ELB-health-check. Это должен быть более безопасный подход.

    location /ELB-health-check {
        set $my_host $host;
        if ($host ~ "\d+\.\d+\.\d+\.\d+") {
          set $my_host "aws.elb.com";
        }
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # set $my_host "aws.elb.com";
        proxy_set_header Host $my_host;
        # now send the request to the app
        proxy_pass http://app_server;
     }

Связанный контент