503 服務無法使用 - 無法透過 403 建立 Proxy 通道

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

問題

用戶端應用程式會收到 HTTP 狀態碼 503 Service Unavailable,以及錯誤代碼 protocol.http.ProxyTunnelCreationFailed,做為 API 呼叫的回應。

錯誤訊息

用戶端應用程式會取得下列回應代碼:

HTTP/1.1 503 Service Unavailable

此外,您可能會看到下列錯誤訊息:

{
   "fault":{
      "faultstring":"Proxy refused to create tunnel with response status 403",
      "detail":{
         "errorcode":"protocol.http.ProxyTunnelCreationFailed"
      }
   }
}

轉送 Proxy 和通道

如「 設定轉送 Proxy」一文所述,Apigee Edge 可讓 API Proxy 透過 Proxy 伺服器與後端伺服器通訊。Proxy 伺服器會根據使用的 Proxy 類型 ( HTTPClient.proxy.type) 屬性指出,開啟與後端伺服器的安全 (HTTPS) 或非安全 (HTTP) 連線,並雙向傳輸資料。這就是所謂的「通道化」

根據預設,Apigee Edge 會對所有流量使用通道。如要停用通道,請將 HTTPClient.use.tunneling 屬性設為 false

錯誤代碼:protocol.http.ProxyTunnelCreationFailed

如果由於防火牆、存取控制清單 (ACL) 限制、DNS 問題、後端伺服器無法使用、逾時等問題,導致 Proxy 伺服器無法在 Apigee Edge 與後端伺服器之間建立通道,Apigee Edge 就會傳回錯誤代碼 protocol.http.ProxyTunnelCreationFailed

Apigee Edge 回應的 faultstring 中的狀態碼通常會指出可能導致這項錯誤的高層級原因。

Faultstring 範本:

Proxy refused to create tunnel with response status STATUS_CODE

faultstring 中觀察到部分狀態碼的可能原因:

下表說明可能原因,視 faultstring 中顯示的狀態碼而定:

Faultstring 說明
Proxy 拒絕建立通道,回應狀態為 403

403 - Forbidden

這可能是因為後端伺服器上設定的防火牆或 ACL 限制,導致無法建立通道。

Proxy 拒絕建立通道,回應狀態為 503

503 - Service Unavailable

這可能是因為 DNS 問題、防火牆限制,或是後端伺服器無法使用,導致無法建立通道

Proxy 拒絕建立通道,回應狀態為 504

504 - Gateway Timeout

如果建立通道時發生逾時,就可能發生這種情況

根據 faultstring 中觀察到的狀態碼,您需要使用適當的技術來排解問題。如果觀察到錯誤代碼 protocol.http.ProxyTunnelCreationFailed 的狀態碼 403 ,這份劇本會說明如何排解問題。faultstring

可能原因

如果後端伺服器上設定了任何防火牆或 ACL (存取控制清單) 限制,導致 Proxy 伺服器無法在 Apigee Edge 與後端伺服器之間建立通道,就會發生這項錯誤 (狀態碼 403)。

原因 說明 適用於以下裝置的疑難排解說明
Proxy 拒絕建立通道,回應狀態為 403 Proxy 伺服器收到 Proxy 伺服器主機名稱,而不是 Host 標頭中的後端伺服器主機名稱,因此拒絕建立通道。 僅限 Edge Private Cloud 使用者

常見的診斷步驟

請使用下列其中一種工具/技術診斷這項錯誤:

追蹤工具

如要使用「追蹤」工具診斷錯誤,請按照下列步驟操作:

  1. 啟用追蹤工作階段,並選擇下列任一選項:
    • 等待發生錯誤,或
    • 如果可以重現問題,請發出 API 呼叫來重現問題 503 Service Unavailable ,並使用 Proxy refused to create tunnel with response status 403
  2. 確認已啟用「顯示所有流程資訊」

  3. 選取其中一個失敗的要求,然後檢查追蹤記錄。
  4. 瀏覽追蹤記錄的不同階段,找出發生失敗的位置。
  5. 您通常會在「Target Request Flow Started」(目標要求流程已啟動) 階段後看到錯誤,如下所示:

    請注意下列資訊:

    錯誤: Proxy refused to create tunnel with response status 403

  6. 在追蹤記錄中前往「AX」(記錄的 Analytics 資料) AX階段,然後按一下。
  7. 向下捲動至「Phase Details」「Response Headers」部分,然後判斷「X-Apigee-fault-code」和「X-Apigee-fault-source」的值,如下所示:

    ( 查看較大圖片)

    ( 查看較大圖片)

  8. 您會看到 X-Apigee-fault-codeX-Apigee-fault-source 的值分別為 protocol.http.ProxyTunnelCreationFailedtarget ,表示這項錯誤是因為未收到預期的主機標頭,導致 Proxy 管道建立失敗。

    回應標頭
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

NGINX

如要使用 NGINX 存取記錄診斷錯誤,請按照下列步驟操作:

  1. 如果您是私有雲使用者,可以透過 NGINX 存取記錄,判斷 HTTP 503 Service Unavailable 錯誤的相關金鑰資訊。
  2. 檢查 NGINX 存取記錄:

    /opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log

    說明: ORGORGPORT# 會替換為實際值。

  3. 搜尋特定時間內是否有任何錯誤代碼為 503protocol.http.ProxyTunnelCreationFailed 的錯誤 (如果問題發生在過去),或是否有任何要求仍失敗並顯示 503
  4. 如果發現任何503 錯誤,且 X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed 的值相符,請判斷 X-Apigee-fault-source 的值。

    NGINX 存取記錄檔中的 503 錯誤範例:

    上述 NGINX 存取記錄檔的範例項目,X-Apigee-fault-codeX-Apigee-fault-source 的值如下:

    回應標頭
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

原因:Proxy 拒絕建立通道,回應狀態為 403

診斷

  1. 如要判斷 503 Service Unavailable錯誤代碼錯誤來源,請按照「 常見診斷步驟」一文的說明,使用追蹤工具或 NGINX 存取記錄。
  2. 查看「錯誤訊息」,並判斷狀態碼 faultstring 是否指出通道建立失敗。
  3. 在這個情境中,狀態碼為 403,表示「禁止」
  4. 這表示您沒有足夠的權利或權限來建立通道。如果防火牆或 ACL (存取控制清單) 設有限制,導致無法建立通道,通常就會發生這種情況。
  5. 檢查後端伺服器上設定的任何防火牆和/或 ACL 限制,這些限制可能會阻礙通道建立。
  6. 視防火牆和/或 ACL 限制類型而定,您需要適當修正問題。
  7. 我們以防火牆限制為例,說明如何排解及解決這個問題:

    情境:後端伺服器上的防火牆限制會預期主機標頭一律包含後端伺服器主機名稱

    您可以透過下列任一方式,判斷 Apigee Edge 傳遞的 Host 標頭:

    追蹤記錄

    如要使用 Trace 判斷主機標頭,請按照下列步驟操作:

    1. 確認 faultstring 包含 Proxy refused to create tunnel with response status 403,方法是使用「常見診斷步驟」一文所述的追蹤功能。
    2. 前往「Target Request Flow Started」(目標要求流程已啟動) 階段 ,然後查看「Request Headers」(要求標頭)
    3. 在「Request Headers」(要求標頭) 部分,驗證「Host header」(主機標頭) 中指定的主機名稱值。
    4. 如果 Host 標頭包含 Proxy 主機名稱,就會導致這個錯誤。
    5. 這是因為後端伺服器上的防火牆已設定為只接受 Host Header 包含後端伺服器名稱的要求。
    6. 因此,當 Proxy 伺服器嘗試與後端伺服器建立通道時,會因錯誤而失敗。

      Proxy refused to create tunnel with response status 403

      顯示主機標頭含有 Proxy 主機名稱的追蹤記錄範例

      ( 查看大圖)

      在上述範例追蹤記錄中,主機標頭包含 Proxy 主機名稱 www.proxyserver.com. 。由於後端伺服器上設定了防火牆限制,只允許主機標頭包含後端伺服器主機名稱,因此您會收到 Proxy refused to create tunnel with response status 403 錯誤。

    tcpdump

    使用 tcpdump 判斷主機標頭

    1. 使用下列指令,在 Proxy 伺服器上擷取來自 Apigee Edge 訊息處理器元件的要求:tcpdump

      tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
      

      如要進一步瞭解如何使用 tcpdump 指令,請參閱 tcpdump

    2. 使用 Wireshark 工具或類似工具分析 tcpdump 資料。
    3. 以下是使用 Wireshark 分析 tcpdump 的範例:

      ( 查看大圖)

    4. 封包編號 131415 顯示,訊息處理器正在透過三向 TCP 握手程序,與 Proxy 伺服器建立連線。
    5. 在封包 16 中,訊息處理器已連線至 Proxy 主機 httpbin.org (如上例所示)。
    6. 選取封包 16,詳細檢查封包內容,特別是訊息處理器傳遞至 Proxy 伺服器的「主機標頭」

    7. 上方的範例顯示「主機標頭」httpin.org,這是 Proxy 伺服器的主機名稱。因此,當 Proxy 伺服器嘗試透過傳遞上述 Host 標頭 httpin.org,與後端伺服器建立通道時,會因 Proxy refused to create tunnel with response status 403 錯誤而失敗。

解析度

情境:Proxy 伺服器的防火牆限制要求主機標頭一律包含後端伺服器主機名稱

如果您已確認此錯誤是由於後端伺服器上的防火牆設定所致,且防火牆預期 Host Header 一律應包含 backend 伺服器主機名稱,但訊息處理器傳送的是 proxy server 主機名稱,請按照下列步驟解決問題:

  1. 在 TargetEndpoint 中將 use.proxy.host.header.with.target.uri 屬性設為 true,如以下範例所示:

    TargetEndpoint 設定範例:

    <TargetEndpoint name="default">
      <HTTPTargetConnection>
        <URL>https://mocktarget.apigee.net/json</URL>
        <Properties>
          <Property name="use.proxy.host.header.with.target.uri">true</Property>
        </Properties>
      </HTTPTargetConnection>
    </TargetEndpoint>
  2. 請務必在訊息處理器上設定與 轉送 Proxy 相關的其他屬性,如下所示:

    1. 檢查每個訊息處理器上的 /opt/apigee/customer/application/message-processor.properties 檔案。
    2. 請確保下列屬性是根據您的用途或需求設定:

      屬性範例值:

      conf_http_HTTPClient.use.proxy=true
      conf/http.properties+HTTPClient.proxy.type=HTTP
      conf/http.properties+HTTPClient.proxy.host=PROXY_SERVER_HOST_NAME
      conf/http.properties+HTTPClient.proxy.port=PORT_#
      conf/http.properties+HTTPClient.proxy.user=USERNAME
      conf/http.properties+HTTPClient.proxy.password=PASSWORD

必須收集診斷資訊

如果按照上述指示操作後問題仍未解決,請收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡:

如果您是 Private Cloud 使用者,請提供下列資訊:

  • 失敗要求顯示的完整錯誤訊息
  • 環境名稱
  • API Proxy 套裝組合
  • API 要求的追蹤記錄檔
  • NGINX 存取記錄

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    說明: ORGENVPORT# 會替換為實際值。

  • 訊息處理器系統記錄

    /opt/apigee/var/log/edge-message-processor/logs/system.log

參考資料