我有一台带有 2 个网站的服务器。我们将它们称为foo.com
和bar.com
。
foo.com
有一个子域名,称为mail.foo.com
。
和foo.com
都是bar.com
WordPress 网站,它们的 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.com
您bar.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;
}
}