您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
問題
用戶端應用程式會收到 504
的 HTTP 狀態碼,以及 Gateway Timeout
訊息,以回應 API 呼叫。
這項錯誤回應表示在執行 API 呼叫時,用戶端並未及時收到 Apigee Edge 或後端伺服器的回應。
錯誤訊息
用戶端應用程式會取得以下回應代碼:
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」>「 Router」>「Message Processor」>「Backend Server」,如下圖所示:
Apigee Edge 執行階段流程中的所有元件 (包括用戶端、路由器、訊息處理器和後端伺服器) 都已採用合適的預設逾時值設定,確保 API 要求完成時間不會過長。如果在逾時設定指定的時間範圍內,流程中的任何元件未收到上游元件的回應,則特定元件將會逾時,並通常會傳回 504 Gateway Timeout
錯誤。
本應對手冊說明如何排解路由器逾時時發生的 504
錯誤。
路由器逾時
Apigee Edge 中的路由器預設逾時時間為 57 秒。這是指從 Edge 收到 API 要求開始,直到回應傳回為止 (包括後端回應和執行的所有政策),API Proxy 可執行的時間長度上限。您可以按照 設定路由器的 I/O 逾時一文的說明,覆寫路由器/虛擬主機上的預設逾時時間。
可能原因
在 Edge 中,由於路由器逾時,導致 504 Gateway Timeout
錯誤的原因通常為:
原因 | 說明 | 適用的疑難排解指示 |
---|---|---|
路由器的逾時設定不正確 | 如果路由器設定的 I/O 逾時時間不正確,就會發生這種情況。 | 邊緣公開與私有雲使用者 |
常見診斷步驟
請使用下列其中一種工具/技巧診斷這項錯誤:
- API 監控
- NGINX 存取記錄檔
API 監控
如何使用 API Monitoring 診斷錯誤:
- 前往「分析」>「API 監控」>「調查」頁面。
- 請篩選
5xx
個錯誤,並選取時間範圍。 - 依據「Time」繪製「Status Code」。
-
點選顯示
504
錯誤的特定儲存格,即可瞭解詳情以及查看這些錯誤的記錄檔,如下所示:顯示 504 錯誤的範例
- 按一下右側窗格中的「查看記錄檔」。
在「Traffic Logs」視窗中,記下部分
504
錯誤的詳細資料:- 要求:提供用於發出呼叫的要求方法和 URI
- 回應 時間:這項資訊會提供要求所經過的總時間。
在上述範例中
- 要求 指向
GET /test-timeout
。 - 回應時間 為
57.001
秒。這表示路由器在訊息處理器能夠回應之前已經逾時,因為值非常接近路由器上設定的預設 I/O 逾時時間 ( 57 秒)。
另外,您也可以使用 API Monitoring GET logs API 取得所有記錄。例如,藉由查詢
org
、env
、timeRange
和status
的記錄,您就可以下載用戶端逾時交易的所有記錄檔。由於 API Monitoring 會針對這些
504
錯誤將 Proxy 設為-
(未設定),因此您可以使用 API (記錄 API) 取得虛擬主機與路徑相關聯的 Proxy。For example :
curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
- 檢查回應時間中是否有其他
504
錯誤,並檢查所有504
錯誤的「回應時間」是否一致 (在路由器上設定的 I/O 逾時值,也就是 57 秒)。
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
-
確認「Request Time」是否與路由器/虛擬主機中設定的 I/O 逾時時間相同。如果為「是」,表示路由器在這段時間內未回應就逾時。
在上方顯示的 NGINX 存取記錄項目範例中,要求時間 (
57.001
秒) 與路由器上設定的預設 I/O 逾時時間十分接近。這可清楚表示路由器在訊息處理器能夠回應之前逾時。 - 使用「Request」(要求) 欄位的基本路徑,決定要提出要求的 API Proxy。
原因:路由器的逾時設定不正確
診斷
- 判斷之所以發生
504
錯誤,是因為路由器在訊息處理器能回應之前已經逾時。如要這麼做,請檢查路由器中的 API 監控/要求時間中的「回應時間」 (這兩個欄位代表相同的資訊,但名稱不同)。使用 API 監控功能或 NGINX 「常見存取程式碼」欄位,確認 I/O 逾時設定是否與路由器/虛擬主機上的 I/O 逾時時間相同,-
-
檢查與在訊息處理器或特定 API Proxy 中設定的 I/O 逾時值相比,在路由器或特定虛擬主機上設定的 I/O 逾時值是否「較低」。
請按照本節的步驟進行。
驗證虛擬主機的 I/O 逾時
Edge UI
如要使用 Edge UI 驗證虛擬主機逾時,請按照下列步驟操作:
- 登入 Edge UI。
- 依序前往「Admin」>「Virtual Hosts」。
- 選取你遇到逾時問題的特定環境。
- 選取要驗證 I/O 逾時值的特定虛擬主機。
- 在「Properties」下方,查看「Proxy 讀取逾時」值 (以秒為單位)。
在上述範例中,「Proxy 讀取逾時」 的值設為
120
。這表示這個虛擬主機設定的 I/O 逾時為 120 秒。
Management API
您也可以使用下列管理 API 驗證 Proxy 讀取逾時:
-
執行 Get virtual Host 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 秒。
驗證 Router.properties 檔案的 I/O 逾時
- 登入路由器機器。
- 在
/opt/nginx/conf.d
目錄中搜尋proxy_read_timeout
屬性,然後查看是否已以新的值設定該屬性,如下所示: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;
請注意,在上方的輸出範例中,
0-default.conf
中的新值57
是預設虛擬主機的設定檔,也就是proxy_read_timeout
屬性。這表示 default 虛擬主機的 I/O 逾時設定為 57 秒。若您有多個虛擬主機,系統會顯示各個虛擬主機的資訊。用於執行 API 呼叫失敗 (有504
錯誤) 的特定虛擬主機,並取得該主機的proxy_read_timeout
值。
驗證 API Proxy 中的 I/O 逾時
您可以按照下列步驟查看 I/O 逾時:
- API Proxy 的目標端點
- API Proxy 的服務呼叫政策
查看 API Proxy 目標端點中的 I/O 逾時
- 在 Edge UI 中,選取要查看 I/O 逾時值的特定 API Proxy。
- 選取要檢查的特定目標端點。
- 請前往
TargetEndpoint
設定,在<HTTPTargetConnection>
元素下方查看提供適當值的屬性io.timeout.millis
。例如,下列程式碼中的 I/O 逾時設定為 120 秒:
<Properties> <Property name="io.timeout.millis">120000</Property> </Properties>
查看 API Proxy 服務呼叫政策中的 I/O 逾時情形
- 在 Edge UI 中,選取要查看 Service Call 政策新 I/O 逾時值的特定 API Proxy。
- 選取要檢查的特定 Service callout 政策。
-
在
<ServiceCallout>
設定下方,查看含有適當值的元素<Timeout>
。例如,下列程式碼的 I/O 逾時為 120 秒:
<Timeout>120000</Timeout>
驗證訊息處理器的 I/O 逾時
- 登入訊息處理器機器。
-
使用下列指令在
/opt/apigee/edge-message-processor/conf
目錄中搜尋屬性HTTPTransport.io.timeout.millis
: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
屬性已設為http.properties
中的55000
值。這表示訊息處理器上的 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,請只針對特定 API Proxy 中使用的特定虛擬主機設定123 seconds
的值。 - 請按照 設定路由器的 I/O 逾時一文中的操作說明,設定虛擬主機的逾時時間。