连接被拒绝:当 uwsgi 和 nginx 在不同的容器中时

Connection refused: when uwsgi and nginx in different containers

我正在尝试设置两个 docker 容器(是的,没有 docker-compose 是分开的):一个使用 nginx,另一个使用带有基本烧瓶应用程序的 uwsgi。
我在 docker
内的同一网络中 运行 个容器 我的网站 added/linked 的 nginx 配置为启用网站(其他一切都是默认设置):

server {
    listen 80;
    server_name 127.0.0.1;

    location / {
        include uwsgi_params;
        uwsgi_pass 0.0.0.0:8080;
    }
}

我的uwsgi.ini

[uwsgi]
module = app:app

master = true
processes = 2

socket = 0.0.0.0:8080

docker 中的 uwsgi 入口点看起来像

.local/bin/uwsgi --ini uwsgi.ini

容器 运行 自己没问题 - uwsgi 在 8080 上收到请求,nginx 收到预期的请求。当我尝试访问 127.0.0.1 时,我如何获得 502 状态代码和 nginx 日志错误:

1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.4.1, server: 127.0.0.1, request: "GET / HTTP/1.1", upstream: "uwsgi://0.0.0.0:8080", host: "127.0.0.1"

通过谷歌搜索,我找到了使用一个容器和 some_socket.sock 作为文件或使用 docker 组合的解决方案。显然是权限问题,但我不知道如何解决或诊断。

我使用这些命令启动容器:

docker run --network app_network --name nginx --rm -p 80:80 my_nginx
docker run --network app_network --name flaskapp --rm -p 8080:8080 my_uwsgi

编辑

您可以在 uwsgi_pass 指令中简单地使用 docker 容器的主机名,因为两个 docker 容器都在同一子网上。

location / {
        include uwsgi_params;
        uwsgi_pass flaskapp:8080;
    }

0.0.0.0 不是服务器的 IP 地址,它实际上告诉服务器托管在设备分配的每个 IP 上。

要从 nginx 连接到它,您需要使用容器的 IP 地址。

你可以通过以下命令找到容器运行 uWsgi的IP地址:

docker inspect CONTAINER_ID

其中 CONTAINER_ID 是您在其中启动 uwsgi 的容器的 ID。

从这里您可以按如下方式更新 nginx 配置:

uwsgi_pass IP_ADDRESS:8080;

其中 IP_ADDRESS 是您从上面的命令中找到的

您也可以在启动容器时使用以下选项设置容器的ip地址

--ip <ip>

但是,请注意确保您设置的 IP 地址与分配的标准 IP 地址位于同一子网中。