使用虚拟主机

如果要隔离应用程序与处理它们的端点,那么可使用虚拟主机。

Open Liberty 有关在 V 21.0.0.10 和更高版本中使用虚拟主机的文档可在 Open Liberty Web 站点上获取。

单个应用程序服务器通常响应来自多个不同主机和端口配置的请求。 发生此情况可能有多种原因,例如,它在具有不同名称的多个网络接口上运行,或者它路由至/自 HTTP Server、代理或负载均衡器。 在此情况下,您可能想要控制可从特定主机联系的应用程序。 虚拟主机提供此功能。 它针对所配置的主机别名列表与所请求主机名和端口号(通过 HTTP 主机头确定)匹配。

WebSphere® Application Server Liberty中,缺省配置已足够。 缺省虚拟主机 (default_host) 与来自任何入局主机和端口组合的请求匹配,并将它们转发至缺省应用程序容器。

以下列表演示您配置虚拟主机时的关键配置元素。
  • virtualHost 配置元素标识值。
  • hostAlias 子元素配置。
  • allowFromEndpoint 子元素配置(如果已使用)。
  • WAR 的 ibm-web-bnd.xmlibm-web-bnd.xmi 文件中的虚拟主机配置。
  • httpEndpoint 的主机属性值。
  • httpEndpoint 的标识属性值。

使两个应用程序相互隔离

以下示例演示虚拟主管的某个较常用用法,以帮助您了解某种必需配置。 此示例显示如何配置在不同端口上运行的两个应用程序。 此示例还进一步演示了仅在 localhost 接口上可用的一个应用程序。
<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 文件,其中 ibm-web-bnd.xml 文件指定了 <virtual-host name=" application-1 "/> ,则只能在 your_host_name:9080/app1_context_root 访问此应用程序。

如果 App2 (WAR)的 ibm-web-bnd.xml 文件指定了 <virtual-host name=" application-2 "/> ,则只能通过 localhost:9081/app2_context_root 访问该应用程序。

如果所部署的第三个应用程序未指定特定虚拟主机,那么在此配置中,仅当它是包含 HOST 头(该头指定另一端口)的代理请求时,该应用程序才是可访问的。 例如,如果在端口 80 上对代理发出了请求,那么该端口不会列示在任何 hostAlias 规范中,所以该请求应路由至 default_host 虚拟主机。

根据所请求主机或端口隔离应用程序

Liberty 中的默认虚拟主机也用于 JMX 通信。 如果您希望将 JMX 通信与应用程序流量隔离,那么您需要完成以下步骤。
  1. 决定虚拟主机名并更新应用程序以引用新(非缺省)主机。 将 virtual-host 元素添加至 WAR 的 ibm-web-bnd.xmlibm-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>
  2. 将 virtualHost 元素添加至 server.xml 文件。 该名称必须与应用程序中指定的内容匹配,并且必须定义路由至新虚拟主机的 hostAliases。
    注: 要匹配的主机名和端口是用户最初请求的主机名和端口,该主机名和端口可能与 Liberty 正在使用的主机和端口匹配,也可能不匹配。 以下示例演示已添加至 server.xml 文件的虚拟主机元素。
    <virtualHost id="proxiedRequests">
        <hostAlias>external.host.name:80</hostAlias>
        <hostAlias>external.host.name:443</hostAlias>
    </virtualHost>

    如果请求来自代理,那么此配置将对代理的主机和端口发送的任何请求单独路由至“proxiedRequests”虚拟主机。

根据发起端点限制访问

如果要将访问范围限制为使用 defaultHttpEndpoint 的缺省/系统应用程序,那么需要执行更多步骤。
  1. 定义另一 httpEndpoint。 以下示例演示另一 httpEndpoint。
    <httpEndpoint id="localHostOnly" host="localhost" httpPort="9081" httpsPort="9444"/>

    此 HTTP 端点指定 host="localhost",意味着仅在 localhost 接口上展示端口 9081 和 9444。

  2. 更新 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 的任何其他请求被拒绝。 例如,来自 defaultHttpEndpoint 并具有引用 localhost:9081 的 Host 头的请求被拒绝。
    • proxiedRequests 虚拟主机现在接受向端口 9080 或 9443(它们是 defaultHttpEndpoint 使用的缺省端口)发出的任何请求,以及其 Host 头引用代理中的外部主机名和端口 80 或 443 的请求。