docker nginx代理nginx connect()失败(111 : Connection refused) while connecting to upstream

标签 docker nginx proxypass

我正在尝试将nginx容器作为我所有网站和Web服务的主要入口点。我设法将portainer作为容器运行,并且可以从互联网上访问它。现在,我正在尝试访问由另一个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/;
        }
    }
}

这是我启动我的主要nginx容器的方法:
docker run -p 80:80 --name nginx -v /var/nginx/conf:/etc/nginx:ro --net=internal-net -d nginx

这是我的静态网站的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网络将所有应用程序保持在同一网络中,而不是使用--link不推荐使用的docker run选项

当我去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。

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

亲切的问候,

丹尼尔

最佳答案

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

failed (111: Connection refused) while connecting to upstream

我看错地方了。事实证明,我的index.js文件中的http服务器正在监听URL“本地主机”。
httpServer.listen(PORT, 'localhost', async err => {

这在您的开发机器上可以正常工作,但是在容器内运行时,必须将其命名为容器本身的url。我的容器已联网,在我的情况下,该容器被命名为“后端”

我将网址从“本地主机”更改为“后端”,一切正常。
httpServer.listen(PORT, 'backend', async err => {

关于docker nginx代理nginx connect()失败(111 : Connection refused) while connecting to upstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51009692/

相关文章:

docker - Kubernetes 阻止容器自动重启

mysql - 如何使用 sql-alchemy 从 Flask 应用程序连接到 mysql docker 容器

docker - docker路由没有iptables

wordpress - 使用 nginx 为 flask 应用程序启用 wordpress

docker - 无法让 dep 和 dockerize 在 docker-compose 中一起工作(但它们是分开工作的)。为什么?

nginx - 从在非标准端口上运行的 nginx 中删除端口号

windows - nginx Windows : setting up sites-available configs

apache2 - ProxyPass 将 304 状态修改为 200 并添加 content-type

api - Docker-compose:Nginx proxy_pass 我的 api

apache - 在转发代理后面设置 apache