您正在查看 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 」的通道 |
這可能是因為後端伺服器設定了防火牆或 ACL 限制,導致無法建立通道。 |
Proxy 拒絕建立回應狀態為「503 」的通道 |
可能的原因包括 DNS 問題、防火牆限制、後端伺服器無法使用,導致無法建立通道 |
Proxy 拒絕建立回應狀態為 504 的通道 |
如果通道建立期間發生逾時,就可能發生這種情況 |
根據在 faultstring
中觀察的狀態碼,您必須採用適當的技巧才能排解問題。如果在 faultstring
中觀察 faultstring
錯誤代碼 protocol.http.ProxyTunnelCreationFailed
的狀態碼 403
,本教戰手冊說明如何排解問題。
可能原因
如果後端伺服器上設定了任何防火牆或 ACL (存取控制清單) 限制,導致 Proxy 伺服器無法在 Apigee Edge 和後端伺服器之間建立通道,就會發生這個錯誤 (狀態碼 403
)。
原因 | 說明 | 適用的疑難排解指示 |
---|---|---|
Proxy 拒絕建立回應狀態為 403 的通道 | Proxy 伺服器會收到 Proxy 伺服器主機名稱 (而非 Host 標頭中的後端伺服器主機名稱) 時,拒絕建立通道。 |
僅限 Edge Private Cloud 使用者 |
常見診斷步驟
請使用下列其中一種工具/技巧診斷這項錯誤:
追蹤工具
如何使用追蹤工具診斷錯誤:
- 啟用追蹤工作階段,並採取下列任一做法:
- 等待錯誤發生,或
- 如果可以重現問題,請透過 API 呼叫透過
Proxy refused to create tunnel with response status 403
重現問題。503 Service Unavailable
確保已啟用「Show all FlowInfos」:
- 請選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的不同階段,找出發生錯誤的位置。
一般而言,您會在「目標要求流程」開始階段之後看到錯誤,如下所示:
請注意下列資訊:
錯誤:
Proxy refused to create tunnel with response status 403
- 前往追蹤記錄中的「AX」(Analytics (分析) 已記錄) 階段,然後按一下該階段。
向下捲動至「階段詳細資料」的「回應標頭」區段,確定 X-Apigee-fault-code 和 X-Apigee-fault-source 的值,如下所示:
( 查看較大圖片)。
( 查看較大圖片)。
您將分別看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值為
protocol.http.ProxyTunnelCreationFailed
和target
,表示這項錯誤是因為未收到預期的主機標頭而造成這項錯誤所致。回應標頭 值 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
錯誤代碼503
與錯誤代碼protocol.http.ProxyTunnelCreationFailed
。 如果發現 X-Apigee-fault-code 與 X-Apigee-fault-code 值相符的任何
503
錯誤,請判斷 X-Apigee-fault-code 的值。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 判斷主機標頭:
- 按照常見診斷步驟說明,確認
faultstring
包含Proxy refused to create tunnel with response status 403
。 - 前往「已開始目標要求流程」階段並查看「要求標頭」
- 驗證「Request Headers」區段中的主機名稱值。
- 如果「Host」標頭包含 Proxy 主機名稱,這就是這個錯誤的原因。
- 這是因為只有在「主機標頭」包含後端伺服器的名稱時,後端伺服器才能將防火牆設為接受要求。
- 因此,當 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 決定主機標頭
使用下列指令,在 Proxy 伺服器上針對 Apigee Edge 訊息處理器元件發出的要求擷取
tcpdump
:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
如要進一步瞭解如何使用
tcpdump
指令,請參閱 tcpdump。- 使用 Wireshark 工具或類似工具分析
tcpdump
資料。 以下是使用 Wireshark 處理 tcpdump 的範例:
( 查看較大圖片)。
- 封包編號 13、14 和 15 顯示訊息處理者透過三向 TCP 握手程序,與 Proxy 伺服器建立連線。
- 在封包 16 中,訊息處理器已連線至 Proxy 主機
httpbin.org
(如上例所示)。 選取封包「16」16並檢查封包內容的詳細資料,特別是訊息處理器傳遞給 Proxy 伺服器的16。
- 上方範例顯示「Host Header」圖示
httpin.org
,這是 Proxy 伺服器的主機名稱。因此,當 Proxy 伺服器嘗試傳遞上述「Host Header」圖示httpin.org
時,嘗試建立具有後端伺服器的通道,就會失敗,並發生Proxy refused to create tunnel with response status 403
錯誤。
- 按照常見診斷步驟說明,確認
解析度
情境:Proxy 伺服器的防火牆限制預期主機標頭一律須包含後端伺服器主機名稱
如果您確定這項錯誤是因為後端伺服器的防火牆設定成「主機標頭」應一律包含「後端」backend伺服器主機名稱,而訊息處理器正在傳送「Proxy 伺服器」backend主機名稱,請按照下列步驟解決問題:
如以下範例所示,將 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>
請確定已在訊息處理器上設定與 轉送 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