502 閘道錯誤

您目前查看的是 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 元件可能只在一個區域/資料中心設定,有時則可能在多個區域/資料中心設定。每個區域/資料中心都會設定兩個以上的路由器和訊息處理器。

診斷

  1. 如果有多個區域/資料中心,請找出 API 要求發生 502 Bad Gateway 錯誤的區域/資料中心。您可以找出使用者發生 502 錯誤的區域,或檢查不同區域中各個路由器 /opt/apigee/var/log/edge-router/nginx/ 目錄的 NGINX 存取記錄,藉此判斷問題。
  2. 您會在 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:所有訊息處理器都已停止運作

  1. 檢查特定區域/資料中心的訊息處理器是否正常運作。
  2. 如果所有 Message Processor 都已停止運作,請重新啟動。

解析度

使用下列指令重新啟動所有 Message Processor:

/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart

情境 2:所有訊息處理器都忙於處理進行中的要求

如果路由器發現特定區域/資料中心的所有訊息處理器都忙於處理進行中的要求,就會發生這個錯誤。

  1. 檢查特定區域/資料中心的訊息處理器是否正常運作。
  2. 如果所有訊息處理器都已啟動並處於活動狀態,請檢查訊息處理器的 CPU 用量是否偏高,然後使用下列指令每 30 秒產生三個執行緒傾印:
    <JAVA_HOME>/bin/jstack -l <pid> > <filename>
  3. 如果訊息處理器記憶體用量偏高,請使用下列指令產生記憶體快照資料:
    sudo -u apigee /bin/jmap -dump:live,format=b,file= 
  4. 使用下列指令重新啟動訊息處理器。這應該會降低 CPU 和記憶體用量:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
  5. 監控 API 呼叫,確認問題是否仍存在。
  6. 請與 Apigee 支援團隊聯絡,並提供執行緒傾印、記憶體快照資料和訊息處理器記錄 (/opt/apigee/var/log/edge-message-processor/logs/system.log),協助調查 CPU/記憶體用量過高的原因。

原因:路由器和 MP 之間的 SSL 設定有誤

診斷

  1. 檢查 NGINX 存取記錄 (/opt/apigee/var/log/edge-router/nginx/ORG-Env._access_log)。您會看到 502 回應,如下所示:
        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	-
  2. 檢查 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>"
  3. 這表示路由器和訊息處理器之間的 SSL 握手失敗。
  4. 如果您仔細查看步驟 1 和 2 中的錯誤訊息,會發現用於與訊息處理器通訊的通訊埠編號為 8998,這是非安全通訊埠,但通訊協定為 SSL (https)。通常使用的安全通訊埠號碼為 8443。由於安全通訊使用不安全的通訊埠,因此導致 SSL 握手失敗。
  5. 如果您在設定路由器和訊息處理器之間的 SSL 時,遺漏任何步驟或設定錯誤的值,通常就會發生這種情況。請參閱這篇文章中的步驟。
    舉例來說,如果
    1. /opt/apigee/customer/application/message-processor.properties as shown below
      中,通訊埠編號指定為 8998,而非 8443。
              conf/message-processor-communication.properties+local.http.port=8998
    2. 目錄 /opt/nginx/conf.d/* 下的路由器設定檔不會遭到刪除,且路由器在進行 SSL 設定時不會重新啟動。在這種情況下,您會發現設定檔中訊息處理器的通訊埠號碼仍為 8998。

解析度

  1. 請確認已正確按照「在路由器和訊息處理器之間設定 TLS」一文中的所有步驟操作。
  2. 如果問題仍未解決,請參閱「收集診斷資訊」。

原因:後端伺服器發生錯誤

診斷

  1. 如果每次都會發生錯誤,您可以擷取失敗要求的 UI 追蹤記錄。選取失敗的要求,並在追蹤記錄中瀏覽各個階段。如果發現後端伺服器本身傳回「502 Bad Gateway」,問題可能是後端伺服器發生故障。
    追蹤記錄顯示後端伺服器傳回 502 Bad Gateway 錯誤
  2. 如果問題斷斷續續發生,且您無法擷取追蹤記錄,請
    1. 如果您是公有雲使用者,可以透過 API 監控功能,查看 502 錯誤的詳細資料。
      1. 如果發現錯誤代碼為 messaging.adaptors.http.flow.ErrorResponseCode,錯誤來源為 target,則表示錯誤是由後端伺服器所致。
    2. 如果您是 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
      1. 如果發現錯誤代碼為 messaging.adaptors.http.flow.ErrorResponseCode,錯誤來源為 target,則表示錯誤是由後端伺服器所致。

解析度

  1. 請與後端伺服器團隊合作,修正後端中的這個問題。

收集診斷資訊

  1. NGINX 存取記錄
    (/opt/apigee/var/log/edge-router/nginx/ORG-Env._access_log)
    和錯誤記錄
    (/opt/apigee/var/log/edge-router/nginx/ORG-Env._error_log)。
  2. 訊息處理器記錄
    (/opt/apigee/var/log/edge-message-processor/logs/system.log)。