您正在查看 Apigee Edge 說明文件。
前往 Apigee X 說明文件。info
問題
用戶端應用程式收到 502 Bad Gateway 錯誤。當訊息處理工具未收到來自後端伺服器的回應時,就會將此錯誤傳回給用戶端應用程式。
錯誤訊息
用戶端應用程式會收到下列回應代碼:
HTTP/1.1 502 Bad Gateway
此外,您也可能會看到下列錯誤訊息:
{
"fault": {
"faultstring":"Bad Gateway",
"detail":{
"errorcode":"messaging.adaptors.http.flow.BadGateway"
}
}
}
可能原因
下表列出這個問題的可能原因:
原因 | 說明 | 疑難排解步驟如下: |
TLS/SSL 握手逾時 | 在郵件處理器和後端伺服器之間的 TLS/SSL 交握期間發生逾時。 | 邊緣私人與公有雲使用者 |
原因:TLS/SSL 握手逾時
在 Apigee Edge 中,您可以設定與後端伺服器的 TLS/SSL 連線,以便在 Edge 訊息處理器和後端伺服器之間啟用 TLS 通訊。
TLS/SSL 握手程序包含多個步驟。這個錯誤通常是因為訊息處理器與後端伺服器之間的 TLS/SSL 握手逾時。
診斷
本節說明如何正確診斷 TLS/SSL 握手逾時問題。列出 Edge Private Cloud 和 Public Cloud 的操作說明。
調查追蹤工作階段輸出內容
以下步驟說明如何使用 Apigee Edge Trace 工具對問題進行初步診斷。
- 在 Edge UI 中,為受影響的 API Proxy 啟用「Trace session」。
如果失敗的 API 要求追蹤記錄顯示下列內容,則很可能是發生 TLS/SSL 握手逾時錯誤。這項錯誤的可能原因是後端伺服器防火牆封鎖了 Apigee 的流量。
- 判斷是否在 55 秒後發生 502 Bad Gateway 錯誤,這是訊息處理器設定的預設逾時時間。如果您發現錯誤發生在 55 秒後,表示問題可能出在逾時。
- 判斷錯誤是否顯示錯誤:messaging.adaptors.http.BadGateway。這項錯誤通常表示發生逾時。
如果您使用的是 Edge Private Cloud,請記下追蹤記錄輸出內容中 X-Apigee.Message-ID 欄位的值,如下所示。Private Cloud 使用者可以使用這個 ID 值,進行進一步的疑難排解作業,詳情請參閱後續說明。
按一下追蹤路徑中的「Analytics Data Recorded」圖示:
向下捲動畫面,並記下「X-Apigee.Message-ID」欄位的值。
請根據您使用的是公用雲端或私有雲,按照下列各節的步驟操作,確認發生錯誤的原因就是 TLS/SSL 握手逾時。
僅適用於 Edge Private Cloud 使用者的額外診斷步驟
如果您使用的是 Apigee Edge Private Cloud,可以執行下列步驟,確認握手錯誤的原因。在這個步驟中,您會檢查訊息處理工具記錄檔,找出相關資訊。如果您使用的是 Edge Public Cloud,可以略過本節,直接參閱「私有雲和公有雲使用者的其他診斷步驟」。
使用
telnet
指令,檢查是否能直接從每個訊息處理器直接連線至特定後端伺服器:如果後端伺服器解析為單一 IP 位址,請使用以下指令:
telnet BackendServer-IPaddress 443
如果後端伺服器解析為多個 IP 位址,請在 telnet 指令中使用後端伺服器的主機名稱,如下所示:
telnet BackendServer-HostName 443
如果您可以連線至後端伺服器,且沒有任何錯誤,請繼續進行下一個步驟。
如果
telnet
指令失敗,您必須與網路團隊合作,檢查訊息處理器與後端伺服器之間的連線。請檢查訊息處理工具記錄檔,看看是否有握手失敗的證據。開啟檔案:
/opt/apigee/var/log/edge-message-processor/system.log
並搜尋專屬郵件 ID (您在追蹤記錄檔中找到的 X-Apigee.Message-ID 值)。判斷是否顯示與訊息 ID 相關的握手錯誤訊息,如下所示:
org:xxx env:xxx api:xxx rev:x messageid:<MESSAGE_ID> NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context.handshakeTimeout() : SSLClientChannel[Connected: Remote:X.X.X.X:443 Local:X.X.X.X]@739028 useCount=1 bytesRead=0 bytesWritten=0 age=55221ms lastIO=55221ms isOpen=true handshake timeout
如果在訊息處理程式的記錄檔中看到這則錯誤訊息,請繼續進行進一步調查。請參閱「Edge Private 和 Public Cloud 使用者的其他診斷步驟」。
如果記錄檔中沒有握手訊息,請前往「Must Gather Diagnostic Information」。
Edge 私人及公有雲使用者的進一步診斷步驟
如要進一步找出問題,您可以使用 tcpdump 工具分析 TCP/IP 封包,確認是否在 TLS/SSL 握手期間發生逾時情形。
- 如果您是 Private Cloud 使用者,可在後端伺服器或訊息處理器擷取 TCP/IP 封包。建議您在後端伺服器上擷取這些資料,因為封包會在後端伺服器上解密。
- 如果您是 公用雲端使用者,就無法存取訊息處理器;不過,擷取後端伺服器上的 TCP/IP 封包可能有助於找出問題。
決定擷取 TCP/IP 封包的位置後,請使用下列 tcpdump 指令擷取 TCP/IP 封包。
tcpdump -i any -s 0 host <IP address> -w <File name>
使用 Wireshark 工具或類似工具分析 TCP/IP 封包。下圖顯示 Wireshark 中的 TCP/IP 封包。
請注意,在 Wireshark 輸出內容中,三向 TCP 交握會在前 3 個封包中成功完成。
訊息處理器隨後會在封包 #4 中傳送「Client Hello」訊息。
由於後端伺服器沒有傳送確認訊息,因此訊息處理器會在等待預先定義的時間間隔後,在封包 5、6 和 7 中多次重傳「Client Hello」訊息。
如果訊息處理工具在 3 次重試後未收到任何確認訊息,就會將 FIN、ACK 訊息傳送至後端伺服器,表示要關閉連線。
如 Wireshark 工作階段範例所示,連線至後端成功 (步驟 1),但 SSL 握手逾時,因為後端伺服器從未回應。
如果您已執行本手冊中的疑難排解步驟,並判斷超時導致 TLS/SSL 握手錯誤,請參閱「解決方法」一節。
使用 API Monitoring 找出問題
API 監控功能可讓您快速找出問題所在,診斷錯誤、效能和延遲時間問題及其來源,例如開發人員應用程式、API Proxy、後端目標或 API 平台。
逐步完成範例情境,瞭解如何使用 API 監控功能,排解 API 的 5xx 問題。舉例來說,您可以設定快訊,在 messaging.adaptors.http.BadGateway 錯誤數量超過特定門檻時收到通知。
解析度
一般來說,由於後端伺服器對來自 Apigee Edge 的流量設有防火牆限制,導致 SSL 握手逾時。如果您按照診斷步驟操作,並判斷握手錯誤的原因是逾時,就必須與網路團隊聯絡,找出原因並修正防火牆限制。
請注意,防火牆限制可能會在不同的網路層設定。 請務必移除所有網路層級的限制,以便確保 Apigee Edge 與後端伺服器之間的流量順暢。
如果沒有防火牆限制,且/或問題仍未解決,請參閱「必須收集診斷資訊」一節。
必須收集診斷資訊
如果問題仍未解決,請收集下列診斷資訊。請與 Apigee Edge 支援團隊聯絡,並提供以下資訊:
- 如果您是公用雲端使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 完成 curl 指令即可重現錯誤
- 顯示錯誤的追蹤記錄檔
- 在後端伺服器上擷取的 TCP/IP 封包
- 如果您是 Private Cloud 使用者,請提供下列資訊:
- 觀察到完整的錯誤訊息
- API Proxy 套件
- 顯示錯誤的追蹤記錄檔
- 訊息處理器記錄檔 /opt/apigee/var/log/edge-message-processor/logs/system.log
- 在後端伺服器或訊息處理器上擷取的 TCP/IP 封包。
- 詳細說明您嘗試過這份應對手冊的哪些部分,以及任何有助於我們快速解決問題的深入分析。