502 閘道錯誤

您正在查看 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 元件可能只在一個區域/資料中心中設定,在某些情況下,這些元件可能會設定在多個區域/資料中心內。每個區域/資料中心都會設定兩個以上的路由器和訊息處理器。

診斷

  1. 如果有多個區域/資料中心,找出 API 要求失敗的區域/資料中心,並顯示 502 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. 如果所有訊息處理器都停止運作,請重新啟動。

解析度

使用下列指令重新啟動所有訊息處理器:

/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 中維持在 8998。

解析度

  1. 確認「設定路由器與訊息處理器之間的 TLS」一文提供的所有步驟均已正確執行。
  2. 如果問題仍未解決,請參閱「收集診斷資訊」。

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

診斷

  1. 如果每次發生錯誤,您可以擷取失敗要求的 UI 追蹤記錄。選取失敗的要求,然後瀏覽追蹤記錄的各個階段。如果你發現後端伺服器本身顯示「502 Bad Gateway」,可能是後端伺服器發生某些故障所致。
    顯示 502 個錯誤閘道來自後端伺服器的追蹤記錄
  2. 如果問題間歇發生,而且您無法擷取追蹤記錄,請
    1. 如果您是公有雲使用者,可以使用 API 監控功能並查看 502 錯誤的詳細資料。
      1. 如果您發現錯誤程式碼為 messaging.adaptors.http.flow.ErrorResponseCode,且錯誤來源為 target,則該錯誤是由後端伺服器造成。
    2. 如果您是私有 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)。