docker nginx ssl proxy传递给另一个容器

时间:2018-02-17 14:32:39

标签: docker ssl nginx

我有一个docker-compose文件,现在运行两个容器:

version: '3'

services:
  nginx-certbot-container:
    build: nginx-certbot
    restart: always
    links:
      - ghost-container:ghost-container
    ports:
      - 80:80
      - 443:443
    tty: true

  ghost-container:
    image: ghost
    restart: always
    ports:
      - 2368:2368

我有四个网站,l.com,t1.l.com,t2.l.com,t3.l.com,都是由letsencrypt完成的ssl证书,并在URL上工作我可以看到绿色锁等...

对于t2.l.com,我希望这是一个来自ghost的博客,但是有以下nginx conf,

upstream ghost-container {
    server ghost-container:2368;
}

server {
    server_name t2.l.com;

    location / {
        proxy_pass https://ghost-container;
        proxy_ssl_certificate /etc/letsencrypt/live/l.com/fullchain.pem;
        proxy_ssl_certificate_key /etc/letsencrypt/live/l.com/privkey.pem;
        proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        proxy_ssl_ciphers "ECDHE-ECD ... BC3-SHA:!DSS";
        proxy_ssl_session_reuse on;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/l.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/l.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
}

server {
    listen       80;
    listen [::]:80;
    server_name  t2.l.com;

    include /etc/nginx/snippets/letsencrypt.conf;

    location / {
        return 301 https://t2.l.com$request_uri;
        #proxy_pass http://ghost-container;
    }
}

如果我注释掉了返回301,并且只保留了proxy_pass,我被重定向到ghost博客没有问题,除了它不是通过ssl,但如果我注释掉代理传递,如上所述,并返回301,服务器返回502坏网关。

有什么我想念的吗?从其他人的代码来看,似乎只有代理证书就足够了......

修改

好吧,我刚刚做了一些我确定不会工作的东西,并将ssl部分中的代理传递设置为http:而不是https:,这一切都运行正常,所以如果有人能够解释背后的机制或逻辑为什么会这样,我会非常感兴趣,它在我的脑海里没有意义。

1 个答案:

答案 0 :(得分:0)

您必须区分从客户端到nginx(此处为反向代理)的连接以及从nginx到ghost容器的连接。

  1. 从客户端到nginx服务器的连接可以加密(https,端口443)或未加密(http,80)。在配置文件中,每个都有一个apache\bin\块。如果客户端通过https连接(重定向或直接连接),nginx将使用server处的密钥加密此连接的内容。内容可以从/etc/letsencrypt/live/l.com/*容器内的文件系统或上游服务器(因此反向代理)提供。

  2. 对于nginx-certbot-container,您希望使用上游服务器。 Nginx将打开与上游服务器的连接。这取决于在t2.l.com内运行的服务器是否需要端口2368上的http或https连接。根据您提供的信息,我推断它接受http连接。否则,您还需要为ghost容器提供SSL证书,或创建自签名证书并使nginx信任自签名上游连接。这意味着您的ghost-container应该使用http。由于此连接的包永远不会离开您的计算机,我认为在这种情况下使用http作为上游服务器是相当安全的。

  3. (如果这不是你想要的,你也可以在ghost容器中创建SSL端点。在这种情况下,nginx必须使用SNI来确定目标主机,因为它只能看到加密包。搜索 nginx反向代理ssl 左右。)

    注意:请注意proxy_pass属性。上面的docker-compose文件发布端口2368.因此可以通过ports访问ghost服务器。为避免这种情况,请将其替换为http://t2.l.com:2368