Docker-compose: nginx ne fonctionne pas avec django et gunicorn

J’ai essayé de mettre en place un environnement dans docker-compose où il y a plusieurs conteneurs:

  • Django
  • Nginx
  • Postgres
  • DbData
  • Espace de rangement

J’ai utilisé la configuration suivante:

app: restart: always build: src expose: - "8000" links: - postgres:postgres volumes_from: - storage_files_1 env_file: .env command: gunicorn barbell.wsgi:application \ -b 0.0.0.0:8000 -w 4 nginx: restart: always build: nginx ports: - "80:80" - "443:443" volumes_from: - storage_files_1 links: - app:app postgres: restart: always image: postgres:latest volumes_from: - storage_data_1 ports: - "5432:5432" 

Mon fichier de configuration compatible avec les sites nginx ressemblait à ceci:

 server { listen 80; server_name localhost; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; location /static { alias /static/; autoindex on; } location / { proxy_pass http://app:8000; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"'; } } 

Et cela ne fonctionne pas – nginx renvoie toujours 502, mais sert parfaitement les fichiers statiques. J’ai aussi essayé la même configuration avec uwsgi, pas de chance. Cependant , lorsque je combine le Django avec nginx et que je sers tout du même conteneur, tout fonctionne (encore une fois sur uwsgi et gunicorn).

Une idée de ce qui me manque?

Mettre à jour

Voici les journaux nginx:

 *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.42.1, server: 0.0.0.0, request: "GET / HTTP/1.1", upstream: "http://172.17.1.75:8000/", host: "localhost" 

Il s’est avéré que Gunicorn était le coupable. Mettre sa configuration dans un fichier a résolu le problème.

gunicorn_config.py a mis dans le même dossier que manage.py:

 bind = "0.0.0.0:8000" loglevel = "INFO" workers = "4" reload = True errorlog = "/var/log/gunicorn/error.log" accesslog = "/var/log/gunicorn/access.log" 

Et quelques changements dans docker-compose.yml:

 app: restart: always build: src expose: - "8000" links: - postgres:postgres volumes_from: - storage_files_1 env_file: .env command: gunicorn --config=gunicorn_config.py barbell.wsgi:application 

Maintenant, ça marche comme il se doit.

Donc, je n’ai pas vu d’autres commentaires de votre part concernant les journaux d’erreurs et ce qui peut ou peut ne pas se produire pour vous; Cependant, j’ai simplifié votre exemple avec une démonstration de Docker+Django+NGINX fonctionne:

Voir: docker-django-test

NB: Ceci est en cours d’exécution sur certaines de mes infrastructures qui utilisent autodock. Si vous voulez répliquer cela, vous aurez besoin de cet extrait de docker-compose.yml :

 autodock: image: prologic/autodock ports: - "1338:1338/udp" - "1338:1338/tcp" volumes: - /var/run/docker.sock:/var/run/docker.sock autodockhipache: image: prologic/autodock-hipache links: - autodock - hipache:redis hipache: image: hipache ports: - 80:80 - 443:443 

Voir: Un mini-PaaS basé sur Docker