我试图在Docker容器中设置NGINX,以便它将为进入另一个容器(tcp443 - > tcp3001)的流量执行SSL终止.
但是我从NGINX获得502 Bad Gateway,NGINX日志中出现以下错误:
connect() failed (111: Connection refused) while connecting to upstream
Run Code Online (Sandbox Code Playgroud)
集装箱
以下容器正在运行:
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
Run Code Online (Sandbox Code Playgroud)
端口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
Run Code Online (Sandbox Code Playgroud)
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您有可达性的基本问题.当您在Nginx配置中有下方时
proxy_pass http://127.0.0.1:3001;
Run Code Online (Sandbox Code Playgroud)
您说在同一个nginx容器中,另一个服务正在端口运行3001.但该服务正在另一个容器中运行.
接下来看看你的docker ps输出
f7b13bf2bdcd ghost "docker-entrypoint..." 21 hours ago Up 21 hours 127.0.0.1:3001->2368/tcp zen_carson
Run Code Online (Sandbox Code Playgroud)
容器内的端口2368,而不是3001.现在是启动容器的部分,以便您知道它的地址
如果您是通过命令行启动docker容器,那么您将启动如下容器
docker run -d --name ghost ghost
Run Code Online (Sandbox Code Playgroud)
然后在您的nginx配置中使用
proxy_pass http://ghost:2368;
Run Code Online (Sandbox Code Playgroud)
更好的方法是实际通过docker-compose.所以你将创建docker-compose.yml文件
version: 3
services:
ghost
build: ghost
image: ghost
web:
build: web
image: web
ports:
- 443:443
Run Code Online (Sandbox Code Playgroud)
你应该看下面的链接
https://docs.docker.com/compose/overview/
如果 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 网络适配器中的任何内容,它将起作用。