我试图在Docker容器中设置NGINX,以便它将为进入另一个容器的流量执行SSL终止(tcp443 - > tcp3001)。
但是我从NGINX获得502 Bad Gateway,NGINX日志中出现以下错误:
connect() failed (111: Connection refused) while connecting to upstream
集装箱
以下容器正在运行:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b640f25af44 nginx "nginx -g 'daemon ..." 3 seconds ago Up 2 seconds 80/tcp, 0.0.0.0:443->443/tcp hopeful_swartz
f7b13bf2bdcd ghost "docker-entrypoint..." 21 hours ago Up 21 hours 127.0.0.1:3001->2368/tcp zen_carson
端口3001测试
我可以通过端口3001到达后端服务器(容器)。
root@linode-server:~# curl -IL http://127.0.0.1:3001
HTTP/1.1 302 Found
X-Powered-By: Express
Location: /private/
Vary: Accept, Accept-Encoding
Content-Type: text/plain; charset=utf-8
Content-Length: 31
Date: Sat, 07 Apr 2018 19:25:02 GMT
Connection: keep-alive
HTTP/1.1 200 OK
X-Powered-By: Express
Cache-Control: no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0
Content-Type: text/html; charset=utf-8
Content-Length: 2655
ETag: W/"a5f-wAxdmCnbgI8/PCwspg8GKWyhtRw"
Vary: Accept-Encoding
Date: Sat, 07 Apr 2018 19:25:02 GMT
Connection: keep-alive
NGINX配置
worker_processes 5;
events { worker_connections 1024; }
http {
server {
listen 443 ssl;
ssl_certificate /etc/nginx/packetflow.crt;
ssl_certificate_key /etc/nginx/packetflow.key;
location / {
proxy_pass http://127.0.0.1:3001;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host linode.packetflow.co.uk;
}
}
}
答案 0 :(得分:6)
您有可达性的基本问题。如果您的Nginx配置中有以下内容
proxy_pass http://127.0.0.1:3001;
您说在同一个nginx容器中,另一个服务正在端口3001
上运行。但该服务正在另一个容器中运行。
接下来查看您的docker ps
输出
f7b13bf2bdcd ghost "docker-entrypoint..." 21 hours ago Up 21 hours 127.0.0.1:3001->2368/tcp zen_carson
容器内的端口是2368
而不是3001
。现在是启动容器的部分,以便您知道其地址
如果您是通过命令行启动docker容器,那么您将启动如下容器
docker run -d --name ghost ghost
然后在你的nginx配置中你将使用
proxy_pass http://ghost:2368;
更好的方法是实际通过docker-compose
。因此,您将创建docker-compose.yml
文件
version: 3
services:
ghost
build: ghost
image: ghost
web:
build: web
image: web
ports:
- 443:443
您应该查看以下链接
答案 1 :(得分:2)
如果nginx配置在docker容器中,您如何使用127.0.0.1:3001(主机端口)代理到其他docker。实际上你对127.0.0.1:3001的绑定是主机。
您是否正在尝试从主机进行卷曲,而nginx配置在docker中。
要快速修复,请使用172.17.0.1:3001而不是127.0.0.1:3001。如果您没有更改docker网络适配器中的任何内容,它将起作用。
答案 2 :(得分:1)
最简单的解决方案是将nginx移动到基本机器(安装它并在守护程序中运行)。映像之间的负载平衡发生在主机上,只有应用程序在docker中运行。
其他解决方案可以是为节点图像创建主机名,以便从其他图像到达它。这样您就必须安装docker-compose或创建一个运行具有特定名称的docker镜像的脚本。
答案 3 :(得分:1)
您的NGINX配置中的这一行proxy_pass http://127.0.0.1:3001
错误,zen_carson
对您的Nginx容器本地主机无效!它们可以在不同的主机上运行!
如果您想从zen_carson
访问hopeful_swartz
容器,首先最简单的方法是使用linking between containers,并使用链接别名而不是localhost IP!