NGINX SSL 直通和 Docker

NGINX SSL 直通和 Docker

我有一台带有 2 个网站的服务器。我们将它们称为foo.combar.com

foo.com有一个子域名,称为mail.foo.com

foo.com都是bar.comWordPress 网站,它们的 NGINX 配置是您在 WP 说明中找到的常见 WP 配置。

我还有一个正在运行Mailcow图像的 Docker,它正在监听端口0.0.0.0:3333 (http)0.0.0.0:3334 (https)

有没有办法可以配置 NGINX,以便打开浏览器并转到:

  • foo.com将显示我的网站foo
  • bar.com将显示我的网站bar(这两点目前工作正常)
  • http://mail.foo.com将使 NGINX 传递到127.0.0.1:3333
  • https://mail.foo.com将使 NGINX 传递到127.0.0.1:3334

目前我正在尝试通过以下方式实现这一目标:

stream {
    map $ssl_preread_server_name $name {
        mail.foo.com mailcow;
    }

    upstream mailcow {
        server 127.0.0.1:3333;
    }

    server {
        listen 0.0.0.0:80;
        proxy_pass $name;
        ssl_preread on;
    }
}

但是,当我尝试启动 NGINX 时,它显示端口 80 已被使用。没有任何程序在监听端口 80。我怀疑 NGINX 之所以这样说,是因为http每个虚拟主机(域)的配置中的块也监听端口 80。

那么,我的问题可能是:我可以在和stream部分中监听端口 80http吗?

如果“否”,我该如何通过 SSL 传递流量mail.foo.com

答案1

您不能在同一个 IP 地址和端口组合上使用多个应用层协议。这意味着您不能在同一个端口上同时使用 HTTP 和 HTTPS,而且您也不能在同一个 ip:port 上使用 HTTP 和流(即未指定的应用层协议)。

但考虑到你实际上使用流来转发 HTTP 和 HTTPS,你可能只会使用普通反向代理(proxy_pass) 而不是 stream,即拥有虚拟主机,就像foo.combar.com目前拥有的一样,然后拥有另一个虚拟主机,mail.foo.com它是 mailcow 实例的反向代理。由于这将是一个真正的 HTTP/HTTPS 反向代理,而不是 TCP 级别直通,因此需要在 nginx 上安装 mailcow 的证书。您还可以简单地将外部 HTTPS 和 HTTP 转发到 mailcow 的 HTTP 接口,并让 nginx 只处理 HTTPS。设置看起来如下所示:

server {
    listen 80;
    servername mail.foo.com;
    location / {
        proxy_pass http://127.0.0.1:3333;
    }
}
server {
    listen 443 ssl;
    servername mail.foo.com;
    ssl_certificate ...
    ssl_certificate_key ...
    location / {
        proxy_pass http://127.0.0.1:3333;
    }
}

相关内容