504 閘道逾時 - 路由器逾時

您目前查看的是 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 監控功能診斷錯誤,請按照下列步驟操作:

  1. 依序前往「Analyze」>「API Monitoring」>「Investigate」頁面。
  2. 篩選 5xx 錯誤並選取時間範圍。
  3. 繪製「狀態碼」與「時間」的關係圖。
  4. 按一下顯示 504 錯誤的特定儲存格,即可查看更多詳細資料,並查看這些錯誤的記錄,如下所示:

    顯示 504 錯誤的範例

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

    在「流量記錄」視窗中,請注意部分 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
    
  6. 查看「回應時間」,瞭解其他 504 錯誤,並檢查所有 504 錯誤的「回應時間」是否一致 (在路由器上設定的 I/O 逾時值為 57 秒)。

NGINX 存取記錄

如要使用 NGINX 存取記錄診斷錯誤,請按照下列步驟操作:

  1. 檢查 NGINX 存取記錄:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. 搜尋特定時間範圍內是否有任何504錯誤 (如果問題發生在過去),或是否有任何要求仍失敗並顯示504。
  3. 請注意以下資訊,瞭解部分 504 錯誤:
    • 回應時間
    • 要求 URI

    在本範例中,我們可以看到下列資訊:

    • 要求時間: 57.001 秒。這表示路由器在 57.001 秒後逾時。

    • 要求: GET /test-timeout
    • 主機別名:myorg-test.apigee.net
  4. 檢查「要求時間」是否與路由器/虛擬主機上設定的 I/O 逾時相同。如果是,表示路由器在訊息處理器於這段期間內未回應前逾時。

    在上述 NGINX 存取記錄項目範例中,要求時間為 57.001 秒,非常接近路由器上設定的預設 I/O 逾時時間。這清楚指出路由器在訊息處理器回覆前逾時。

  5. 使用「Request 」(要求) 欄位中的基本路徑,判斷要求是針對哪個 API Proxy 發出。

原因:路由器上的逾時設定有誤

診斷

  1. 判斷 504 錯誤是否是因為路由器在訊息處理器回覆前逾時所致。如要確認是否為 I/O 逾時,請檢查 API 監控中的「回應時間」/路由器中的「要求時間」 (這兩個欄位代表相同資訊,但名稱不同),是否與路由器/虛擬主機上設定的 I/O 逾時相同,並檢查「錯誤來源」、「錯誤 Proxy」和「錯誤代碼」欄位是否設為 -。如需相關說明,請參閱 常見診斷步驟。
  2. 檢查路由器或特定虛擬主機上設定的 I/O 逾時值是否低於訊息處理器或特定 API Proxy 上設定的值。

    請按照本節中的步驟操作。

驗證虛擬主機上的 I/O 逾時

Edge UI

如要使用 Edge UI 驗證虛擬主機逾時,請按照下列步驟操作:

  1. 登入 Edge UI。
  2. 依序前往「管理」>「虛擬主機」。
  3. 選取發生逾時問題的特定環境。
  4. 選取要驗證 I/O 逾時值的特定虛擬主機。
  5. 在「屬性」下方,查看「Proxy Read Timeout」(Proxy 讀取逾時) 值 (以秒為單位)。

    在上述範例中,Proxy Read Timeout 的值設為 120。這表示在這個虛擬主機上設定的 I/O 逾時時間為 120 秒。

Management API

您也可以使用下列管理 API 驗證「Proxy Read Timeout」:

  1. 執行「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 是虛擬主機的名稱

  2. 檢查為屬性 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 逾時

  1. 登入路由器電腦。
  2. 在 /opt/nginx/conf.d 目錄中搜尋 proxy_read_timeout 屬性,並檢查是否已設定新值,如下所示:
    grep -ri "proxy_read_timeout" /opt/nginx/conf.d
    
  3. 檢查特定虛擬主機設定檔中,為 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 超時
  1. 在 Edge UI 中,選取要查看 I/O 逾時值的特定 API Proxy。
  2. 選取要檢查的特定目標端點。
  3. 在 TargetEndpoint 設定的 <HTTPTargetConnection> 元素中,查看具有適當值的 io.timeout.millis 屬性。

    舉例來說,下列程式碼中的 I/O 逾時時間設為 120 秒:

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
在 API Proxy 的 ServiceCallout 政策中查看 I/O 逾時
  1. 在 Edge UI 中,選取要查看 ServiceCallout 政策新 I/O 逾時值的特定 API Proxy。
  2. 選取要查看的特定 ServiceCallout 政策。
  3. 請在 <ServiceCallout> 設定中,查看具有適當值的 <Timeout> 元素。

    舉例來說,下列程式碼的 I/O 逾時時間為 120 秒:

    <Timeout>120000</Timeout>

驗證訊息處理器的 I/O 逾時

  1. 登入訊息處理器電腦。
  2. 使用下列指令,在 /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
  3. 在上述範例輸出內容中,請注意屬性 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 逾時,解決這個問題。

  1. 請參閱「 設定 I/O 逾時的最佳做法」,瞭解應在 API 要求流程中,透過 Apigee Edge 涉及的不同元件上設定哪些逾時值。
  2. 在上述範例中,如果您確定需要設定較高的逾時值,因為後端伺服器需要較長的時間,且您已將訊息處理器的逾時值增加至 120 秒,請在路由器上設定較高的逾時值。例如:123 seconds。為避免新的逾時值影響所有 API Proxy,請123 seconds僅在特定 API Proxy 使用的特定虛擬主機上設定該值。
  3. 請按照「 在路由器上設定 I/O 逾時」一文中的操作說明,在虛擬主機上設定逾時。