使用Docker部署Nginx SSL代理到另一个容器的方法

4

我有一个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证书,在网址上可以看到绿色锁等等...对于t2.l.com,我想将其设置为一个基于Ghost的博客。但需要以下nginx配置:
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;
    }
}

如果我注释掉return 301,只保留proxy_pass,那么我可以顺利重定向到Ghost博客,但不是经由ssl。但如果我像上面那样注释掉代理并返回301,则服务器会返回502错误网关。是否有什么我忽略的问题?从其他人的代码来看,似乎只有代理证书就足够了...
编辑:嗯,我刚才做了一件我确信不会起作用的事情,在ssl部分将代理转发设置为http:而不是https:,结果一切正常工作了。如果有人能解释一下背后的机理或逻辑,我会很感兴趣,因为在我看来这毫无意义。
1个回答

1

你需要区分从客户端到nginx(即反向代理)的连接和从nginx到ghost容器的连接。

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

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

(如果这不是你想要的,你也可以在ghost容器中创建SSL端点。在这种情况下,nginx必须使用SNI来确定目标主机,因为它只看到加密包。搜索nginx反向代理ssl或类似内容。) 注意: 请小心处理ports属性。上述docker-compose文件发布了端口2368。因此,可以通过http://t2.l.com:2368访问ghost服务器。为避免这种情况,请将其替换为expose: [2368]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接