查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
問題
用戶端應用程式收到訊息 504
的 HTTP 狀態碼
Gateway Timeout
用於回應 API 呼叫。
這則錯誤回應表示用戶端未收到 Apigee Edge 及時的回應 或是後端伺服器執行 API 呼叫
錯誤訊息
用戶端應用程式會取得下列回應代碼:
HTTP/1.1 504 Gateway Time-out
使用 cURL 或網路瀏覽器呼叫這類 Proxy 時,您可能會收到下列錯誤:
<!DOCTYPE html> <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>
什麼原因造成帳戶逾時?
透過 Edge 平台發出 API 要求的典型路徑為 Client >路由器 >訊息 處理器 >後端伺服器,如下圖所示:
Apigee Edge 執行階段流程中的所有元件,包括用戶端、路由器、訊息
為處理方和後端伺服器設定合適的預設逾時值,
確保 API 要求不會花費太多時間完成。如果 Pod 中的任何元件
流程無法在
逾時設定,則該元件將逾時,且通常會傳回
504 Gateway Timeout
錯誤。
本教戰手冊將說明如何排解並解決504
路由器逾時。
路由器發生逾時
在 Apigee Edge 中設定的路由器預設逾時時間為 57 秒。這個上限 從收到 API 要求到 Edge 之間可執行 API Proxy 的時間長度 回應即會傳回,包括後端回應和執行的所有政策。 您可覆寫路由器/虛擬主機上的預設逾時時間,詳情請參閱: 設定路由器的 I/O 逾時。
可能原因
在 Edge 中,導致 504 Gateway Timeout
錯誤導致
路由器逾時的狀況如下:
原因 | 說明 | 適用的疑難排解操作說明 |
---|---|---|
路由器的逾時設定不正確 | 如果路由器設定的 I/O 逾時期限不正確,就會發生這種情況。 | 邊緣公有雲和私有雲使用者 |
常見的診斷步驟
請使用下列其中一項工具/技巧診斷這個錯誤:
- API 監控
- NGINX 存取記錄
API 監控
如何使用 API Monitoring 診斷錯誤:
- 前往「Analyze」(分析) >「API 監控 >調查頁面。
- 請篩選出
5xx
項錯誤並選取時間範圍。 - 根據「時間」繪製「狀態碼」。
-
按一下顯示「
504
」錯誤的特定儲存格,即可瞭解詳情及查看內容 這類錯誤的記錄檔,如下所示:504 錯誤示例
- 按一下右側窗格中的「查看記錄」。
在「流量記錄」視窗中,記下部分
504
錯誤的詳細資料:- Request:提供用於發出呼叫的要求方法和 URI
- 回應 時間:提供要求的總時間。
在上述範例中
- Request 指向
GET /test-timeout
。 - 回應時間 為
57.001
秒。這表示路由器 逾時,訊息處理者無法回應,因為值非常接近 設為路由器上預設的 I/O 逾時時間,也就是 57 秒。
您也可以使用 API Monitoring 取得所有記錄檔 GET 記錄 API。 例如,藉由查詢
org
、env
、timeRange
的記錄檔, 以及status
,您就能下載所有交易的記錄檔 用戶端逾時。因為 API Monitoring 會將這些
504
的 Proxy 設為-
(not set) 錯誤,您可以使用 API (記錄檔 API),取得虛擬主機和路徑的相關聯 Proxy。For example :
敬上curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
- 查看「Response Time」(回應時間) 頁面,找出其他
504
錯誤並檢查 檢查回應時間是否一致 (路由器上設定的 I/O 逾時值) 也就是 57 秒) 計算的所有504
錯誤
NGINX 存取記錄
如何使用 NGINX 存取記錄診斷錯誤:
- 查看 NGINX 存取記錄:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 搜尋並查看特定期間是否有任何
504
錯誤 (如果問題是過去發生) 或者504
。 - 關於部分
504
錯誤,請注意下列事項:- 回應時間
- 請求 URI
在本例中,我們會看到下列資訊:
-
要求時間:
57.001
秒。這表示 路由器在 57.001 秒之後逾時。 - 要求:
GET /test-timeout
- 「Host Alias」:
myorg-test.apigee.net
-
檢查要求時間是否和 I/O 逾時相同 路由器/虛擬主機上設定的內容如果是的話,表示路由器在 訊息處理器未於這段期間內回應。
在上方顯示的 NGINX 存取記錄項目範例中,Request
57.001
秒的時間非常接近預設的 I/O 逾時設定 連線到路由器這表示路由器在訊息之前已逾時 處理者可以回應。 - 使用 Request 欄位。
原因:路由器的逾時設定不正確
診斷
- 判斷
504
錯誤是否是因為路由器逾時 訊息處理者可以回應方法如下 API 監控/要求時間 (這兩個欄位) 中的 Response Time 代表相同的資訊,但會以不同名稱呼叫) 設定路由器/虛擬主機和欄位 錯誤來源、錯誤 Proxy 和 Fault Code 已設為-
,透過 API Monitoring 或 NGINX 存取權 記錄,如同「 常見診斷步驟」一文所述。 -
請檢查路由器或特定虛擬主機上設定的 I/O 逾時值是否為 。
相關步驟請參閱本節說明。
驗證虛擬主機的 I/O 逾時
Edge UI
如要使用 Edge UI 驗證虛擬主機逾時,請按照下列步驟操作:
- 登入 Edge UI。
- 前往「管理」>「管理員」虛擬主機。
- 選取發生逾時問題的特定環境。
- 選取要驗證 I/O 逾時值的特定虛擬主機。
- 在「屬性」下方,查看「Proxy 讀取逾時」值 (以秒為單位)。
在上述範例中,「Proxy 讀取逾時」 的設定值為
120
。這表示這個虛擬主機設定的 I/O 逾時為 120 秒。
Management API
您也可以使用下列管理 API 驗證「Proxy 讀取逾時」:
-
執行 取得虛擬主機 API 以取得
virtualhost
設定,如下所示:公有雲使用者
curl -v -X GET https://api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUALHOST_NAME -u USERNAME
Private Cloud 使用者
curl -v -X GET http://MANAGEMENT_SERVER_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/v/virtualhosts/VIRTUALHOST_NAME -u USERNAME
在此情況下:
ORGANIZATION_NAME 是機構名稱
ENVIRONMENT_NAME 是環境的名稱。
VIRTUALHOST_NAME 是虛擬主機的名稱
-
請檢查為「
proxy_read_timeout
」屬性設定的值虛擬主機定義範例
{ "hostAliases": [ "api.myCompany,com", ], "interfaces": [], "listenOptions": [], "name": "secure", "port": "443", "retryOptions": [], "properties": { "property": [ { "name": "proxy_read_timeout", "value": "120" } ] }, "sSLInfo": { "ciphers": [], "clientAuthEnabled": "false", "enabled": "true", "ignoreValidationErrors": false, "keyAlias": "myCompanyKeyAlias", "keyStore": "ref://myCompanyKeystoreref", "protocols": [] }, "useBuiltInFreeTrialCert": false }
在上述範例中,
proxy_read_timeout
設定為120
。在這個虛擬主機上,設定的 I/O 逾時為 120 秒內請求驗證碼。
驗證路由器.properties 檔案的 I/O 逾時
- 登入路由器機器。
- 在「
proxy_read_timeout
」中搜尋資源/opt/nginx/conf.d
目錄,檢查是否已以新的值設為該目錄 如下所示:grep -ri "proxy_read_timeout" /opt/nginx/conf.d
-
檢查在特定虛擬主機中為屬性
proxy_read_timeout
設定的值 設定檔grep 指令的結果範例
/opt/nginx/conf.d/0-default.conf:proxy_read_timeout 57; /opt/nginx/conf.d/0-edge-health.conf:proxy_read_timeout 1s;
在上方的輸出範例中,請注意
proxy_read_timeout
屬性 已使用0-default.conf
中的新值57
進行設定 預設虛擬主機的設定檔這表示 I/O 逾時 將 default 虛擬主機的路由器設為 57 秒。如果 您會看到每個虛擬主機的資訊取得proxy_read_timeout
代表用於建立 API 的特定虛擬主機 呼叫失敗 (發生504
個錯誤)。
驗證 API Proxy 中的 I/O 逾時
您可以透過下列指令查看 I/O 逾時時間:
- API Proxy 的目標端點
- API Proxy 的服務呼叫政策
查看 API Proxy 目標端點的 I/O 逾時情形
- 在 Edge UI 中,選取要查看 I/O 的特定 API Proxy 逾時值。
- 選取要檢查的特定目標端點。
- 在
io.timeout.millis
下方查看含有適當值的屬性TargetEndpoint
中的<HTTPTargetConnection>
元素 此外還會從 0 自動調整資源配置 您完全不必調整資源調度設定舉例來說,下列程式碼中的 I/O 逾時設定為 120 秒:
<Properties> <Property name="io.timeout.millis">120000</Property> </Properties>
查看 API Proxy 的服務呼叫政策中的 I/O 逾時設定
- 在 Edge UI 中,選取要查看新 I/O 的特定 API Proxy ServiceCALL 政策的逾時值。
- 選取要查看的具體 Service 摘要政策。
-
在
<Timeout>
下方查看具備適當值的元素<Timeout>
<ServiceCallout>
設定。舉例來說,下列程式碼的 I/O 逾時會是 120 秒:
<Timeout>120000</Timeout>
驗證訊息處理器的 I/O 逾時
- 登入訊息處理器機器。
-
在「
HTTPTransport.io.timeout.millis
」中搜尋資源/opt/apigee/edge-message-processor/conf
目錄:grep -ri "HTTPTransport.io.timeout.millis" /opt/apigee/edge-message-processor/conf
輸出內容範例
/opt/apigee/edge-message-processor/conf/http.properties:HTTPTransport.io.timeout.millis=55000
- 在上方輸出範例中,請注意
「
HTTPTransport.io.timeout.millis
」已設為55000
這個值。http.properties
。這表示 I/O 逾時已成功設定為 訊息處理器達 55 秒。
確定路由器和訊息處理器設定的逾時時間後,請確認 路由器/虛擬主機的逾時值比 訊息處理器/API Proxy。
記下所有圖層上設定的值,如下表所示:
路由器逾時 (秒) | 虛擬主機逾時 (秒) | 訊息處理器逾時 (秒) | API Proxy 逾時 (秒) |
---|---|---|---|
57 | - | 55 | 120 |
在這個例子中
- 已在路由器上設定 57 秒的預設值。
- 特定虛擬主機上未設定逾時值。也就是說,該函式會使用 預設值為路由器本身的 57 秒。
- 「訊息處理器」的預設值是 55 秒。
- 然而,這個特定 API Proxy 的值會設為 120 秒。
請注意,較高的逾時值只會在 API Proxy 上設定,但路由器仍
設為 57 秒因此,路由器在 57 秒收到「訊息」時逾時
處理器/後端仍在處理您的要求。這會導致路由器回應
504 Gateway Timeout
錯誤傳送至用戶端應用程式。
解析度
請執行下列步驟,在路由器和訊息上設定適當的 I/O 逾時 解決這個問題的處理器。
- 詳情請參閱 設定 I/O 逾時的最佳做法,以便瞭解逾時值 應針對透過 Apigee Edge 處理 API 要求流程的不同元件進行設定。
- 在上述範例中,假設您認為必須設定較高的逾時值
因為後端伺服器需要較長的時間,而您已將逾時時間提高
請將訊息處理器的值設為 120 秒,然後針對
例如:路由器上的
123 seconds
如何避免影響所有 API Proxy 由於新的逾時值,請將123 seconds
值設為 特定 API Proxy 中使用的特定虛擬主機。 - 請遵循指示: 設定路由器的 I/O 逾時,以設定虛擬主機的逾時。