
Quiero configurar mi aplicación Django acoplada con nginx y ejecutarla en una instancia EC2 y no puedo hacer que funcione. Soy un principiante con nginx.
Mi error cuando lo hago docker-compose -f production.yml up
es:
El cliente envió un método no válido mientras leía la línea de solicitud del cliente, cliente: 80.153.184.19, servidor: ec2-XXXXX.eu-central-2.compute.amazonaws.com, solicitud: "�U�F'��Io�q�+! �P��
Y yo digo ¿qué? ¿No existe ninguna configuración básica para que esto funcione sin problemas?
Mi configuración de 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;
}
}
Mi ventana acoplable compone:
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
mi archivo acoplable para nginx:
FROM tutum/nginx
RUN rm /etc/nginx/sites-enabled/default
COPY ./compose/production/nginx/myconf.conf /etc/nginx/sites-enabled/default
Estoy muy agradecido por cualquier ayuda... Estoy tan estancado... ¡Gracias de antemano!
Respuesta1
Tengo curiosidad por esta sección:
set $my_host $host;
if ($host ~ "\d+\.\d+\.\d+\.\d+") {
set $my_host "ec2-XXXXX.eu-central-2.compute.amazonaws.com";
}
Veo excepciones como esta en el registro de mi aplicación:
django.core.exceptions.DisallowedHost: Invalid HTTP_HOST header: '54.148.178.171'...
Cuando hago un proxy inverso veo que la IP está dentro de AWS. Pero no puedo identificar el recurso. Veo que estás usando un nombre de servidor canónico y reescribiendo la IP en él, pero ¿eso no anula el propósito de ALLOWED_HOSTS?
Bien, descubrí por qué tu solución me hizo sentir incómodo. Estás tomando cualquier dirección IP y mapeándola. El problema típico es capturar la dirección IP del ELB que cambia con el tiempo. Entonces es mucho más seguro poner eso en un bloque de ubicación. En el siguiente ejemplo, tengo 'aws.elb.com' en mi lista ALLOWED_HOSTS y en la pestaña ELP Health Check especifiqué mi objetivo de ping como ELB-health-check. Este debería ser un enfoque más seguro.
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;
}