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

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

問題

用戶端應用程式取得 503 Service Unavailable 的 HTTP 狀態碼,以及 錯誤代碼 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 和通道

Apigee Edge 可讓 API Proxy 透過 Proxy 與後端伺服器通訊 如 設定轉送 Proxy。Proxy 伺服器會開啟安全 (HTTPS) 或不安全 (HTTP) 連線至後端伺服器 (根據 Proxy 類型 依據使用的資源 HTTPClient.proxy.type) 並轉移資料 往兩個方向移動這就是所謂的通道

根據預設,Apigee Edge 會為所有流量使用通道。如要停用通道 「HTTPClient.use.tunneling」必須設為「false」。

錯誤代碼:Protocol.http.ProxyTunnelCreationFailed

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

通常 Apigee Edge 回應中的 faultstring 狀態碼 表示造成這個錯誤的可能原因。

Faultstring 範本:

Proxy refused to create tunnel with response status STATUS_CODE

在錯誤字串中觀察到部分狀態碼的可能原因:

下表根據 faultstring:

錯誤字串 說明
Proxy 拒絕建立回應狀態為「403」的通道

403 - Forbidden

這可能是因為防火牆或 ACL 限制 阻擋建立通道的情況

Proxy 拒絕建立回應狀態為「503」的通道

503 - Service Unavailable

可能的原因包括 DNS 問題、防火牆限制、後端伺服器的 無法使用,因此無法建立通道

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

504 - Gateway Timeout

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

faultstring 中觀察到的狀態碼而定,您必須使用 以適當技巧解決問題。本教戰手冊說明如何排解問題 如果你在 faultstring 中觀察到狀態碼 403 ,就會發生這個問題 找出錯誤代碼 protocol.http.ProxyTunnelCreationFailed

可能原因

如有任何防火牆或 ACL (存取) 設定,就會發生這個錯誤 (狀態碼 403) 控制清單) 在後端伺服器上設定的限制,可防止通道連線 透過 Proxy 伺服器在 Apigee Edge 和後端伺服器之間建立。

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

常見的診斷步驟

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

追蹤工具

如何使用追蹤工具診斷錯誤:

  1. 啟用追蹤工作階段並 :
    • 等待錯誤發生,或
    • 如果可以重現問題,請發出 API 呼叫以重現問題 503 Service Unavailable 使用 Proxy refused to create tunnel with response status 403
  2. 確保已啟用「Show all FlowInfos」

  3. 請選取其中一個失敗的要求,然後檢查追蹤記錄。
  4. 瀏覽追蹤記錄的各個階段,找出失敗之處 發生。
  5. 這個錯誤通常會在「目標要求流程已開始」階段之後顯示 如下所示:

    請注意下列資訊:

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

  6. 前往追蹤記錄中的「AX」AX(已記錄 Analytics 資料) 階段,並按一下該階段。
  7. 向下捲動至「Phase Details」「Response Headers」區段,然後 確定 X-Apigee-fault-codeX-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. 如果您是 Private Cloud 使用者,可以使用 NGINX 存取記錄 然後找出 HTTP 503 Service Unavailable 的重要資訊 發生錯誤。
  2. 查看 NGINX 存取記錄:

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

    其中: ORGORGPORT# 會替換為實際值。

  3. 搜尋是否有任何 503 錯誤和錯誤代碼 在特定時間範圍內protocol.http.ProxyTunnelCreationFailed (如果 發生錯誤) 或出現任何要求失敗時 503
  4. 如果發現任何503 X-Apigee-fault-code 錯誤 符合 protocol.http.ProxyTunnelCreationFailed 的值, 然後判斷 X-Apigee-fault-source. 的價值。

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

    上述 NGINX 存取記錄範例的項目 X- Apigee-fault-code X-Apigee-fault-source:

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

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

診斷

  1. 使用追蹤工具或 NGINX 存取記錄檔,判斷 503 Service Unavailable 的「錯誤程式碼」和「錯誤來源」,詳情請參閱相關說明: 常見的診斷步驟
  2. 查看錯誤訊息,並判斷狀態碼 會在 faultstring 中指示失敗。
  3. 在此情況下,狀態碼為 403,表示「已禁止」
  4. 這代表您沒有建立通道的權限或權限。這麼做 發生這種情況,通常是因為系統設下任何防火牆或 ACL (存取控制清單) 限制 可防止建立通道
  5. 檢查後端伺服器上設定的所有防火牆和/或 ACL 限制 則可防止建立通道
  6. 視防火牆和/或 ACL 限制類型而定,你必須修正問題 才是正確的做法
  7. 讓我們舉例說明防火牆限制的疑難排解和解決方式 問題:

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

    您可以使用下列其中一種方式決定 Apigee Edge 傳遞的主機標頭:

    Trace

    如何使用 Trace 決定主機標頭:

    1. 確認 faultstring 包含Proxy refused to create tunnel with response status 403使用追蹤記錄,詳情如下: 常見的診斷步驟
    2. 前往「目標要求流程已開始」 階段,然後查看 要求標頭
    3. 確認 「Request Headers」部分。
    4. 如果「主機」標頭包含「Proxy 主機名稱」,則以下為 發生這項錯誤的原因。
    5. 這是因為後端伺服器上的防火牆設定為接受 要求。
    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 伺服器上擷取來自 tcpdump 的要求 Apigee Edge 的訊息處理器元件,包含下列指令:

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

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

    2. 使用以下程式碼分析「tcpdump」資料: Wireshark 工具或類似的程式碼 如果偏好在終端機視窗中工作 可使用 Google Cloud CLI gcloud 指令列工具
    3. 對於 tcpdump 會使用 Wireshark:

      ( 查看較大的圖片)

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

    7. 上述範例顯示「Host Header」圖示 httpin.org 是 Proxy 伺服器的主機名稱因此,當 Proxy 伺服器嘗試 透過傳遞上述的「Host Header」(主機標頭),透過後端伺服器建立通道 httpin.org,執行失敗並傳回錯誤 Proxy refused to create tunnel with response status 403

解析度

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

假如您確定這個錯誤是由後端伺服器 的防火牆造成, 設定讓 Host Header 一律包含「後端」伺服器 主機名稱,而訊息處理器正在傳送 Proxy 伺服器主機名稱,則執行 請按照下列步驟解決問題:

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

    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
    

參考資料