您正在查看 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 Gateway 錯誤:
原因 | 說明 | 適用的疑難排解操作說明 |
集區中沒有可用的 MP | 如果集區中的所有 MP 都無法使用,也就是這些 MP 處於當機或忙碌狀態,且沒有回應,就會觀察到這個錯誤。 | Edge Private Cloud 使用者 |
路由器和 MP 之間的 SSL 設定不正確 | 如果 Edge 路由器的信任儲存庫中缺少用戶端的 CA 簽署根憑證,就會發生這個錯誤。 | Edge Private Cloud 使用者 |
後端伺服器發生錯誤 | 如果後端伺服器故障並傳送此回應,系統就會觀察到這個錯誤。 | Edge 公開與私有雲使用者 |
原因:泳池中沒有可用的 MP
如果路由器發現特定區域/資料中心中的所有訊息處理器均無法使用 (例如全部中斷),就會發生這個錯誤。
Apigee Edge 的設定方式是,特定區域/資料中心內的傳入 API 流量 (要求) 一律會從相同區域/資料中心的路由器,從路由器轉送至訊息處理器 (MP)。在某些情況下,Apigee Edge 元件可能只在一個區域/資料中心中設定,在某些情況下,這些元件可能會設定在多個區域/資料中心內。每個區域/資料中心都會設定兩個以上的路由器和訊息處理器。
診斷
- 如果有多個區域/資料中心,找出 API 要求失敗的區域/資料中心,並顯示 502 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,而非 8443。
conf/message-processor-communication.properties+local.http.port=8998
- 「
/opt/nginx/conf.d/*
」目錄中的路由器設定檔不會刪除,且路由器在執行 SSL 設定時未重新啟動。在這種情況下,您可以注意到訊息處理器的通訊埠編號在 8998 中維持在 8998。
- 在
解析度
- 確認「設定路由器與訊息處理器之間的 TLS」一文提供的所有步驟均已正確執行。
- 如果問題仍未解決,請參閱「收集診斷資訊」。
原因:後端伺服器發生錯誤
診斷
- 如果每次發生錯誤,您可以擷取失敗要求的 UI 追蹤記錄。選取失敗的要求,然後瀏覽追蹤記錄的各個階段。如果你發現後端伺服器本身顯示「502 Bad Gateway」,可能是後端伺服器發生某些故障所致。
顯示 502 個錯誤閘道來自後端伺服器的追蹤記錄
- 如果問題間歇發生,而且您無法擷取追蹤記錄,請
- 如果您是公有雲使用者,可以使用 API 監控功能並查看 502 錯誤的詳細資料。
- 如果您發現錯誤程式碼為
messaging.adaptors.http.flow.ErrorResponseCode
,且錯誤來源為target
,則該錯誤是由後端伺服器造成。
- 如果您發現錯誤程式碼為
- 如果您是私有 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
)。