反模式:定義相同主機別名和通訊埠編號的多個虛擬主機

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

在 Apigee Edge 中,Router 會處理所有傳入的 API 流量。這表示向 Edge API Proxy 發出的所有 HTTP 和 HTTPS 要求會先由 Edge Router 處理。因此,API Proxy 要求必須導向至 IP 位址,以及路由器上的開啟通訊埠。

「虛擬主機」可讓您在單一伺服器或一組伺服器中代管多個網域名稱。在 Edge 中,伺服器會對應到邊緣路由器。在路由器上定義虛擬主機,即可處理傳送至多個網域的要求。

Edge 上的虛擬主機會定義通訊協定 (HTTP 或 HTTPS)、路由器通訊埠和主機別名。主機別名通常是對應至路由器 IP 位址的 DNS 網域名稱。

舉例來說,下圖顯示具有兩個虛擬主機定義的路由器:

此範例中有兩個虛擬主機定義。其中一個會處理 domainName1 網域的 HTTPS 要求,另一個則處理 domainName2 上的 HTTP 要求。

向 API Proxy 發出要求時,路由器會將傳入要求的主機標頭和通訊埠號碼與所有虛擬主機定義的「主機別名」 清單進行比對,以判斷由哪個虛擬主機處理要求。

虛擬主機的設定範例如下所示:

vhost 設定範例

反模式

如果您在某個機構或不同機構的相同/不同環境中,定義多個具有相同主機別名和通訊埠編號的虛擬主機,在轉送 API 要求時就會產生混淆,並可能會導致非預期的錯誤/行為。

讓我們透過範例說明,使用多個具備相同主機別名的虛擬主機可能會有什麼影響。

假設有兩個虛擬主機 sandbox and secure 使用相同的主機別名定義,也就是環境中的 api.company.abc.com

別名相同的 Vhost

進行上述設定時,可能會遇到以下兩節所述的兩種情境。

情境 1:API Proxy 設為僅接受傳送至其中一個虛擬主機沙箱的要求

<ProxyEndpoint name="default">
  ...
  <HTTPProxyConnection>
    <BasePath>/demo</BasePath>
    <VirtualHost>sandbox</VirtualHost>
  </HTTPProxyConnection>
  ...
</ProxyEndpoint>

在這個情況下,當用戶端應用程式使用主機別名 api.company.abc.com 呼叫特定 API Proxy 時,應用程式會間歇性獲得 404 錯誤,訊息如下:

Unable to identify proxy for host: secure 

這是因為路由器會將要求同時傳送至 sandboxsecure 虛擬主機。要求轉送至 sandbox 虛擬主機時,用戶端應用程式會收到成功的回應。不過,要求轉送至 secure 虛擬主機時,用戶端應用程式會收到 404 錯誤,因為 API Proxy 未設為在 secure 虛擬主機上接受要求。

情境 2:API Proxy 設定為接受傳送至虛擬主機沙箱和安全的要求

<ProxyEndpoint name="default">
  ...
  <HTTPProxyConnection>
    <BasePath>/demo</BasePath>
    <VirtualHost>sandbox</VirtualHost>
    <VirtualHost>secure</VirtualHost>
  </HTTPProxyConnection>
  ...
</ProxyEndpoint>

在這個情境中,當用戶端應用程式使用主機別名 api.company.abc.com 呼叫特定 API Proxy 時,就會根據 Proxy 邏輯取得有效的回應。

不過,由於 API 要求會轉送至兩個虛擬主機,但實際要求只會傳送至一個虛擬主機,因此會導致不正確的資料儲存在 Analytics (分析) 中。

這也會影響記錄資訊,以及任何以虛擬主機為基礎的資料。

影響程度

  1. API 要求可能會轉送至虛擬主機,導致 API Proxy 不得設為接受要求而發生 404 錯誤。
  2. Analytics (分析) 資料不正確,因為在只向特定虛擬主機提出要求時,API 要求會轉送至具有相同主機別名的所有虛擬主機。

最佳做法

  • 請勿在相同環境或機構中不同的環境中定義多個具有相同主機別名和通訊埠編號的虛擬主機。
  • 如果您需要定義多個虛擬主機,請在每個虛擬主機中使用不同的主機別名,如下所示:

    兩位 Vhost

其他資訊