您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
問題
用戶端應用程式會收到 HTTP 狀態碼 504,以及 API 呼叫的回應訊息 Gateway Timeout。
這項錯誤回應表示在執行 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 要求的一般路徑為「用戶端 > 路由器 > 訊息處理器 > 後端伺服器」,如下圖所示:
Apigee Edge 執行階段流程中的所有元件 (包括用戶端、路由器、訊息處理器和後端伺服器) 都設有合適的預設逾時值,確保 API 要求不會耗費過多時間完成。如果流程中的任何元件未在逾時設定指定的時限內,收到上游元件的回應,該元件就會逾時,通常會傳回 504 Gateway Timeout錯誤。
本教戰手冊說明如何排解及解決路由器逾時導致的 504 錯誤。
路由器逾時
Apigee Edge 中 Router 上設定的預設逾時時間為 57 秒。這是 API Proxy 從 Edge 接收 API 要求到傳回回應 (包括後端回應和所有執行的政策) 的執行時間上限。如「 在路由器上設定 I/O 超時」一文所述,您可以在路由器/虛擬主機上覆寫預設逾時。
可能原因
在 Edge 中,導致 504 Gateway Timeout 錯誤的常見原因如下:
路由器逾時:
| 原因 | 說明 | 適用於以下裝置的疑難排解說明 |
|---|---|---|
| 路由器上的逾時設定有誤 | 如果路由器設定的 I/O 超時時間有誤,就會發生這種情況。 | Edge 公有和私有雲使用者 |
常見的診斷步驟
請使用下列其中一種工具/技術診斷這項錯誤:
- API 監控
- NGINX 存取記錄
API 監控
如要使用 API 監控功能診斷錯誤,請按照下列步驟操作:
- 依序前往「Analyze」>「API Monitoring」>「Investigate」頁面。
- 篩選
5xx錯誤並選取時間範圍。 - 繪製「狀態碼」與「時間」的關係圖。
-
按一下顯示
504錯誤的特定儲存格,即可查看更多詳細資料,並查看這些錯誤的記錄,如下所示:顯示 504 錯誤的範例

- 在右側窗格中,按一下「查看記錄」。

在「流量記錄」視窗中,請注意部分
504錯誤的下列詳細資料:- 要求:提供用於發出呼叫的要求方法和 URI
- 回應 時間:顯示要求經過的總時間。
在上述範例中,
- 要求 指向
GET /test-timeout。 - 回應時間 為
57.001秒。這表示在訊息處理器回應之前,路由器已逾時,因為這個值非常接近路由器上設定的預設 I/O 超時時間 ( 57 秒)。
您也可以使用 API 監控 GET 記錄 API 取得所有記錄。舉例來說,查詢
org、env、timeRange和status的記錄,即可下載所有用戶端逾時的交易記錄。由於 API 監控會將這些
504錯誤的 Proxy 設為-(not set),因此您可以使用 API (Logs 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 - 主機別名:
myorg-test.apigee.net
-
檢查「要求時間」是否與路由器/虛擬主機上設定的 I/O 逾時相同。如果是,表示路由器在訊息處理器於這段期間內未回應前逾時。
在上述 NGINX 存取記錄項目範例中,要求時間為
57.001秒,非常接近路由器上設定的預設 I/O 逾時時間。這清楚指出路由器在訊息處理器回覆前逾時。 - 使用「Request 」(要求) 欄位中的基本路徑,判斷要求是針對哪個 API Proxy 發出。
原因:路由器上的逾時設定有誤
診斷
- 判斷
504錯誤是否是因為路由器在訊息處理器回覆前逾時所致。如要確認是否為 I/O 逾時,請檢查 API 監控中的「回應時間」/路由器中的「要求時間」 (這兩個欄位代表相同資訊,但名稱不同),是否與路由器/虛擬主機上設定的 I/O 逾時相同,並檢查「錯誤來源」、「錯誤 Proxy」和「錯誤代碼」欄位是否設為-。如需相關說明,請參閱 常見診斷步驟。 -
檢查路由器或特定虛擬主機上設定的 I/O 逾時值是否低於訊息處理器或特定 API Proxy 上設定的值。
請按照本節中的步驟操作。
驗證虛擬主機上的 I/O 逾時
Edge UI
如要使用 Edge UI 驗證虛擬主機逾時,請按照下列步驟操作:
- 登入 Edge UI。
- 依序前往「管理」>「虛擬主機」。
- 選取發生逾時問題的特定環境。
- 選取要驗證 I/O 逾時值的特定虛擬主機。
- 在「屬性」下方,查看「Proxy Read Timeout」(Proxy 讀取逾時) 值 (以秒為單位)。

在上述範例中,Proxy Read Timeout 的值設為
120。這表示在這個虛擬主機上設定的 I/O 逾時時間為 120 秒。
Management API
您也可以使用下列管理 API 驗證「Proxy Read Timeout」:
-
執行「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;
在上述範例輸出中,請注意,屬性
proxy_read_timeout已在0-default.conf中設為新值57,這是預設虛擬主機的設定檔。這表示路由器上預設虛擬主機的 I/O 逾時已設為 57 秒。如果您有多個虛擬主機,系統會顯示每個主機的這項資訊。找出您用於發出 API 呼叫的特定虛擬主機的proxy_read_timeout值,這些呼叫因504錯誤而失敗。
驗證 API Proxy 中的 I/O 逾時
您可以在下列位置查看 I/O 逾時:
- API Proxy 的目標端點
- API Proxy 的 ServiceCallout 政策
查看 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 的 ServiceCallout 政策中查看 I/O 逾時
- 在 Edge UI 中,選取要查看 ServiceCallout 政策新 I/O 逾時值的特定 API Proxy。
- 選取要查看的特定 ServiceCallout 政策。
-
請在
<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 上設定,但 Router 仍會設定為 57 秒。因此,當訊息處理器/後端仍在處理您的要求時,路由器會在 57 秒後逾時。這會導致 Router 回應用戶端應用程式時發生 504 Gateway Timeout 錯誤。
解析度
請按照下列步驟,在路由器和訊息處理器上設定適當的 I/O 逾時,解決這個問題。
- 請參閱「 設定 I/O 逾時的最佳做法」,瞭解應在 API 要求流程中,透過 Apigee Edge 涉及的不同元件上設定哪些逾時值。
- 在上述範例中,如果您確定需要設定較高的逾時值,因為後端伺服器需要較長的時間,且您已將訊息處理器的逾時值增加至 120 秒,請在路由器上設定較高的逾時值。例如:
123 seconds。為避免新的逾時值影響所有 API Proxy,請123 seconds僅在特定 API Proxy 使用的特定虛擬主機上設定該值。 - 請按照「 在路由器上設定 I/O 逾時」一文中的操作說明,在虛擬主機上設定逾時。