您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
問題
用戶端應用程式收到 API 要求的逾時錯誤,或要求在 Apigee 上執行時突然終止。
您會在 API Monitoring 中觀察此類 API 要求的狀態碼 499
,以及 NGINX 存取記錄。有時候,您會在 API 數據分析中看到不同的狀態碼,這是因為訊息處理器傳回的狀態碼。
錯誤訊息
用戶端應用程式可能會看到以下錯誤:
curl: (28) Operation timed out after 6001 milliseconds with 0 out of -1 bytes received
用戶端逾時的原因是什麼?
在 Edge 平台上,API 要求的一般路徑為「Client」>「 Router」>「Message Processor」>「Backend Server」,如下圖所示:
Apigee Edge 平台中的路由器和訊息處理器都設定了合適的預設逾時值,確保 API 要求完成時間不會過長。
用戶端逾時
用戶端應用程式可根據需求設定合適的逾時值。
網路瀏覽器和行動應用程式等用戶端都有作業系統定義的逾時。
路由器逾時
路由器上的預設逾時時間為 57 秒。這是指從 Edge 收到 API 要求到傳回回應 (包括後端回應和執行的所有政策) 起,API Proxy 可執行的時間長度上限。您可以按照 設定路由器的 I/O 逾時一文的說明,覆寫路由器和虛擬主機上的預設逾時設定。
訊息處理器發生逾時
「訊息處理器」的預設逾時時間是 55 秒。這是後端伺服器處理要求並回應訊息處理器所需的時間上限。您可以在訊息處理器或 API Proxy 中覆寫預設逾時設定,詳情請參閱 設定訊息處理器的 I/O 逾時設定。
如果用戶端在 API Proxy 逾時之前關閉與路由器的連線,您會看到特定 API 要求的逾時錯誤。系統會在路由器中記錄這類要求的狀態碼 499 Client
Closed Connection
,詳情請參閱 API 監控和 NGINX 存取記錄檔。
可能原因
在 Edge 中,499 Client Closed Connection
錯誤的常見原因為:
原因 | 說明 | 適用的疑難排解指示 |
---|---|---|
用戶端突然關閉連線 | 這可能是因為用戶端在要求完成前因使用者取消要求而關閉連線。 | 公有雲與私有雲使用者 |
用戶端應用程式逾時 | 如果用戶端應用程式在 API Proxy 有時間處理及傳送回應之前逾時,就會發生這種情形。通常發生於用戶端逾時小於路由器逾時的情況。 | 公有雲與私有雲使用者 |
常見診斷步驟
請使用下列其中一種工具/技巧診斷這項錯誤:
- API 監控
- NGINX 存取記錄檔
API Monitoring
如何使用 API Monitoring 診斷錯誤:
- 前往「分析」>「API 監控」>「調查」頁面。
- 請篩選
4xx
個錯誤,並選取時間範圍。 - 依據「Time」繪製「Status Code」。
- 選取含有
499
錯誤的儲存格,如下所示: - 右側窗格會顯示
499
錯誤的相關資訊,如下所示: - 按一下右側窗格中的「查看記錄檔」。
在「Traffic Logs」視窗中,記下部分
499
錯誤的詳細資料:- 要求:提供用來發出呼叫的要求方法和 URI
- 回應 時間:這項資訊會提供要求所經過的總時間。
另外,您也可以使用 API Monitoring GET logs API 取得所有記錄。例如,藉由查詢
org
、env
、timeRange
和status
的記錄,您就可以下載用戶端逾時交易的所有記錄檔。由於 API Monitoring 會針對 HTTP
499
錯誤將 Proxy 設為-
,因此您可以使用 API (記錄 API) 取得虛擬主機與路徑相關聯的 Proxy。例如:
curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https://VIRTUAL_HOST/BASEBATH" -H "Authorization: Bearer $TOKEN"
- 檢查「回應時間」中是否有其他
499
錯誤,然後確認所有499
錯誤的「回應時間」是否一致 (假設為 30 秒)。
NGINX 存取記錄檔
如何使用 NGINX 存取記錄檔診斷錯誤:
- 如果您是 Private Cloud 使用者,即可使用 NGINX 存取記錄檔來判斷 HTTP
499
錯誤的相關重要資訊。 - 查看 NGINX 存取記錄檔:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 搜尋特定時間範圍內是否有任何
499
錯誤 (如果問題過去發生),或是否有任何要求仍失敗並顯示499
。 - 關於部分
499
錯誤,請注意下列資訊:- 總回應時間
- 請求 URI
- 使用者代理程式
範例 499 錯誤 NGINX 存取記錄:
2019-08-23T06:50:07+00:00 rrt-03f69eb1091c4a886-c-sy 50.112.119.65:47756 10.10.53.154:8443 10.001 - - 499 - 422 0 GET /v1/products HTTP/1.1 - okhttp/3.9.1 api.acme.org rrt-03f69eb1091c4a886-c-sy-13001-6496714-1 50.112.119.65 - - - - - - - -1 - - dc-1 router-pod-1 rt-214-190301-0020137-latest-7d 36 TLSv1.2 gateway-1 dc-1 acme prod https -
在這個範例中,您會看到以下資訊:
- 總回應時間:
10.001
秒。這表示用戶端在 10.001 秒後逾時 - 要求:
GET /v1/products
- 主機:
api.acme.org
- 使用者代理程式:
okhttp/3.9.1
- 確認所有
499
錯誤中「總回應時間」和「使用者代理程式」是否一致。
原因:用戶端突然關閉連線
診斷
- 從瀏覽器或行動應用程式中執行的單一頁面應用程式呼叫 API 時,如果使用者突然關閉瀏覽器、前往同一個分頁的其他網頁,或是點選或輕觸 「停止載入」停止載入網頁,瀏覽器就會取消要求。
- 如果發生這種情況,以 HTTP
499
狀態的交易通常會依要求處理時間 (回應時間) 而異。 -
如要判斷原因是否為原因,您可以比較回應時間,並使用 API 監控功能或 NGINX 存取記錄檔,確認每個
499
錯誤是否有此錯誤,相關說明請參閱常見診斷步驟。
解析度
- 這很正常,如果 HTTP
499
錯誤發生次數不多,通常通常不會造成問題。 -
如果在相同網址路徑中經常發生這種情形,可能是因為與該路徑相關聯的特定 Proxy 速度非常緩慢,使用者也就沒有意願等待。
知道哪些 Proxy 可能受到影響後,請利用延遲時間分析資訊主頁,進一步調查導致 Proxy 延遲的原因。
- 在此情況下,請使用「常見診斷步驟」中的步驟找出影響的 Proxy。
- 使用 延遲時間分析資訊主頁來進一步調查導致 Proxy 延遲的原因,並修正問題。
- 如果您發現特定 Proxy 會預期延遲時間,建議您告知使用者這個 Proxy 需要一段時間才能回應。
原因:用戶端應用程式逾時
這可能發生了某些情況。
-
要求在一般運作情況下需要特定時間 (例如 10 秒) 才能完成。然而,用戶端應用程式設定的逾時值有誤 (例如 5 秒),導致用戶端應用程式在 API 要求完成前逾時,進而導致
499
。在這種情況下,我們必須將用戶端逾時設為適當的值。 - 目標伺服器或呼叫的處理時間超出預期。在這種情況下,您必須修正適當的元件,並適當調整逾時值。
- 用戶端不再需要回應,因此取消。這種情況可能會發生在高頻率 API,例如自動完成或短暫輪詢。
診斷
API 監控或 NGINX 存取記錄檔
使用 API 監控或 NGINX 存取記錄檔來診斷錯誤:
- 按照常見診斷步驟的說明,查看 HTTP
499
交易的 API 監控記錄檔或 NGINX 存取記錄檔。 - 判斷所有
499
錯誤的回應時間是否一致。 - 如果是的話,可能是因為特定用戶端應用程式設定了固定逾時。如果 API Proxy 或目標伺服器的回應速度緩慢,用戶端會在 Proxy 逾時前逾時,導致同一個 URI 路徑出現大量 HTTP
499s
。在此情況下,請從 NGINX 存取記錄找出使用者代理程式,藉此判斷特定的用戶端應用程式。 - Apigee 前面也有負載平衡器,例如 Akamai、F5、AWS ELB 等。如果 Apigee 在自訂負載平衡器的背後執行,負載平衡器的要求逾時時間必須設為超過 Apigee API 逾時時間。根據預設,Apigee 路由器會在 57 秒後逾時,因此適合將負載平衡器的要求逾時設為 60 秒。
追蹤記錄
使用 Trace 診斷錯誤
如果問題仍未解決 (仍有 499
個錯誤),請執行下列步驟:
- 在 Edge UI 中為受影響的 API 啟用追蹤記錄工作階段。
- 您可以等待錯誤發生,或是如果有 API 呼叫,然後發出一些 API 呼叫並重現錯誤。
- 檢查每個階段的經過時間,並記下大多數時間花費在哪個階段。
- 如果你在下列任一階段後發現經過的最長時間錯誤,表示後端伺服器處理要求的速度緩慢,或處理時間過長:
- 要求已傳送至目標伺服器
- 服務摘要政策
以下 UI 追蹤記錄範例顯示在要求傳送至目標伺服器之後的「閘道逾時」:
解析度
- 請參閱 設定 I/O 逾時的最佳做法,瞭解透過 Apigee Edge 進行 API 要求流程中,相關元件應設定哪些逾時值。
- 請務必按照最佳做法,在用戶端應用程式中設定適當的逾時值。
如果問題仍未解決,請參閱「必須收集診斷資訊」。
必須收集診斷資訊
如果問題仍未解決,請收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡。
如果您是公開雲端使用者,請提供下列資訊:
- 機構組織名稱
- 環境名稱
- API Proxy 名稱
- 完成用於重現逾時錯誤的
curl
指令 - 顯示用戶端逾時錯誤的 API 要求追蹤檔
如果您是 Private Cloud 使用者,請提供下列資訊:
- 觀察失敗要求的完整錯誤訊息
- 環境名稱
- API Proxy 套裝組合
- 顯示用戶端逾時錯誤的 API 要求追蹤檔
- NGINX 存取記錄檔 (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
) - 訊息處理器系統記錄 (
/opt/apigee/var/log/edge-message-processor/logs/system.log
)