使用虛擬主機
如果您想將應用程式與提供它們的端點隔離,您可以使用虛擬主機。
單一應用程式伺服器經常要回應多個不同主機和埠配置的要求。多種原因混雜在一起,就會發生此情況,例如,它執行所在的機器使用了多個名稱不同的網路介面,或者是從 HTTP 伺服器、Proxy 或負載平衡器來遞送它。在這些情況下,您可能想控制特定主機可以聯絡哪個應用程式。虛擬主機提供這項功能。它會根據所配置的主機別名清單,來比對所要求的主機名稱和埠號(取決於 HTTP Host 標頭)。
在 WebSphere Application Server Liberty 中,預設配置就已足夠。預設虛擬主機 (default_host) 符合任何送入的「主機和埠」組合的要求,且會將這些要求轉遞給預設應用程式儲存器。
- virtualHost 配置元素 ID 值。
- hostAlias 子元素配置。
- allowFromEndpoint 子元素配置(若有使用的話)。
- WAR 之 ibm-web-bnd.xml 或 ibm-web-bnd.xmi 檔中的虛擬主機配置。
- httpEndpoint 的主機屬性值。
- httpEndpoint 的 ID 屬性值。
將兩個應用程式彼此隔離
<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 虛擬主機。
根據所要求的主機或埠來隔離應用程式
- 決定您的虛擬主機名稱,並更新應用程式以參照新的(非預設)主機。將 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>
如果要求來自 Proxy,此配置會獨自將發給 Proxy 主機和埠的任何要求,遞送至 "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,同時源自於 localHostOnly 端點的要求。指向埠 9081 和 9444 的其他任何要求都會被拒絕。舉例來說,如果要求來自 defaultHttpEndpoing,且其 Host 標頭會參照 localhost:9081,則會拒絕該要求。
- proxiedRequests 虛擬主機除了接受其 Host 標頭會參照 Proxy 中的外部主機名稱和埠 80 或 443 的要求,現在還會接受發出給埠 9080 或 9443(這是 defaultHttpEndpoint 使用的預設埠)的任何要求。