502 错误网关 - nginx、uwsgi+django 在单独的 docker 容器中

502 错误网关 - nginx、uwsgi+django 在单独的 docker 容器中

我在确定为什么 nginx 和 uwsgi 无法为我的 django 应用提供服务时遇到了一些困难。以下是 nginx 日志中的问题。

    nginx-01: 2015/12/06 07:47:50 [error] 10#0: *1 connect() failed (111: Connection refused) while connecting to upstream, 
client: xxx.xxx.xxx.xxx, server: , request: "GET / HTTP/1.1", upstream: "uwsgi://0.0.0.0:8001", host: "54.252.197.191"

因此 uwsgi 和 django 位于一个容器中,并具有以下文件设置。

[uwsgi]
http-socket = :8001
chdir = %dsrc/myproject/
env = DJANGO_SETTINGS_MODULE=myproject.settings
module = myproject.wsgi:application
master = true
processes = 4

我的 docker 文件启动了 uwsgi,并且我向主机公开了端口 8001

CMD ["uwsgi", "uwsgi.ini"]

我的第二个容器用于 nginx,具有以下 nginx 虚拟主机设置。

upstream uwsgi_django {
    server 0.0.0.0:8001;
}

server {
    listen 80;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location / {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
        uwsgi_pass uwsgi_django;
        include /etc/nginx/uwsgi_params;
    }

    location = /favicon.ico {
      log_not_found off;
    }
}

这是来自 docker ps 的容器。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES                                       
16f181bafb61        ccbf828a3ab2        "nginx -g 'daemon off"   7 minutes ago       Up 7 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nginx-container                             
33d4d5d17ca3        65ad56e6756c        "uwsgi uwsgi.ini"        13 minutes ago      Up 13 minutes       0.0.0.0:8001->8001/tcp                     django-container                            
688f4b0f9e29        postgres            "/docker-entrypoint.s"   7 hours ago         Up About an hour    0.0.0.0:5432->5432/tcp                     postgres-container   

如果我从主机 curl 0.0.0.0:8001,我会返回 django 项目的欢迎页面。但是,如果我尝试从浏览器查看它,我会收到 502 bad gateway 错误(在我看来,这似乎是我正确设置了 uwsgi,但 nginx 与 uwsgi 通信之间存在一些问题。

答案1

这是您的问题:

upstream uwsgi_django {
    server 0.0.0.0:8001;
}

这仅当进程位于同一主机、虚拟机或容器中时才“有效”,因为它会尝试连接到同一台机器。当它们位于不同的容器中时,它不起作用。

您需要更改 nginx 配置,以便它使用 uwsgi 容器的内部 IP 地址。具体操作取决于您创建容器的方式,而您并未指定。请查看相关文档。

相关内容