docker nginx proxy nginx connect()在连接到上游时失败(111:连接被拒绝)

docker nginx proxy nginx connect()在连接到上游时失败(111:连接被拒绝),docker,nginx,proxypass,Docker,Nginx,Proxypass,我试图运行一个nginx容器作为我所有网站和web服务的主要入口点。我设法将一个容器作为一个容器运行,并且我能够从互联网上访问它。现在我正试图访问由另一个nginx容器托管的静态网站,但我失败了——当我转到URL时,我得到了 502 Bad Gateway 我尝试将上游部分添加到主nginx的配置中,但没有任何更改(每次配置更改后,我都会在容器中重新加载主nginx服务) 另一方面,如果可能的话,添加上游是我希望避免的事情,因为生成多个不同的应用程序需要为每个应用程序添加一个上游-这比我预期的

我试图运行一个nginx容器作为我所有网站和web服务的主要入口点。我设法将一个容器作为一个容器运行,并且我能够从互联网上访问它。现在我正试图访问由另一个nginx容器托管的静态网站,但我失败了——当我转到URL时,我得到了

502 Bad Gateway
我尝试将上游部分添加到主nginx的配置中,但没有任何更改(每次配置更改后,我都会在容器中重新加载主nginx服务)

另一方面,如果可能的话,添加上游是我希望避免的事情,因为生成多个不同的应用程序需要为每个应用程序添加一个上游-这比我预期的要多得多

这是我的主要nginx配置文件:

events {
    worker_connections 1024;
}
http {
    server {
        listen 80;

        location /portainer/ {
            proxy_pass http://portainer:9000/;
        }
        location /helicon/ {
            proxy_pass http://helicon:8001/;
        }
    }
}
events {
    worker_connections 1024;
}
http {
    server {
        listen  80;

    server_name helicon;
        root /var/www/html/helicon;

        error_log /var/log/nginx/localhost.error.log;
        access_log /var/log/nginx/localhost.access.log;
    }
}
以下是如何启动我的主nginx容器:

docker run -p 80:80 --name nginx -v /var/nginx/conf:/etc/nginx:ro --net=internal-net -d nginx
version: '3.5'
services:
    helicon:
        build: .
        image: helicon
        ports:
            - "127.0.0.1:8001:80"
        container_name: helicon
        networks:
            - internal-net
networks:
    internal-net:
        external: true
这是我的静态网站的nginx配置文件:

events {
    worker_connections 1024;
}
http {
    server {
        listen 80;

        location /portainer/ {
            proxy_pass http://portainer:9000/;
        }
        location /helicon/ {
            proxy_pass http://helicon:8001/;
        }
    }
}
events {
    worker_connections 1024;
}
http {
    server {
        listen  80;

    server_name helicon;
        root /var/www/html/helicon;

        error_log /var/log/nginx/localhost.error.log;
        access_log /var/log/nginx/localhost.access.log;
    }
}
以下是docker编写文件以创建和启动该容器的方式:

docker run -p 80:80 --name nginx -v /var/nginx/conf:/etc/nginx:ro --net=internal-net -d nginx
version: '3.5'
services:
    helicon:
        build: .
        image: helicon
        ports:
            - "127.0.0.1:8001:80"
        container_name: helicon
        networks:
            - internal-net
networks:
    internal-net:
        external: true
我正在使用
内部网络
网络将所有应用程序保持在同一网络中,而不是不推荐的
--link
选项来运行
docker

当我去的时候,我得到502。然后我用
docker logs nginx
检查日志,其中有一条信息

2018/06/24 11:15:28 [error] 848#848: *466 connect() failed (111: Connection refused) while connecting to upstream, client: Y.Y.Y.Y, server: , request: "GET /helicon/ HTTP/1.1", upstream: "http://172.18.0.2:8001/", host: "X.X.X.X"
helicon容器的IP地址确实是172.18.0.2

我错过了什么?也许我的方法应该与使用网络完全不同

亲切问候,


丹尼尔

已解决。我花了几个小时来研究这个问题,认为这是一个nginx配置问题。我无休止地修改nginx.conf,但无法修复它。我得到502坏网关,错误描述为:

failed (111: Connection refused) while connecting to upstream
我找错地方了。事实证明,我的index.js文件中的http服务器正在侦听url“localhost”

httpServer.listen(PORT, 'localhost', async err => {
这在您的开发机器上可以很好地工作,但是当在容器中运行时,它必须被命名为容器本身的url。我的容器是联网的,在我的例子中,容器名为“后端”

我将url从“localhost”更改为“backend”,一切正常

httpServer.listen(PORT, 'backend', async err => {

对于任何浏览本页面的人,这里是我对您理解docker网络的一点贡献。 我想用一个示例场景来说明。 我们正在使用docker compose运行多个contianers,如下所示:

  • Docker容器客户端
  • Docker容器nginx反向代理
  • Docker容器服务1
  • Docker集装箱服务2 等等
  • 要确保正确设置,请确保以下各项:

  • 所有容器都在同一网络上
    • 第一次运行:“docker network ls”查找堆栈的网络名称
    • 第二次运行:“docker network inspect[您的\u堆栈\u网络\u名称]”
  • 请注意,您在docker compose中公开的端口与nginx反向代理无关! 这意味着您在docker compose文件中公开的任何端口都可以通过浏览器在实际主机(即Laptop或pc)上使用,但出于代理目的,您必须将nginx指向服务的实际端口
  • 演练: 假设service1在端口3000上的容器1内运行,您在docker compose文件中映射了端口8080,如:“8080:3000”,在本地计算机上使用此配置,您可以通过端口8080(localhost:8080)上的浏览器访问容器,但对于nginx反向代理容器,当尝试代理到service1时,端口8080不相关!停靠的nginx反向代理将使用docker DNS将service1映射到docker网络中的ip,并完全独立于本地主机查看它。 对于docker网络内的nginx反向代理,service1仅侦听端口3000!!!
    因此,请确保将nginx指向正确的端口

    在这里运行相同的问题,请检查此解决方案。遗憾的是,这是我找到并尝试过的许多“解决方案”之一—正如您所看到的,我实际上使用的是您指出的解决方案,但没有任何帮助。也许我应该多做点什么?我在这上面浪费了几个小时,因为我根本不熟悉Node或Docker。。。谢谢!