Docker + NGINX + SSL终端

时间:2018-04-07 19:34:41

标签: docker nginx

我试图在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;
      }
  }
}

4 个答案:

答案 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

您应该查看以下链接

https://docs.docker.com/compose/overview/

答案 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!