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