虚拟主机
虚拟主机是使单一主机能够模拟多台主机的配置实体。
虚拟主机维护它所处理的多用途因特网邮件扩展 (MIME) 类型列表。可将虚拟主机与一个或多个 Web 模块相关联,但只能将每个 Web 模块与一个虚拟主机相关联。即使多个虚拟主机共享一台物理机器,与一个虚拟主机相关联的资源也不能与另一虚拟主机所关联的资源共享数据。
每个虚拟主机有一个逻辑名和一个它已识别的一个或多个 DNS 别名组成的列表。DNS 别名是用于请求 servlet 的 TCP/IP 主机名和端口号(例如,yourHostName:80)的别名。如果未指定端口号,那么将采用 80。
- 缺省别名为 *:80,它使用非安全外部端口。
- 格式为 *:9080 的别名使用非安全内部端口。
- 格式为 *:9443 的别名使用安全内部端口。
- 格式为 *:443 的别名使用安全外部端口。
针对 Servlet、JavaServer Pages 文件或相关资源的客户机请求包含对该资源唯一的 DNS 别名和统一资源指示符 (URI)。接收到针对 servlet、JavaServer Pages 文件或相关资源的客户机请求时,DNS 别名将与所有已知虚拟主机组的列表进行比较,以查找正确的虚拟主机。该 URI 将与所有已知 URI 组的列表进行比较,以查找正确的 URI 组。如果找到正确的虚拟主机组和 URI 组,那么会将请求发送至相应的服务器组以进行处理,并且会将响应返回给浏览器。如果找不到匹配的虚拟主机组或 URI 组,就会将错误返回给浏览器。
虚拟主机与特定节点或机器无关。它是一种配置,而不是真的对象,所以您可以创建它,但不能将它启动或停止。缺省虚拟主机 default_host 是在第一次启动应用程序服务器时自动配置的。除非您特别想将同一节点或物理机器上的资源互相隔离,否则除了缺省主机,您可能不需要任何虚拟主机。
缺省虚拟主机的 DNS 别名将配置为 *:80 和 *:9080,其中端口 80 是 HTTP 服务器端口,而端口 9080 是缺省服务器的 HTTP 传输的端口。缺省虚拟主机包括公共别名,例如机器的 IP 地址、短主机名和标准主机名称。在这些别名中,其中一个别名组成用于访问资源(例如 servlet)的路径的第一部分。例如,将在 http://localhost:80/myServlet 请求中使用别名 localhost:80。
在请求资源时,产品尝试将此请求映射到已定义的虚拟主机别名。虚拟主机的 http://host:port/ 部分是不区分大小写的,但其后的 URL 是区分大小写的。URL 的匹配必须是字母数字精确匹配。不同的端口号将视为不同的别名。
例如,请求 http://www.myhost.com/myservlet 成功映射至 http://WWW.MYHOST.COM/myservlet,但不映射至 http://WWW.MYHOST.COM/MYSERVLET 或 Www.Myhost.Com/Myservlet。在后面两种情况下,这些映射将会因为区分大小写而失败。请求 http://www.myhost.com/myservlet 不能成功映射至 http://myhost/myservlet 或 http://myhost:9876/myservlet。这些映射因包含的字母数字不正确而失败。
您可以根据端口使用别名的通配符条目,并指定特定端口上的所有有效主机名和地址组合映射至特定虚拟主机。
如果您用来请求资源的别名无法映射至定义的虚拟主机的别名,那么会在用于发出请求的浏览器中接收到 404 错误。同时将出现一条消息,表明无法找到虚拟主机。
- Web 客户机请求 snoop servlet 的 Web 地址为:http://www.some_host.some_company.com:9080/snoop
- some_host 机器将 9080 端口分配给独立应用程序服务器 server1。
- server1 查找虚拟主机分配以确定分配给别名 some_host.some_company.com:9080 的虚拟主机。
- 应用程序服务器发现此 DNS 字符串不存在显式别名。但是,在端口号 9080 上为主机名分配的通配符 * 确实存在,所以此通配符是匹配项。定义该匹配的虚拟主机是 default_host。
- 应用程序服务器查看部署在 default_host 上的应用程序,并找出 snoop servlet。
- 应用程序服务器为 Web 客户机提供应用程序,并且请求方可以使用 snoop Servlet。
虚拟主机 | 别名 | 端口号 |
---|---|---|
default_host | * | 9080 |
default_host | localhost | 9080 |
default_host | my_machine | 9080 |
default_host | my_machine.my_company.com | 9080 |
default_host | localhost | 80 |
对于一个虚拟主机,您可以有任何数量的别名。您甚至可以有重叠别名,如:
应用程序服务器使用在 Web 客户机地址中指定的显式地址来寻找匹配。但是,它可能在匹配显式地址之前将匹配项解析为与模式匹配的任何其他别名。首先在别名列表中定义别名并不能保证产品寻找匹配别名时的搜索顺序。
带有重叠别名的虚拟主机。假设由于您碰巧为 admin_host 定义了端口 9080 而不是端口 9060,因此为两台虚拟主机定义了重叠的别名:
如果您对两台不同的虚拟主机使用同一别名,那么可能发生问题。例如,假设您在 default_host 上安装了缺省应用程序和 snoop servlet。您还有另一台名为 admin_host 的虚拟主机。然而,您尚未在 admin_host 上安装缺省应用程序或 snoop servlet。
虚拟主机 | 别名 | 端口号 |
---|---|---|
default_host | * | 9080 |
default_host | localhost | 9080 |
admin_host | * | 9060 |
admin_host | my_machine.com | 9080 |
假设 Web 客户机请求得到 http://my_machine.com:9080/snoop。
如果应用程序服务器与针对 *:9080 的请求相匹配,那么会从 default_host 中提供应用程序。如果应用程序服务器与针对 my.machine.com:9080 的请求相匹配,那么表示找不到该应用程序。在发出该请求的浏览器中发生 404 错误。同时将出现一条消息,表明无法找到虚拟主机。
该问题产生的原因是无法在具有匹配别名的第一个虚拟主机中找到请求的应用程序。编码别名的正确方法是让入局请求中的别名只匹配所有虚拟主机定义中的一台虚拟主机。如果 URL 可以匹配多台虚拟主机,那么您将看到刚才描述的问题。