Docker nginx无法连接到在单独容器中运行的上游gunicorn

我已经尝试了各种选项,例如docker docker-compose exposebridgenetworks选项,但不能让它与上游gunicorn在单独的容器中运行的nginx连接一起工作,我收到来自nginx的502 Bad Gateway错误。 我不确定我缺less什么。 以下是我的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" 

nginx conf:

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

Gunicornconfiguration:

 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' 

马戏团ini文件:

web.ini

 [watcher:nginx] cmd = /usr/sbin/nginx stop_signal = QUIT 

worker.ini

 [watcher:gunicorn] cmd = /usr/local/bin/gunicorn test:app -c /etc/gunicorn/app.py working_dir = /opt/app copy_env = True uid = www-data 

整个代码在github上也可以在repository docker_test中使用,以方便testing。

Guniconconfiguration:

 bind = '127.0.0.1:8000' 

这将绑定到loopback接口(仅限本地主机),将其更改为0.0.0.0以绑定到容器中的每个可用接口。 这将使它从nginx可达。

Nginxconfiguration:

 upstream worker { server 127.0.0.1:8000; } 

您需要将loopback IP更改为工作者容器的DNSname/IP 。 我build议创build一个用户定义的networking,然后把所有相关的容器都放在那个networking中,并通过DNS名称来调用它们。 你不会有默认的网桥内部的DNS,所以下面的nginxconfiguration将无法正常工作。

 upstream worker { server worker:8000; }