He estado configurando un docker-compose simple para una aplicación Django, en la que tengo 3 contenedores: la aplicación Django, un contenedor Postgres y NGINX. Configuré con éxito tanto Django como Postgres y probé la conexión directamente a sus contenedores, por lo que ahora lo único que quedaba era configurar NGINX en el archivo docker-compose. Usé el siguiente archivo NGINX default.conf
, de otro repositorio de plantillas:
upstream django { server app:8000; } server { listen 80; server_name localhost; location / { try_files $uri @proxy_to_app; } location @proxy_to_app { proxy_pass http://django; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } location /static/ { autoindex on; alias /static/; } location /media/ { autoindex on; alias /media/; } }
Y este fue mi archivo docker-compose:
version: "2" services: nginx: image: nginx:latest container_name: NGINX ports: - "80:80" - "443:443" volumes: - ./test:/djangoapp/test - ./config/nginx:/etc/nginx/conf.d - ./test/static:/static depends_on: - app app: build: . container_name: DJANGO command: bash -c "./wait-for-it.sh db:5432 && python manage.py makemigrations && python manage.py migrate && gunicorn test.wsgi -b 0.0.0.0:8000" depends_on: - db volumes: - ./djangoapp/test:/djangoapp/test - ./test/static:/static expose: - "8000" env_file: - ./config/djangoapp.env db: image: postgres:latest container_name: POSTGRES env_file: - ./config/database.env
Pero por alguna razón, no pude conectarme en la aplicación Django a través de localhost:80
(el navegador siempre me arrojaba un error 502 y el contenedor no registraba nada cuando lo intentaba). Después de mucho solucionar problemas, descubrí que la línea infractora era proxy_set_header Host $host;
, y comentarlo hizo que me conectara con éxito a la aplicación Django a través de localhost. Entonces, el problema era que mi configuración de NGINX tenía que usar la variable proxy_host
en su lugar.
El problema es que no tengo idea de por qué sucedió eso en primer lugar, porque mirando esta otra pregunta ( Nginx: cuándo usar proxy_set_header Host $host vs $proxy_host ), se suponía que debía usar $host
para proxy desde mi aplicación Django , y otros ejemplos de configuración de NGINX también configuran el host de esa manera.
Es posible que me esté perdiendo algo, ya que NGINX es un poco confuso para mí, pero no entiendo por qué no pude conectarme y NGINX no estaba registrando nada antes de comentar esa línea.