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 伺服器會根據使用的 Proxy 類型 (由屬性 HTTPClient.proxy.type 表示),開啟與後端伺服器的安全 (HTTPS) 或非安全 (HTTP) 連線,並雙向傳輸資料。這就是所謂的通道

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

錯誤代碼:Protocol.http.ProxyTunnelCreationFailed

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

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 中觀察 faultstring 錯誤代碼 protocol.http.ProxyTunnelCreationFailed狀態碼 403 ,本教戰手冊說明如何排解問題。

可能原因

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

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

常見診斷步驟

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

追蹤工具

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

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

  3. 請選取其中一個失敗的要求,然後檢查追蹤記錄。
  4. 瀏覽追蹤記錄的不同階段,找出發生錯誤的位置。
  5. 一般而言,您會在「目標要求流程」開始階段之後看到錯誤,如下所示:

    請注意下列資訊:

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

  6. 前往追蹤記錄中的「AX」(Analytics (分析) 已記錄) 階段,然後按一下該階段。
  7. 向下捲動至「階段詳細資料」的「回應標頭」區段,確定 X-Apigee-fault-codeX-Apigee-fault-source 的值,如下所示:

    ( 查看較大圖片)。

    ( 查看較大圖片)。

  8. 您將分別看到 X-Apigee-fault-codeX-Apigee-fault-source 的值為 protocol.http.ProxyTunnelCreationFailedtarget ,表示這項錯誤是因為未收到預期的主機標頭而造成這項錯誤所致。

    回應標頭
    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 錯誤代碼 503 與錯誤代碼 protocol.http.ProxyTunnelCreationFailed
  4. 如果發現 X-Apigee-fault-code X-Apigee-fault-code 值相符的任何 503 錯誤,請判斷 X-Apigee-fault-code 的值。

    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. 使用追蹤記錄工具或 NGINX 存取記錄檔,判斷 503 Service Unavailable不良程式碼錯誤來源,詳情請參閱常見診斷步驟
  2. 查看錯誤訊息,並判斷 faultstring 中因通道建立失敗而指出的狀態碼
  3. 在這個情境中,狀態碼為 403,表示「已禁止」
  4. 這表示您沒有足夠的權利或權限來建立通道。如果有任何防火牆或 ACL (存取控制清單) 限制導致系統無法建立通道,就可能發生這種情況。
  5. 查看後端伺服器上設定的所有防火牆和/或 ACL 限制,瞭解設定可能導致通道建立的問題。
  6. 您必須依據防火牆和/或 ACL 限制的類型,適當修正問題。
  7. 讓我們以防火牆限制為例,說明如何解決這個問題並解決這個問題:

    情境:在後端伺服器上設有防火牆限制,主機標頭應一律包含後端伺服器主機名稱

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

    追蹤記錄

    如何使用 Trace 判斷主機標頭:

    1. 按照常見診斷步驟說明,確認 faultstring 包含 Proxy refused to create tunnel with response status 403
    2. 前往「已開始目標要求流程」階段並查看「要求標頭」
    3. 驗證「Request Headers」區段中的主機名稱值。
    4. 如果「Host」標頭包含 Proxy 主機名稱,這就是這個錯誤的原因。
    5. 這是因為只有在「主機標頭」包含後端伺服器的名稱時,後端伺服器才能將防火牆設為接受要求。
    6. 因此,當 Proxy 伺服器嘗試建立具有後端伺服器的通道時,就會失敗並發生錯誤

      Proxy refused to create tunnel with response status 403.

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

      ( 查看較大圖片)。

      在上方顯示的追蹤記錄範例中,「Host Header」包含 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」16並檢查封包內容的詳細資料,特別是訊息處理器傳遞給 Proxy 伺服器的16

    7. 上方範例顯示「Host Header」圖示 httpin.org,這是 Proxy 伺服器的主機名稱。因此,當 Proxy 伺服器嘗試傳遞上述「Host Header」圖示 httpin.org 時,嘗試建立具有後端伺服器的通道,就會失敗,並發生 Proxy refused to create tunnel with response status 403 錯誤。

解析度

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

如果您確定這項錯誤是因為後端伺服器的防火牆設定成「主機標頭」應一律包含「後端」backend伺服器主機名稱,而訊息處理器正在傳送「Proxy 伺服器」backend主機名稱,請按照下列步驟解決問題:

  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
    

參考資料