繁体   English   中英

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

[英]docker nginx proxy nginx connect() failed (111: Connection refused) while connecting to upstream

我正在尝试运行一个 nginx 容器作为我所有网站和 web 服务的主要入口点。 我设法将portainer作为容器运行,并且能够从 inte.net 访问它。 现在我正在尝试访问由另一个 nginx 容器托管的 static 网站,但我没有这样做 - 当我 go 到 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/;
        }
    }
}

以下是我启动主 nginx 容器的方式:

docker run -p 80:80 --name nginx -v /var/nginx/conf:/etc/nginx:ro --net=internal-net -d nginx

这是我的 static 网站的 nginx 配置文件:

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-compose 文件如何创建和启动该容器:

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

我正在使用internal.net .network 将所有应用程序保持在同一个网络中,而不是弃用--link docker run的选项

当我 go 到http://my.server.ip.address/helicon 时,我得到 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"

螺旋容器确实有一个 IP 地址 172.18.0.2。

我错过了什么? 也许我的做法应该与using.networks完全不同?

亲切的问候,

丹尼尔

解决了 我为此工作了几个小时,认为这是 nginx 配置问题。 我无休止地修改了 nginx.conf 但无法修复它。 我收到 502 Bad Gateway 错误描述是:

failed (111: Connection refused) while connecting to upstream

我找错地方了。 事实证明,我的 index.js 文件中的 http 服务器正在侦听 url 'localhost'。

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

这在您的开发机器上运行良好,但在容器内运行时,它必须命名为容器本身的 url。 我的容器是联网的,在我的情况下,容器被命名为“后端”

我将 url 从“本地主机”更改为“后端”,一切正常。

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

对于在这里看到此页面的任何人,我对您对 docker 网络的理解做出了一点贡献。 我想用一个示例场景来说明。 我们正在使用 docker-compose 运行几个容器,如下所示:

  1. Docker 容器客户端
  2. Docker容器nginx反向代理
  3. Docker容器服务1
  4. Docker 容器 service2 等...

为确保正确设置,请确保以下几点:

  1. 所有容器都在同一个网络上!
  • 第一次运行:“docker network ls”以查找堆栈的网络名称
  • 其次运行:“docker network inspect [your_stack_network_name]”
  1. 请注意,您在 docker-compose 中公开的端口与 nginx 反向代理无关! 这意味着您在 docker-compose 文件中公开的任何端口都可以在您的实际主机上使用,即您的笔记本电脑或 PC 通过浏览器,但出于代理目的,您必须将 nginx 指向服务的实际端口。

演练:假设 service1 在端口 3000 上的容器 1 内运行,您在 docker-compose 文件中映射端口 8080,如下所示:“8080:3000”,使用本地计算机上的此配置,您可以通过端口上的浏览器访问容器8080 (localhost:8080) 但是对于 nginx 反向代理容器,尝试代理到 service1 时,端口 8080 不相关! dockerized nginx 反向代理将使用 docker DNS 将 service1 映射到 docker 网络中的 ip,并完全独立于本地主机查看它。 对于docker网络中的nginx反向代理,service1只监听3000端口!!! 所以一定要把nginx指向正确的端口!

我遇到了同样的错误。 在 docker-compose.yml 中,我的服务端口被映射到不同的端口(例如 1234:8080),并且我在 nginx.conf 中使用了映射的端口号(1234)。

但是,在 docker 网络内部,容器不使用它们映射的端口号。 为了解决这个问题,我把proxy_pass语句改成使用正确的端口号(8080)。

为了明确工作配置是这样的:(检查nginx.conf中使用的端口号!)

docker-compose.yml

version: '3.8'

services:

...

  web1:
    ports:
      - 1234:8080
    networks:
      - net1
    
...

  proxy:
    image: nginx:latest
    networks:
      - net1

...

  networks:
    net1:
      driver: bridge

配置文件

... 

location /api
    ...
    proxy_pass http://web1:8080/;

我必须感谢 user8458126 为我指明了正确的方向。

对我来说,我覆盖了我的 default.conf nginx 文件,并在我的 docker 文件中输入了错误的目的地,告诉 nginx 不要监听正确的端口,而是默认端口 80。

长话短说,确保你覆盖到正确的路径。

我有什么: COPY./default.conf./etc/nginx/default.conf

正确: COPY./default.conf./etc/nginx/conf.d/default.conf

希望这可以节省某人几个小时的绞尽脑汁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM