使用虚拟主机
如果要隔离应用程序与处理它们的端点,那么可使用虚拟主机。
单个应用程序服务器通常响应来自多个不同主机和端口配置的请求。发生此情况可能有多种原因,例如,它在具有不同名称的多个网络接口上运行,或者它路由至/自 HTTP Server、代理或负载均衡器。在此情况下,您可能想要控制可从特定主机联系的应用程序。虚拟主机提供此功能。它针对所配置的主机别名列表与所请求主机名和端口号(通过 HTTP 主机头确定)匹配。
在 WebSphere Application Server Liberty 中,缺省配置已经够用。缺省虚拟主机 (default_host) 与来自任何入局主机和端口组合的请求匹配,并将它们转发至缺省应用程序容器。
- virtualHost 配置元素标识值。
- hostAlias 子元素配置。
- allowFromEndpoint 子元素配置(如果已使用)。
- WAR 的 ibm-web-bnd.xml 或 ibm-web-bnd.xmi 文件中的虚拟主机配置。
- httpEndpoint 的主机属性值。
- httpEndpoint 的标识属性值。
使两个应用程序相互隔离
<httpEndpoint id="defaultHttpEndpoint" host="*" httpPort="9080" />
<httpEndpoint id="alternateEndpoint" host="*" httpPort="9081" />
<virtualHost id="application-1">
<hostAlias>your_host_name:9080</hostAlias>
</virtualHost>
<virtualHost id="application-2">
<hostAlias>localhost:9081</hostAlias>
</virtualHost>
<enterpriseApplication location="myApp.ear" name="App1"/>
<webApplication location="myApp2.war" name="App2" />
defaultHttpEndpoint 展示端口 9080 上的所有接口,alternateEndpoint 展示端口 9081 上的所有接口。
如果 App1 的 WAR 文件带有指定 <virtual-host name="application-1"/> 的 ibm-web-bnd.xml 文件,那么只能在 your_host_name:9080/app1_context_root 中访问此应用程序。
如果 App2(它是 WAR)具有指定 <virtual-host name="application-2"/> 的 ibm-web-bnd.xml 文件,那么只能在 localhost:9081/app2_context_root 中访问此应用程序。
如果所部署的第三个应用程序未指定特定虚拟主机,那么在此配置中,仅当它是包含 HOST 头(该头指定另一端口)的代理请求时,该应用程序才是可访问的。例如,如果在端口 80 上对代理发出了请求,那么该端口不会列示在任何 hostAlias 规范中,所以该请求应路由至 default_host 虚拟主机。
根据所请求主机或端口隔离应用程序
- 决定虚拟主机名并更新应用程序以引用新(非缺省)主机。将 virtual-host 元素添加至 WAR 的
ibm-web-bnd.xml 或 ibm-web-bnd.xmi 文件。
<?xml version="1.0" encoding="UTF-8"?> <web-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xmk/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd" version="1.0" /> <virtual-host name="proxiedRequests" /> </web-bnd>
- 将 virtualHost 元素添加至 server.xml 文件。该名称必须与应用程序中指定的内容匹配,并且必须定义路由至新虚拟主机的 hostAliases。注: 主机名和要匹配的端口是用户最初请求的项,它们可能与 Liberty 要使用的主机和端口匹配,也可能不匹配。以下示例演示已添加至 server.xml 文件的虚拟主机元素。
<virtualHost id="proxiedRequests"> <hostAlias>external.host.name:80</hostAlias> <hostAlias>external.host.name:443</hostAlias> </virtualHost>
如果请求来自代理,那么此配置将对代理的主机和端口发送的任何请求单独路由至“proxiedRequests”虚拟主机。
根据发起端点限制访问
- 定义另一 httpEndpoint。以下示例演示另一 httpEndpoint。
<httpEndpoint id="localHostOnly" host="localhost" httpPort="9081" httpsPort="9444"/>
此 HTTP 端点指定 host="localhost",意味着仅在 localhost 接口上展示端口 9081 和 9444。
- 更新 virtualHost 定义以指定 allowFromEndpointRef 属性。如果指定了此属性,那么 virtualHost 仅接受来自指定端点的请求。例如:
<virtualHost id="default_host" allowFromEndpointRef="localHostOnly"> <hostAlias>*:9081</hostAlias> <hostAlias>*:9444</hostAlias> </virtualHost> </virtualHost id="proxiedRequests"> <hostAlias>*:9080</hostAlias> <hostAlias>*:9443</hostAlias> <hostAlias>external.host.name:80</hostAlias> <hostAlias>external.host.name:443</hostAlias> </virtualHost>
通过此配置:- default_host 虚拟主机现在仅接受发送至 localhost:9081 和 localhost:9444 并且源自 ocalHostOnly 端点的请求。指向端口 9081 和 9444 的任何其他请求被拒绝。例如,来自 defaultHttpEndpoing 并具有引用 localhost:9081 的 Host 头的请求被拒绝。
- proxiedRequests 虚拟主机现在接受向端口 9080 或 9443(它们是 defaultHttpEndpoint 使用的缺省端口)发出的任何请求,以及其 Host 头引用代理中的外部主机名和端口 80 或 443 的请求。