虚拟主机是一种在单个服务器(或服务器池)上托管多个域名(对每个名称进行单独处理)的方法。这允许一台服务器共享其资源,例如内存和处理器周期,而无需提供的所有服务都使用相同的主机名。术语虚拟主机通常用于指代Web 服务器,但其原理确实适用于其他Internet服务。
一种广泛使用的应用程序是共享网络托管。共享网络托管的价格低于专用网络服务器的价格,因为可以在单个服务器上托管许多客户。单个实体希望在同一台机器上使用多个名称也很常见,这样名称就可以反映所提供的服务,而不是这些服务的托管位置。
有两种主要类型的虚拟主机,基于名称和基于 IP。基于名称的虚拟主机使用客户端提供的主机名。这节省了IP地址和相关的管理开销,但所服务的协议必须在适当的点提供主机名。特别是,将基于名称的虚拟主机与SSL/TLS一起使用存在很大的困难。基于 IP 的虚拟主机为每个主机名使用单独的IP 地址,它可以使用任何协议执行,但需要为每个服务的域名提供一个专用的 IP 地址。基于端口的虚拟主机原则上也是可以的,但在实践中很少使用,因为它对用户不友好。
可以组合基于名称和基于 IP 的虚拟主机:一台服务器可能有多个 IP 地址,并在这些 IP 地址的部分或全部上提供多个名称。在将 SSL/TLS 与通配符证书一起使用时,此技术非常有用。
基于名称的虚拟主机对同一个IP 地址使用多个主机名。
基于名称的虚拟主机所需的技术先决条件是具有HTTP /1.1 支持(今天很常见)的 Web 浏览器,以在请求中包含目标主机名。这允许在一个 IP 地址后托管多个站点的服务器提供正确的站点内容。更具体地说,它意味着设置Host HTTP header,这在 HTTP/1.1 中是强制性的。
例如,服务器可能正在接收对两个域的请求,www.example.com和www.example.net,这两个域都解析为相同的 IP 地址。对于www.example.com,服务器将从目录/var/www/user/Joe/site/发送HTML 文件,而对www.example.net 的请求将使服务器提供来自/var/www/user 的页面/玛丽/网站/。同一域的两个子域可以托管在一起。例如,博客服务器可能同时托管 blog1.example.com 和 blog2.example.com。
基于名称的虚拟主机的最大问题是难以托管多个运行SSL/TLS 的安全网站。因为 SSL/TLS握手发生在将预期的主机名发送到服务器之前,服务器不知道在握手中提供哪个证书。单个证书可以通过“主题名称”字段或通配符覆盖多个名称,但这种方法的实际应用受到管理考虑和通配符匹配规则的限制。TLS 有一个扩展名为Server Name Indication,它在握手开始时显示名称以规避该问题,除了一些较旧的客户端(特别是Internet Explorer在未实现SNI 的Windows XP或更旧的Android版本上)。
此外,如果域名系统(DNS) 不能正常运行,即使 IP 地址已知,也很难访问虚拟托管的网站。如果用户尝试回退到使用 IP 地址联系系统,如http://10.23.45.67/,Web 浏览器将发送 IP 地址作为主机名。由于 Web 服务器依赖 Web 浏览器客户端告诉它要使用的服务器名称 (vhost),因此服务器将使用默认网站进行响应——通常不是用户期望的网站。
这种情况下的解决方法是将 IP 地址和主机名添加到客户端系统的hosts 文件中。使用域名访问服务器应该可以再次工作。但是,用户在执行此操作时应小心,因为对主机名和 IP 地址之间的真实映射所做的任何更改都将被本地设置覆盖。这种变通方法对于普通的网络用户来说并不是很有用,但在修复 DNS 记录时可能对站点管理员有一些用处。
基于 IP
当使用基于 IP 的虚拟主机时,每个站点(一个 DNS 主机名或一组作用相同的 DNS 主机名)指向一个唯一的 IP 地址。webserver配置了多个物理网络接口,同一物理接口上配置了虚拟网络接口,或者一个接口上配置了多个IP地址。Web 服务器可以为每个 IP 地址打开单独的侦听套接字,也可以使用单个套接字侦听所有接口,并在接受连接后获取接收 TCP 连接的 IP 地址。无论哪种方式,它都可以使用 IP 地址来确定要提供服务的网站。客户端不参与此过程,因此(与基于名称的虚拟主机不同)不存在兼容性问题。这种方法的缺点是服务器需要为每个网站使用不同的 IP 地址。这增加了管理开销(既向服务器分配地址,又向互联网注册机构证明使用这些地址的合理性)并导致IPv4 地址耗尽。
基于端口
HTTP 的默认端口号是 80。但是,大多数 Web 服务器都可以配置为在几乎任何端口号上运行,前提是该端口号未被服务器上的任何其他程序使用。有需要特殊配置的HTTP Secure特殊端口 443(请参阅服务器名称指示)。基于端口的网站明确绑定到唯一的端口号和 IP 地址。在这种情况下,IP 地址用于托管多个网站。用于公共 IP 地址的唯一端口号将单个网站与绑定到同一 IP 地址的其他网站区分开来。
用途
虚拟网络托管通常在商业模式是为客户提供低成本网站托管的公司中大规模使用。全球绝大多数网络托管服务客户网站都托管在共享服务器上,使用虚拟托管技术。许多企业将虚拟服务器用于内部目的,其中出于技术或管理原因运营多个独立的网站,例如客户外联网网站、员工外联网、内部内联网和不同部门的内联网。如果网站架构没有安全问题,可以使用虚拟主机技术将它们合并到单个服务器中,从而减少管理和管理开销以及支持业务所需的独立服务器的数量。