我有一个公网 IP 地址。我尝试允许通过公网 IP 的 80 和 443 端口访问多个服务,并通过请求的服务器名称进行区分。
然而,有一项服务需要TCP在公共 IP 上的端口 80 和 443 上使用反向代理才能运行。另一个需要 TCP 反向代理,但只在端口 443 上使用。其余的只是网站,使用 http 反向代理就可以了,但我希望网站在端口 80 和 443 上可以公开访问,以方便访问者和 letsencrypt。
我可以根据需要启动任意数量的 VM 和私有 IP 以使其保持简单,但仅限于一个公共 IP 地址。
我可以使用 SNI 将 nginx 设置为反向代理来执行此操作吗?理论上,我认为我应该能够使用 SNI 通过主机名将所有内容传输到适当的服务器,并使用第二个 Web 服务器(该服务器已设置所需的网站以监听不同的端口)。例如,nginx.conf:
stream {
map $ssl_preread_server_name $name {
serviceone.domain.tld serviceone;
servicetwo.domain.tld servicetwo;
website1.domain.tld website1;
website2.domain.tld website2;
}
upstream serviceone {
server 10.1.99.7:443;
}
upstream servicetwo {
server 10.1.99.20:443;
}
upstream website1 {
server 10.1.99.30:10443;
}
upstream website2 {
server 10.1.99.30:10444;
}
server {
listen 443;
listen 80;
resolver 8.8.8.8;
proxy_pass $name;
ssl_preread on;
}
}
我的 nginx.conf 中有一些与上述类似的功能,但我有点不明白端口 80 请求是如何进入方程的(我只是在服务器块中加入了 listen 80,但无法解释如果请求的是相同的服务器名称,如何区分 443 和 80 来处理请求)
我也愿意尝试使用 nginx 或 haproxy 等更好的方法。谢谢!
答案1
只需对每个主机名使用单独的服务器{...} 块。
它不需要依赖任何附加模块就可以完成工作,并且如果上游服务器在代理上所需的配置不同,它将为您省去很多麻烦。