django - 为什么 nginx 在对链接的 docker 容器执行 `uwsgi_pass` 时返回 502?

标签 django nginx docker uwsgi docker-compose

我正在使用 Docker Compose 来编排由 Django webapp 和 nginx 反向代理组成的多容器应用程序。

我正在盯着一个简单的测试用例,但我已经遇到了障碍。应用程序应将所有请求传递给 /通过 uwsgi_pass 转到 Django 应用程序通过网络套接字 ( frontend:8000 )。

但是,在使用 docker-compose up 启动应用程序后并且没有看到任何错误消息,对 / 的任何请求在控制台中产生以下错误消息:gateway_1 | 2016/01/11 15:45:12 [error] 8#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: localhost, request: "GET / HTTP/1.1", upstream: "uwsgi://172.17.0.2:8000", host: "192.168.99.100:8000"
我的问题如下:可能是什么问题?更换 uwsgi_pass frontend;locationcontent_by_lua_file path/to/file.lua; 阻止行为符合预期,所以我怀疑 uWSGI 通过容器链接存在问题,但我不知道下一步该往哪里看。

以下是相关文件:

Docker Compose:30,000 英尺的 View
docker-compose.yml文件如下:

postgres:
    image: mystuff/app.testdb:latest
    expose:
        - "5432"
frontend:
    image: mystuff/app.frontend:latest
    expose:
        - "8000"
    environment:
        APP_DBCONN: "user=xxx dbname=xxx port=5432 host=postgres sslmode=require password=xxx"
        APP_ENV: "test"
gateway:
    image: mystuff/app.gateway:latest
    links:
        - frontend
    expose:
        - "8000"
    ports:
        - "8000:8000"

NGINX:反向代理

下面是我的 nginx.conf文件:
worker_processes 1;
user me;

events {
    use epoll;
    worker_connections 1024;
}

http {
    access_log /dev/stdout;

    upstream frontend {
        server frontend:8000;  # assumption:  `frontend` is a known hostname thanks to docker-compose
    }

    server {
        listen 8000;
        server_name localhost;

        location / {
            uwsgi_pass frontend;
            include uwsgi_params;
        }
    }
}

最后,这是我的 uwsgi_params文件:
uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

uWSGI & Django:应用服务器
uwsgi.ini :
[uwsgi]
chdir = /home/app
wsgi-file = ./NFC/wsgi.py
socket = 127.0.0.1:8000
master = true
processes = 1
threads = 2
uid = me

编辑

1. 日志输出 http = 127.0.0.1:8000uwsgi.ini
$ cat /tmp/uwsgi.log 
*** Starting uWSGI 2.0.12 (64bit) on [Wed Jan 13 12:09:44 2016] ***
compiled with version: 4.9.2 on 03 January 2016 21:09:04
os: Linux-4.1.13-boot2docker #1 SMP Fri Nov 20 19:05:50 UTC 2015
nodename: default
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /home/srg
detected binary path: /home/srg/.pyenv/versions/2.7.11/bin/uwsgi
chdir() to /home/srg
your processes number limit is 1048576
your memory page size is 4096 bytes
detected max file descriptor number: 1048576
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on 127.0.0.1:8000 fd 7
uwsgi socket 0 bound to TCP address 127.0.0.1:38922 (port auto-assigned) fd 6
Python version: 2.7.11 (default, Jan  3 2016, 21:07:12)  [GCC 4.9.2]
Python main interpreter initialized at 0x1d37300
python threads support enabled
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 166144 bytes (162 KB) for 2 cores
*** Operational MODE: threaded ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x1d37300 pid: 173 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 173)
spawned uWSGI worker 1 (pid: 210, cores: 2)
spawned uWSGI http 1 (pid: 211)
SIGINT/SIGQUIT received...killing workers...
gateway "uWSGI http 1" has been buried (pid: 211)
worker 1 buried after 1 seconds
goodbye to uWSGI.

最佳答案

使用该 uWSGI 配置,尤其是:

socket = 127.0.0.1:8000

uWSGI 将只允许本地连接(这意味着来自同一个 docker,而不是来自主机或其他 docker)。要允许来自 docker 外部的连接,您必须将其更改为:
socket = :8000

关于django - 为什么 nginx 在对链接的 docker 容器执行 `uwsgi_pass` 时返回 502?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34725954/

相关文章:

django - 为什么 Django 开发服务器不重新加载?

django - 如何从Django图像字段转换为PIL图像并返回?

django - 在 EC2 上使用 nginx 设置 django

linux - kubernetes 如何在 docker 容器内工作

python - 与python django中的虚拟环境混淆

python - 在模型 django 中的每个字段上实现隐私的最佳方式

php - 自定义 PHP SessionHandler 类写入问题

nginx - 用于通配符 url 映射的 Kubernetes Ingress Controller

python - Docker:如何获取 virtualenv 并安装 requirements.txt?

django - ValueError : Missing staticfiles manifest entry on Heroku with Docker, django-pipeline, whitenoise