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

标签 nginx docker docker-compose gunicorn

我尝试了各种选择,例如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/

相关文章:

Nginx map 不使用我的正则表达式的参数

caching - 通过自定义响应 header 绕过 Nginx 缓存

docker - curl localhost 从一个 docker 容器连接到另一个 docker 容器

mysql - 本地主机连接 MySQL Docker 困惑

php - 如何使用 php-fpm 和 php-cli 运行 docker-compose?

django - Nginx 路由 Django Web App 链接到错误的路径

javascript - 如何正确部署 Angular 应用程序(基于ngBoilerplate并使用nginx)?

bash - 在 Docker 容器启动时启动 bash 脚本不起作用

docker - 将 docker-compose 网络内的主机重定向到 docker 外的本地主机

docker - 如何使用 Docker 将变量作为属性传递给 Wildfly 中的 xml 配置文件