我对运行一个反向代理感兴趣,该代理后面有 2-3 个虚拟机。每个内部服务器将运行多个虚拟主机,而不是手动配置代理上的每个虚拟主机(各种虚拟主机来来去去太频繁,这不切实际),我想使用可以按顺序使用模式匹配来查找合适的后端服务器的东西。例如:
Server 1: *.dev.mysite.com
Server 2: *.stage.mysite.com
Server 3: *.mysite.com, dev.mysite.com, stage.mysite.com, mysite.com
Server 4: *
在上面的配置中,task.dev.mysite.com 将转到服务器 1,dev.mysite.com 将转到服务器 3,yoursite.stage.mysite.com 将转到服务器 2,www.mysite.com 将转到服务器 3,yoursite.com 将转到服务器 4。
到目前为止,我已经研究过使用 Squid、Varnish 和 nginx。我对它们各自的可取性和普遍适用性有自己的看法,但它们中是否有任何一个可以以这种方式处理动态服务器选择并且不需要每个虚拟主机配置,这一点并不明显。另一方面,Apache 可以轻松简单地做到这一点,但除此之外(除了众所周知和熟悉之外)似乎非常不适合部分性能服务任务。
性能实际上还不是主要问题,但如果另一个系统性能更好,并且还可以处理所需的“免提”配置,那么使用 Apache 似乎是愚蠢的。但频繁调整所有生产服务的网关并冒着全网中断的风险也是如此……如果 Apache 成为太小的瓶颈,那么以后的停机时间也会更长。
这些(或其他)反向代理中的哪一个可以做到/能做得最好?
也许我应该将此作为一个单独的问题发布,但如果 Apache 是唯一可行的选择,那么 apache2.2(Ubuntu 12.04.1)中的 apache-mpm-event 有多安全/可靠/可预测,特别是对于专用的反向代理?据我所知,Event MPM 从 2.4 开始被宣布为“安全”,但目前尚不清楚 2.4 达到稳定性是否会对各个发行版的官方/稳定软件包渠道中提供的旧版本(2.2)产生任何影响。
答案1
如果您想这么做,Varnish 绝对可以做到这一点。
您在 vcl 文件中定义后端,然后在 vcl_recv 中使用一些正则表达式,如下所示:
if (req.http.Host ~ "\.dev\.mysite\.com$") {
set req.backend = server1;
elsif (req.http.Host ~ "\.stage\.mysite\.com$") {
set req.backend = server2;
elsif ...
我个人不会建议使用相同的 varnish 服务器进行暂存和生产,我至少会在另一个端口上运行一个单独的实例,但这无关紧要。
答案2
就我个人而言,我使用磅。我会更详细地讲解,但这个问题很快就会被关闭,因为这是一个购物问题。
我重新设计了大多数前端服务器,使其能够使用一些 Pound 反向代理,这大大降低了 SSL 证书成本和 IP 使用量。
我已经运行它们大约 9 个月了,没有出现任何故障,因此我可以保证它们的可靠性。
您还可以按照自己想要的精确方式在设置中进行通配符匹配:
HeadRequire "Host: .*.dev.mysite.com*"
HeadDeny "Host: .*.stage.mysite.com.*"