您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
問題
用戶端應用程式會收到 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 Bad Gateway 錯誤的原因:
| 原因 | 說明 | 適用於以下裝置的疑難排解說明 |
| 集區中沒有可用的 MP | 如果集區中的所有 MP 都無法使用 (也就是關閉或忙碌,因此沒有回應),就會發生這個錯誤。 | Edge Private Cloud 使用者 |
| 路由器和訊息處理器之間的 SSL 設定有誤 | 如果 Edge 路由器的信任儲存庫中缺少用戶端的 CA 簽署根憑證,就會發生這項錯誤。 | Edge Private Cloud 使用者 |
| 後端伺服器發生錯誤 | 如果後端伺服器發生故障並傳送這項回應,就會出現這項錯誤。 | Edge 公有雲和私有雲使用者 |
原因:集區中沒有可用的 MP
如果路由器發現特定區域/資料中心的所有訊息處理器都無法使用 (例如全部都已關閉),就會發生這個錯誤。
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:所有訊息處理器都已停止運作
- 檢查特定區域/資料中心的訊息處理器是否正常運作。
- 如果所有 Message Processor 都已停止運作,請重新啟動。
解析度
使用下列指令重新啟動所有 Message Processor:
/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,而非 8443。conf/message-processor-communication.properties+local.http.port=8998
- 目錄
/opt/nginx/conf.d/*下的路由器設定檔不會遭到刪除,且路由器在進行 SSL 設定時不會重新啟動。在這種情況下,您會發現設定檔中訊息處理器的通訊埠號碼仍為 8998。
- 在
解析度
- 請確認已正確按照「在路由器和訊息處理器之間設定 TLS」一文中的所有步驟操作。
- 如果問題仍未解決,請參閱「收集診斷資訊」。
原因:後端伺服器發生錯誤
診斷
- 如果每次都會發生錯誤,您可以擷取失敗要求的 UI 追蹤記錄。選取失敗的要求,並在追蹤記錄中瀏覽各個階段。如果發現後端伺服器本身傳回「502 Bad Gateway」,問題可能是後端伺服器發生故障。
追蹤記錄顯示後端伺服器傳回 502 Bad Gateway 錯誤
- 如果問題斷斷續續發生,且您無法擷取追蹤記錄,請
- 如果您是公有雲使用者,可以透過 API 監控功能,查看 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 監控功能,查看 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)。