查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
問題
用戶端應用程式會收到 HTTP 狀態碼 502,錯誤訊息 「Bad Gateway」是 API 呼叫的回應。
HTTP 狀態碼 502 表示用戶端並未收到 應實際執行要求的後端伺服器
錯誤訊息
用戶端應用程式會取得下列回應代碼:
HTTP/1.1 502 Bad Gateway
此外,您也可能會看到下列錯誤訊息:
<html> <head> <title>Error</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>An error occurred.</h1> <p>Sorry, the page you are looking for is currently unavailable.<br/> Please try again later.</p> </body> </html>
如果錯誤來自後端伺服器,您可能會看到類似畫面。後端的錯誤訊息完全取決於實作內容。
<html> <head><title>502 Bad Gateway</title></head> <body bgcolor="white"> <center><h1>502 Bad Gateway</h1></center> </body> </html>
可能原因
以下是透過 Apigee Edge 執行 API 時發生 502 錯誤閘道錯誤的可能原因:
原因 | 說明 | 疑難排解操作說明 |
集區中沒有可播放的 MP | 如果集區中的所有 MP 都無法使用,也就是伺服器處於當機或忙碌狀態,導致無回應時,系統就會觀察到這個錯誤。 | Edge Private Cloud 使用者 |
路由器和 MP 之間的 SSL 設定不正確 | 如果 Edge 路由器的信任存放區缺少用戶端的 CA 簽署的根憑證,就會發生這個錯誤。 | Edge Private Cloud 使用者 |
後端伺服器發生錯誤 | 如果後端伺服器失敗並傳送此回應,將會發現這個錯誤。 | Edge 公有雲和私有雲使用者 |
原因:集區中沒有可播放的百萬像素
如果路由器發現特定區域/資料中心中的所有訊息處理器無法使用 (例如所有訊息處理器都無法使用),就會發生這個錯誤。
Apigee Edge 的設定方式,會讓特定區域/資料中心內的傳入 API 流量 (要求) 一律從路由器轉送至同一區域/資料中心的訊息處理器 (MP)。在某些情況下,Apigee Edge 元件可能只在一個區域/資料中心內設定,在某些情況下,也會在多個區域/資料中心內進行設定。每個區域/資料中心會設定兩個以上的路由器和訊息處理器。
診斷
- 找出 API 要求失敗 (如有多個區域/資料中心) 發生 502 Bad Gateway 錯誤的區域/資料中心。如要找出這個問題,您可以找出使用者觀察到的 502 錯誤區域,或在屬於不同區域的每個路由器上,前往
/opt/apigee/var/log/edge-router/nginx/
目錄檢查 NGINX 存取記錄。 - 您會在 NGINX 錯誤記錄檔 (
/opt/apigee/var/log/edge-router/nginx/ORG-Env.
)_error_log
中看到以下錯誤2019/06/24 15:26:00 [error] 4796#4796: *56357443 no live upstreams while connecting to upstream, client: <Router_IP_address>, server: <HostAlias>, request: "PUT <BasePath> HTTP/1.1", upstream: "http://<ListOfMP-IP_R-MP-Port>/<BasePath>", host: "<HostAlias>"
情境 1:所有訊息處理器都停止運作
- 確認特定區域/資料中心的訊息處理器是否能正常執行。
- 如果所有訊息處理器都停止運作,請重新啟動這些訊息。
解析度
使用下列指令重新啟動所有訊息處理器:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
情境 2:所有訊息處理器都忙於處理進行中的要求
如果路由器發現指定區域/資料中心中的所有訊息處理器全部無法使用,因為這些訊息處理器都在處理中,就會發生這個錯誤。
- 確認特定區域/資料中心的訊息處理器是否能正常執行。
- 如果所有訊息處理器均啟動且處於啟用狀態,請檢查訊息處理器的 CPU 用量是否過高,然後使用下列指令每 30 秒產生三個執行緒傾印檔:
<JAVA_HOME>/bin/jstack -l <pid> > <filename>
- 如果訊息處理器的記憶體用量過高,請使用下列指令產生記憶體快照資料:
sudo -u apigee
/bin/jmap -dump:live,format=b,file= - 使用下列指令重新啟動訊息處理器。這樣應該就會降低 CPU 和記憶體:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- 監控 API 呼叫,確認問題是否仍未解決。
- 請與 Apigee 支援團隊聯絡,並提供執行緒傾印、記憶體快照資料和訊息處理器記錄檔 (
/opt/apigee/var/log/edge-message-processor/logs/system.log
),協助調查 CPU/記憶體用量偏高的原因。
原因:路由器和 MP 之間的 SSL 設定不正確
診斷
- 查看 NGINX 存取記錄 (
/opt/apigee/var/log/edge-router/nginx/ORG-Env.
)。畫面上會顯示 502 回應,如下所示:_access_log
2019-07-23T12:13:42+03:00 sc-10-254-226-23 10.X.X.X:53634 10.X.X.X:8998 0.000 - - 502 502 189 344 GET <path> curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2 <host alias> mp-10-254-226-23-23706-8552529-1 10.129.107.101 - - -1 - - dc-2 gateway-2 green - gateway-2 dc-2 op pilot http -
- 查看 NGINX 錯誤記錄檔 (
/opt/apigee/var/log/edge-router/nginx/ORG-Env.
)。您會看到類似下方的錯誤:_error_log
2019/07/30 17:02:24 [error] 7691#7691: *11753633 peer closed connection in SSL handshake while SSL handshaking to upstream, client: X.X.X.X, server: <HostAlias>, request: "GET /no-target HTTP/1.1", upstream: "https://X.X.X.X:8998/no-target", host: "<HostAlias>"
- 這表示「路由器」和「訊息處理器」之間的 SSL 交握會失敗。
- 如果在步驟 1 和 #2 中發現錯誤訊息,代表用於與「訊息處理器」的通訊埠編號為 8998,雖然是不安全的通訊埠,但通訊協定為 SSL (https)。通常使用的安全連接埠號碼為 8443。因為使用不安全的連接埠進行安全通訊,所以會導致 SSL 握手失敗。
- 設定路由器和訊息處理器之間的安全資料傳輸層 (SSL) 時,如果您漏掉任何步驟,或是設定了不正確的值,通常就會發生這種情況。請參閱這裡列出的步驟。
舉例來說,如果
- 在
/opt/apigee/customer/application/message-processor.properties as shown below
中,通訊埠 # 指定為 8998,而非 8443conf/message-processor-communication.properties+local.http.port=8998
- 目錄
/opt/nginx/conf.d/*
下的路由器設定檔並未刪除,而且在執行 SSL 設定時未重新啟動路由器。在此情境下,您可以發現訊息處理器的通訊埠號碼仍保留在設定檔中。
- 在
解析度
- 確認已正確遵循「在路由器和訊息處理器之間設定 TLS」一文中提供的所有步驟。
- 如果問題仍未解決,請前往「收集診斷資訊」頁面。
原因:後端伺服器發生錯誤
診斷
- 如果每次發生錯誤,您可以擷取失敗要求的 UI 追蹤記錄。請選取失敗的要求,並瀏覽追蹤記錄的各個階段。如果您發現後端伺服器本身顯示「502 錯誤閘道」,可能是因為後端伺服器曾發生某些故障。
追蹤記錄顯示來自後端伺服器的 502 錯誤閘道
- 如果問題持續發生,而且無法擷取追蹤記錄,請
- 如果您是公用雲端使用者,可以使用 API Monitoring 查看 502 錯誤的詳細資料。
- 如果發現錯誤程式碼為
messaging.adaptors.http.flow.ErrorResponseCode
,且錯誤來源為target
,表示錯誤是由後端伺服器造成。
- 如果發現錯誤程式碼為
- 如果您是 Private Cloud 使用者,可以分析 NGINX 存取記錄檔「
」/opt/apigee/var/log/edge-router/nginx/ORG-Env.
_access_log.
您會看到失敗要求的項目,如下所示:
2017-02-24T14:42:12+00:00 rt-01 192.8.155.2:18118 192.168.84.166:8998 10.225 - - 502 502 440 0 GET /adv-eadlg-test/documents?type=doctype HTTP/1.1 rt-02efawae234-1234 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 myorg-dev.apigee.net rt-02efawae234-1234 6 - false target messaging.adaptors.http.flow.ErrorResponseCode null/null - /organizations/myorg/environments/dev/apiproxies/api123
- 如果發現錯誤程式碼為
messaging.adaptors.http.flow.ErrorResponseCode
,且錯誤來源為target
,表示錯誤是由後端伺服器造成。
- 如果發現錯誤程式碼為
- 如果您是公用雲端使用者,可以使用 API Monitoring 查看 502 錯誤的詳細資料。
解析度
- 請與後端伺服器團隊合作,在後端修正這個問題。
收集診斷資訊
- NGINX 存取記錄
(/opt/apigee/var/log/edge-router/nginx/ORG-Env.
)_access_log
和錯誤記錄檔
(/opt/apigee/var/log/edge-router/nginx/ORG-Env.
)。_error_log - 訊息處理器記錄
(/opt/apigee/var/log/edge-message-processor/logs/system.log
)。