在 Apache 中拥有许多(数百个)VirtualHost 指令的性能/内存成本是多少?通常,这是一个好主意吗?
我目前正在致力于改进公司的按需基础设施。我们拥有的是一种相当经典的架构:customer1.service.com
例如,每个客户都有一个子域,该子域指向我们的一台物理服务器(它们实际上是虚拟机,但这并不重要,所以我们称之为主机)。这些主机可以为多个客户提供服务,而且由于我们的服务是基于 Web 的,因此我们让 Apache 向我们的 Web 应用程序发送请求。基本上,Apache 是一个 HTTP 代理,它就是做这个的。
由于我们的主机并不那么繁忙,我希望能够在每台主机上运行多种应用程序,并且 Apache 会将我们的客户发送到正确的应用程序。据我所知,实现这一点的唯一方法是每个子域/客户都有一个 VirtualHost 指令。因此,我基本上是在问,其中一百个是否会运行良好或存在性能问题。
此外,每个风格只有一个位置指令是不可能的,因为应用程序编写得很糟糕,并且不支持路径中的额外位(如customer1.service.com/v1/
)。
请随意提出您认为可能更有效的任何建议。
谢谢!
答案1
除非您运行的是具有 64M RAM 的 386,否则 100 个虚拟主机不会成为性能或内存问题。一般来说,除非您遇到 10,000+ 个虚拟主机的情况,否则我不会担心。
忽略 Richard 提出的所有考虑,我想知道每个请求的运行时性能成本是多少。看起来性能损失随着基于名称的虚拟主机的数量线性增加,并且(最终)随着基于 IP 的虚拟主机的数量线性增加。
有一个按 IP 地址散列的哈希表(对于 apache 2.2.17,大小为 256)。每个存储桶包含可能能够处理请求的虚拟主机的链接列表。详细信息请参见vhost.c
。
如果不分析代码,就很难说出匹配虚拟主机所花费的执行时间的百分比。
答案2
较大的 httpd.conf 配置文件可能会导致 Apache 重新启动、重建或更新时出现额外延迟,因为 Apache 显然需要处理这些文件。例如,如果您的 httpd.conf 包含约 2000 个主机,则文件可能超过 100K 行,处理时间可能需要 30-60 秒,具体取决于文件中包含的信息量。
然后,还要考虑其他灾难恢复问题,如果文件损坏,您将关闭多少台主机?更新 Apache 时,重建需要多长时间,或者由于大小,更新对机器的资源影响有多大?
诸如语法错误之类的简单问题可能会导致大文件出现严重问题,一个错误就会导致数百台主机离线:)
编辑:如果您要将子域重定向到另一台物理服务器,为什么不使用 DNS 区域呢?