504 閘道逾時 - 路由器逾時

您正在查看 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 診斷錯誤:

  1. 前往「分析」>「API 監控」>「調查」頁面。
  2. 請篩選 5xx 個錯誤,並選取時間範圍。
  3. 依據「Time」繪製「Status Code」
  4. 點選顯示 504 錯誤的特定儲存格,即可瞭解詳情以及查看這些錯誤的記錄檔,如下所示:

    顯示 504 錯誤的範例

  5. 按一下右側窗格中的「查看記錄檔」

    在「Traffic Logs」視窗中,記下部分 504 錯誤的詳細資料:

    • 要求:提供用於發出呼叫的要求方法和 URI
    • 回應 時間:這項資訊會提供要求所經過的總時間。

    在上述範例中

    • 要求 指向 GET /test-timeout
    • 回應時間 57.001 秒。這表示路由器在訊息處理器能夠回應之前已經逾時,因為值非常接近路由器上設定的預設 I/O 逾時時間 ( 57 秒)。

    另外,您也可以使用 API Monitoring GET logs API 取得所有記錄。例如,藉由查詢 orgenvtimeRangestatus 的記錄,您就可以下載用戶端逾時交易的所有記錄檔。

    由於 API Monitoring 會針對這些 504 錯誤將 Proxy 設為 - (未設定),因此您可以使用 API (記錄 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
    • 「Host Alias」myorg-test.apigee.net
  4. 確認「Request Time」是否與路由器/虛擬主機中設定的 I/O 逾時時間相同。如果為「是」,表示路由器在這段時間內未回應就逾時。

    在上方顯示的 NGINX 存取記錄項目範例中,要求時間 (57.001 秒) 與路由器上設定的預設 I/O 逾時時間十分接近。這可清楚表示路由器在訊息處理器能夠回應之前逾時。

  5. 使用「Request」(要求) 欄位的基本路徑,決定要提出要求的 API Proxy。

原因:路由器的逾時設定不正確

診斷

  1. 判斷之所以發生 504 錯誤,是因為路由器在訊息處理器能回應之前已經逾時。如要這麼做,請檢查路由器中的 API 監控/要求時間中的「回應時間」 (這兩個欄位代表相同的資訊,但名稱不同)。使用 API 監控功能或 NGINX 「常見存取程式碼」欄位,確認 I/O 逾時設定是否與路由器/虛擬主機上的 I/O 逾時時間相同,-
  2. 檢查與在訊息處理器或特定 API Proxy 中設定的 I/O 逾時值相比,在路由器或特定虛擬主機上設定的 I/O 逾時值是否「較低」

    請按照本節的步驟進行。

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

Edge UI

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

  1. 登入 Edge UI。
  2. 依序前往「Admin」>「Virtual Hosts」
  3. 選取你遇到逾時問題的特定環境
  4. 選取要驗證 I/O 逾時值的特定虛擬主機。
  5. 在「Properties」下方,查看「Proxy 讀取逾時」值 (以秒為單位)。

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

Management API

您也可以使用下列管理 API 驗證 Proxy 讀取逾時

  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;
    

    請注意,在上方的輸出範例中,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 逾時
  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 服務呼叫政策中的 I/O 逾時情形
  1. 在 Edge UI 中,選取要查看 Service Call 政策新 I/O 逾時值的特定 API Proxy。
  2. 選取要檢查的特定 Service callout 政策。
  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 上設定,但路由器仍會設定為 57 秒。因此,路由器會在 57 秒時逾時,而訊息處理器/後端仍在處理您的要求。這會導致路由器對用戶端應用程式傳回 504 Gateway Timeout 錯誤。

解析度

如要解決這個問題,請按照下列步驟在路由器和訊息處理器上設定適當的 I/O 逾時。

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