Docker nginx can';t连接到单独容器中运行的上游gunicorn

Docker nginx can';t连接到单独容器中运行的上游gunicorn,nginx,docker,docker-compose,gunicorn,Nginx,Docker,Docker Compose,Gunicorn,我尝试了各种选项,例如,expose,bridge,docker compose的networks选项,但无法使其与在单独容器中运行的上游gunicorn的nginx连接一起工作,我收到了来自nginx的502坏网关错误。我不确定我到底错过了什么。下面是我的docker compose文件: version: "3" services: web: build: . container_name: web command: bash -c "/start_web.sh

我尝试了各种选项,例如,
expose
bridge
docker compose的
networks
选项,但无法使其与在单独容器中运行的上游gunicorn的nginx连接一起工作,我收到了来自nginx的
502坏网关
错误。我不确定我到底错过了什么。下面是我的
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;
    }
}
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'
Gunicorn配置:

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;
    }
}
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文件:

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;
    }
}
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'
web.ini

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

[watcher:nginx]
cmd = /usr/sbin/nginx
stop_signal = QUIT
[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上以及存储库中找到,以便您轻松测试。

Gunicon配置:

bind = '127.0.0.1:8000'
这将绑定到
loopback
接口(仅限本地主机),将其更改为
0.0.0
以绑定到容器中的每个可用接口。这将使它可以从nginx访问

Nginx配置:

upstream worker {
    server 127.0.0.1:8000;
}
您需要将worker容器的
环回
ip更改为
DNSname/ip
。我建议创建一个用户定义的网络,然后将所有相关的容器放在该网络中,并通过DNS名称调用它们。您在默认网桥网络中没有内部DNS,因此以下nginx配置将不起作用

upstream worker {
    server worker:8000;
}

nginx位于哪里?在单独的容器中还是在web容器中?@FarhadFarahi
nginx
web
container
gunicorn
worker
容器中。您可以访问整个代码,非常感谢,我尝试了
服务器工作者:8000,但从未更改gunicorn中的绑定地址。没问题,请注意,默认网络中不会有内部dns。