Configuração básica do Nginx com Django no EC2:

Configuração básica do Nginx com Django no EC2:

Quero configurar meu aplicativo Django dockerizado com nginx e executá-lo em uma instância EC2 e não consigo fazê-lo funcionar. Sou iniciante no nginx.

Meu erro quando faço isso docker-compose -f production.yml upé:

cliente enviou método inválido ao ler a linha de solicitação do cliente, cliente: 80.153.184.19, servidor: ec2-XXXXX.eu-central-2.compute.amazonaws.com, solicitação: "�U�F'��Io�q�+! �P��

E eu fico tipo o quê? Não existe nenhuma configuração básica para que isso funcione sem problemas?

Minha configuração do 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;
    }

}

Meu 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

meu dockerfile para nginx:

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

Estou extremamente grato por qualquer ajuda... Estou tão preso... Agradecemos antecipadamente!

Responder1

Estou curioso sobre esta seção:

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

Vejo exceções como esta no log do meu aplicativo:

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

Quando faço um proxy reverso vejo que o IP está dentro da AWS. Mas não consigo identificar o recurso. Vejo que você está usando um nome de servidor canônico e reescrevendo o IP nele, mas isso não anula o propósito de ALLOWED_HOSTS?


Ok, descobri por que sua solução me deixou desconfortável. Você está pegando qualquer endereço IP e mapeando-o. O problema típico é capturar o endereço IP do ELB que muda com o tempo. Portanto, é muito mais seguro colocar isso em um bloco de localização. No exemplo abaixo, tenho 'aws.elb.com' em minha lista ALLOWED_HOSTS e na guia ELP Health Check especifiquei meu destino de ping como ELB-health-check. Esta deve ser uma abordagem mais segura.

    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;
     }

informação relacionada