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 錯誤閘道錯誤的可能原因:

原因 說明 疑難排解操作說明
集區中沒有可播放的 MP 如果集區中的所有 MP 都無法使用,也就是伺服器處於當機或忙碌狀態,導致無回應時,系統就會觀察到這個錯誤。 Edge Private Cloud 使用者
路由器和 MP 之間的 SSL 設定不正確 如果 Edge 路由器的信任存放區缺少用戶端的 CA 簽署的根憑證,就會發生這個錯誤。 Edge Private Cloud 使用者
後端伺服器發生錯誤 如果後端伺服器失敗並傳送此回應,將會發現這個錯誤。 Edge 公有雲和私有雲使用者

原因:集區中沒有可播放的百萬像素

如果路由器發現特定區域/資料中心中的所有訊息處理器無法使用 (例如所有訊息處理器都無法使用),就會發生這個錯誤。

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. 如果所有訊息處理器都停止運作,請重新啟動這些訊息。

解析度

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

/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 設定時未重新啟動路由器。在此情境下,您可以發現訊息處理器的通訊埠號碼仍保留在設定檔中。

解析度

  1. 確認已正確遵循「在路由器和訊息處理器之間設定 TLS」一文中提供的所有步驟。
  2. 如果問題仍未解決,請前往「收集診斷資訊」頁面。

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

診斷

  1. 如果每次發生錯誤,您可以擷取失敗要求的 UI 追蹤記錄。請選取失敗的要求,並瀏覽追蹤記錄的各個階段。如果您發現後端伺服器本身顯示「502 錯誤閘道」,可能是因為後端伺服器曾發生某些故障。
    追蹤記錄顯示來自後端伺服器的 502 錯誤閘道
  2. 如果問題持續發生,而且無法擷取追蹤記錄,請
    1. 如果您是公用雲端使用者,可以使用 API Monitoring 查看 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)。