![](/img/trans.png)
[英]nginx & nodejs: connect() failed (111: Connection refused) while connecting to upstream
[英]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 运行几个容器,如下所示:
为确保正确设置,请确保以下几点:
演练:假设 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.