查看 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 」的通道 |
這可能是因為防火牆或 ACL 限制 阻擋建立通道的情況 |
Proxy 拒絕建立回應狀態為「503 」的通道 |
可能的原因包括 DNS 問題、防火牆限制、後端伺服器的 無法使用,因此無法建立通道 |
Proxy 拒絕建立回應狀態為 504 的通道 |
如果在建立通道時發生逾時,就可能發生這種情況 |
視 faultstring
中觀察到的狀態碼而定,您必須使用
以適當技巧解決問題。本教戰手冊說明如何排解問題
如果你在 faultstring
中觀察到狀態碼 403
,就會發生這個問題
找出錯誤代碼 protocol.http.ProxyTunnelCreationFailed
可能原因
如有任何防火牆或 ACL (存取) 設定,就會發生這個錯誤 (狀態碼 403
)
控制清單) 在後端伺服器上設定的限制,可防止通道連線
透過 Proxy 伺服器在 Apigee Edge 和後端伺服器之間建立。
原因 | 說明 | 適用的疑難排解操作說明 |
---|---|---|
Proxy 拒絕建立回應狀態為 403 的通道 | Proxy 伺服器收到 Proxy 伺服器主機名稱,因此拒絕建立通道
而非後端伺服器主機名稱的 Host 標頭。 |
僅限 Edge Private Cloud 使用者 |
常見的診斷步驟
請使用下列其中一項工具/技巧診斷這個錯誤:
追蹤工具
如何使用追蹤工具診斷錯誤:
- 啟用追蹤工作階段並
:
- 等待錯誤發生,或
- 如果可以重現問題,請發出 API 呼叫以重現問題
503 Service Unavailable
使用Proxy refused to create tunnel with response status 403
。
確保已啟用「Show all FlowInfos」:
- 請選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的各個階段,找出失敗之處 發生。
這個錯誤通常會在「目標要求流程已開始」階段之後顯示 如下所示:
請注意下列資訊:
錯誤:
Proxy refused to create tunnel with response status 403
- 前往追蹤記錄中的「AX」AX(已記錄 Analytics 資料) 階段,並按一下該階段。
向下捲動至「Phase Details」「Response Headers」區段,然後 確定 X-Apigee-fault-code 和 X-Apigee-fault-source 的值是 如下所示:
( 查看較大的圖片)
( 查看較大的圖片)
您會看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值
protocol.http.ProxyTunnelCreationFailed
和target
不同,表示這項錯誤是因 Proxy 通道而造成 無法建立失敗,因為未收到預期的主機標頭。回應標頭 值 X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
X-Apigee-fault-source target
NGINX
如何使用 NGINX 存取記錄診斷錯誤:
- 如果您是 Private Cloud 使用者,可以使用 NGINX 存取記錄
然後找出 HTTP
503 Service Unavailable
的重要資訊 發生錯誤。 查看 NGINX 存取記錄:
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
其中: ORG、ORG 和 PORT# 會替換為實際值。
- 搜尋是否有任何
503
錯誤和錯誤代碼 在特定時間範圍內protocol.http.ProxyTunnelCreationFailed
(如果 發生錯誤) 或出現任何要求失敗時503
。 如果發現任何
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 的通道
診斷
- 使用追蹤工具或 NGINX 存取記錄檔,判斷
503 Service Unavailable
的「錯誤程式碼」和「錯誤來源」,詳情請參閱相關說明: 常見的診斷步驟。 - 查看錯誤訊息,並判斷狀態碼
會在
faultstring
中指示失敗。 - 在此情況下,狀態碼為
403
,表示「已禁止」。 - 這代表您沒有建立通道的權限或權限。這麼做 發生這種情況,通常是因為系統設下任何防火牆或 ACL (存取控制清單) 限制 可防止建立通道
- 檢查後端伺服器上設定的所有防火牆和/或 ACL 限制 則可防止建立通道
- 視防火牆和/或 ACL 限制類型而定,你必須修正問題 才是正確的做法
讓我們舉例說明防火牆限制的疑難排解和解決方式 問題:
情境:後端伺服器的防火牆限制預期主機標頭應一律 包含後端伺服器主機名稱
您可以使用下列其中一種方式決定 Apigee Edge 傳遞的主機標頭:
Trace
如何使用 Trace 決定主機標頭:
- 確認
faultstring
包含Proxy refused to create tunnel with response status 403
使用追蹤記錄,詳情如下: 常見的診斷步驟。 - 前往「目標要求流程已開始」 階段,然後查看 要求標頭
- 確認 「Request Headers」部分。
- 如果「主機」標頭包含「Proxy 主機名稱」,則以下為 發生這項錯誤的原因。
- 這是因為後端伺服器上的防火牆設定為接受 要求。
- 當 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 判斷主機標頭
在 Proxy 伺服器上擷取來自
tcpdump
的要求 Apigee Edge 的訊息處理器元件,包含下列指令:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
如要進一步瞭解如何使用
tcpdump
指令,請參閱 tcpdump.- 使用以下程式碼分析「
tcpdump
」資料: Wireshark 工具或類似的程式碼 如果偏好在終端機視窗中工作 可使用 Google Cloud CLI gcloud 指令列工具 對於 tcpdump 會使用 Wireshark:
( 查看較大的圖片)
- 封包編號 13、14 和 15 會顯示訊息 處理器正在透過三向 TCP 建立連至 Proxy 伺服器的連線 握手程序
- 在封包 16 中,訊息處理器已連線至 Proxy 主機
httpbin.org
(如上例所示)。 選取封包 16,詳細檢查封包內容,並 明確指出「訊息」傳遞至 Proxy 伺服器的「主機標頭」 處理器。
- 上述範例顯示「Host Header」圖示
httpin.org
是 Proxy 伺服器的主機名稱因此,當 Proxy 伺服器嘗試 透過傳遞上述的「Host Header」(主機標頭),透過後端伺服器建立通道httpin.org
,執行失敗並傳回錯誤Proxy refused to create tunnel with response status 403
。
- 確認
解析度
情境:Proxy 伺服器的防火牆限制預期主機標頭 一律包含後端伺服器主機名稱
假如您確定這個錯誤是由後端伺服器 的防火牆造成, 設定讓 Host Header 一律包含「後端」伺服器 主機名稱,而訊息處理器正在傳送 Proxy 伺服器主機名稱,則執行 請按照下列步驟解決問題:
將
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>
請確認與以下項目相關的其他屬性: 轉寄 Proxy「訊息處理器」的設定如下:
- 查看每個訊息處理器上的
/opt/apigee/customer/application/message-processor.properties
檔案。 確認您已根據您的用途或需求設定下列屬性:
屬性範例值:
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
其中: ORG、ENV 和 PORT# 會替換為實際值。
訊息處理器系統記錄
/opt/apigee/var/log/edge-message-processor/logs/system.log