使用虛擬主機

如果您想將應用程式與提供它們的端點隔離,您可以使用虛擬主機。

單一應用程式伺服器經常要回應多個不同主機和埠配置的要求。多種原因混雜在一起,就會發生此情況,例如,它執行所在的機器使用了多個名稱不同的網路介面,或者是從 HTTP 伺服器、Proxy 或負載平衡器來遞送它。在這些情況下,您可能想控制特定主機可以聯絡哪個應用程式。虛擬主機提供這項功能。它會根據所配置的主機別名清單,來比對所要求的主機名稱和埠號(取決於 HTTP Host 標頭)。

WebSphere® Application Server Liberty 中,預設配置就已足夠。預設虛擬主機 (default_host) 符合任何送入的「主機和埠」組合的要求,且會將這些要求轉遞給預設應用程式儲存器。

下列清單說明在您配置虛擬主機時的重要配置元素。
  • virtualHost 配置元素 ID 值。
  • hostAlias 子元素配置。
  • allowFromEndpoint 子元素配置(若有使用的話)。
  • WAR 之 ibm-web-bnd.xmlibm-web-bnd.xmi 檔中的虛擬主機配置。
  • httpEndpoint 的主機屬性值。
  • httpEndpoint 的 ID 屬性值。

將兩個應用程式彼此隔離

下列範例說明虛擬主機作業的其中一種常見用法,以讓您瞭解一些必要的配置。此範例顯示如何配置兩個在不同埠上執行的應用程式。本範例還會進一步說明其中一個應用程式只提供於 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 存取這個應用程式。

如果部署了第三個應用程式,且它沒有指定特定虛擬主機,在這項配置中,該應用程式必須是一項 Proxy 要求,且其 HOST 標頭指定了不同埠,才能加以存取。比方說,如果對位於埠 80 的 Proxy 發出要求,由於該埠沒有列在任何 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>

    如果要求來自 Proxy,此配置會獨自將發給 Proxy 主機和埠的任何要求,遞送至 "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,同時源自於 localHostOnly 端點的要求。指向埠 9081 和 9444 的其他任何要求都會被拒絕。比方說,如果要求來自 defaultHttpEndpoint,且其 Host 標頭會參照 localhost:9081,則會拒絕該要求。
    • proxiedRequests 虛擬主機除了接受其 Host 標頭會參照 Proxy 中的外部主機名稱和埠 80 或 443 的要求,現在還會接受發出給埠 9080 或 9443(這是 defaultHttpEndpoint 使用的預設埠)的任何要求。

指示主題類型的圖示 概念主題

檔名:cwlp_virtual_hosts.html