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

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件
info

在 Apigee Edge 中,路由器會處理所有傳入的 API 流量。也就是說,所有傳送至 Edge API Proxy 的 HTTP 和 HTTPS 要求,都會先由 Edge 路由器處理。因此,API Proxy 要求必須導向 Router 上的 IP 位址和開啟的通訊埠。

虛擬主機可讓您在單一伺服器或伺服器群組上託管多個網域名稱。 如果是 Edge,伺服器對應的是 Edge 路由器。在路由器上定義虛擬主機,即可處理多個網域的要求。

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

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

在這個範例中,有兩個虛擬主機定義。一個處理網域 domainName1 的 HTTPS 要求,另一個處理 domainName2 的 HTTP 要求。

當要求傳送至 API Proxy 時,路由器會比較傳入要求的 Host 標頭和連接埠號碼,與所有虛擬主機定義的主機別名 清單,判斷由哪個虛擬主機處理要求。

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

虛擬主機設定範例

反模式

在機構的相同/不同環境中,或跨機構使用相同的主機別名和通訊埠編號定義多個虛擬主機,會在路由傳送 API 要求時造成混淆,並可能導致非預期的錯誤/行為。

我們將透過範例,說明使用相同主機別名設定多個虛擬主機的影響。

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

別名相同的虛擬主機

完成上述設定後,可能會出現下列各節所述的兩種情況。

情境 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 

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

情境 2:API Proxy 設定為接受虛擬主機 sandbox 和 secure 的要求

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

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

不過,這會導致 Analytics 儲存不正確的資料,因為 API 要求會同時傳送至兩個虛擬主機,但實際要求只應傳送至一個虛擬主機。

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

影響

  1. API 要求可能會轉送至 API Proxy 未設定接受要求的虛擬主機,因此發生 404 錯誤。
  2. API 要求會轉送至具有相同主機別名的所有虛擬主機,但要求僅適用於特定虛擬主機,因此 Analytics 資料不正確。

最佳做法

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

    兩個虛擬主機

延伸閱讀