我尝试了各种选择,例如expose
, bridge
, networks
docker-compose
的选项但无法让它与在单独容器中运行的上游 gunicorn 的 nginx 连接一起工作,我收到 502 Bad Gateway
来自 Nginx 的错误。我不确定我到底错过了什么。以下是我的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 配置:
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;
}
}
Gunicorn 配置:
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 上以及存储库 docker_test 上获得方便您测试它。
最佳答案
Gunicon 配置:
bind = '127.0.0.1:8000'
这将绑定(bind)到
loopback
接口(interface)(仅限本地主机),将其更改为 0.0.0.0
绑定(bind)到容器中的每个可用接口(interface)。这将使它可以从 nginx 访问。Nginx 配置:
upstream worker {
server 127.0.0.1:8000;
}
您需要更改
loopback
ip到DNSname/IP
worker 容器。我建议创建一个用户定义的网络,然后将所有相关的容器放在该网络中,并通过 DNS 名称调用它们。默认桥接网络中不会有内部 DNS,因此遵循 nginx 配置将不起作用。upstream worker {
server worker:8000;
}
关于nginx - Docker nginx 无法连接到在单独容器中运行的上游 gunicorn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42608715/