He probado varias opciones, por ejemplo, expose , bridge , opciones de networks de docker-compose pero no puedo hacer que funcione con la conexión nginx a gunicorn ascendente ejecutándose en un contenedor separado, recibo el error 502 Bad Gateway de nginx. No estoy seguro de lo que me estoy perdiendo exactamente. A continuación se muestra mi archivo docker-compose :
version: "3" services: web: build: . container_name: web command: bash -c "/start_web.sh" restart: always depends_on: - worker ports: - "80:80" - "443:443" worker: build: . container_name: worker command: bash -c "/start_worker.sh" restart: always ports: - "8000:8000"conferencia de nginx:
upstream worker { server 127.0.0.1:8000; } server { listen 80 default_server; location / { proxy_http_version 1.1; proxy_buffering off; proxy_set_header Host $http_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-Proto $scheme; proxy_set_header X-Url-Scheme $scheme; proxy_redirect off; # Mitigate httpoxy attack proxy_set_header Proxy ""; proxy_pass http://worker; } }Configuración de gunicornio:
import multiprocessing import os bind = '127.0.0.1:8000' default_workers = multiprocessing.cpu_count() * 2 + 1 workers = os.getenv('GUNICORN_WORKERS', os.getenv('WEB_CONCURRENCY', default_workers)) worker_class = 'tornado' # This is to fix issues with compressor package: broken offline manifest for # custom domain. It randomly breaks, I think because of global variable inside. preload_app = True timeout = 200 graceful_timeout = 60 max_requests = 250 max_requests_jitter = max_requests accesslog = '/tmp/gunicorn_access.log' errorlog = '/tmp/gunicorn_error.log'Archivos ini de circo:
web.ini
[watcher:nginx] cmd = /usr/sbin/nginx stop_signal = QUITtrabajador.ini
[watcher:gunicorn] cmd = /usr/local/bin/gunicorn test:app -c /etc/gunicorn/app.py working_dir = /opt/app copy_env = True uid = www-dataEl código completo está disponible en github y en el repositorio docker_test para que puedas probarlo fácilmente.
Configuración de Gunicon:
bind = '127.0.0.1:8000' Esto se vinculará a la interfaz de loopback (solo localhost), cámbielo a 0.0.0.0 para vincularse a todas las interfaces disponibles en el contenedor. Esto lo hará accesible desde nginx.
Configuración de Nginx:
upstream worker { server 127.0.0.1:8000; } Debe cambiar la IP de loopback a DNSname/IP del contenedor del trabajador. Recomiendo crear una red definida por el usuario. Luego, coloque todos los contenedores relacionados en esa red y llámelos por nombres DNS. No tendrá DNS interno en la red de puente predeterminada, por lo que seguir la configuración de nginx no funcionará.
upstream worker { server worker:8000; }