504 閘道逾時 - 路由器逾時

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

  1. 前往「Analyze」(分析) >「API 監控 >調查頁面。
  2. 請篩選出 5xx 項錯誤並選取時間範圍。
  3. 根據「時間」繪製「狀態碼」
  4. 按一下顯示「504」錯誤的特定儲存格,即可瞭解詳情及查看內容 這類錯誤的記錄檔,如下所示:

    504 錯誤示例

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

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

    • Request:提供用於發出呼叫的要求方法和 URI
    • 回應 時間:提供要求的總時間。

    在上述範例中

    • Request 指向 GET /test-timeout
    • 回應時間 57.001 秒。這表示路由器 逾時,訊息處理者無法回應,因為值非常接近 設為路由器上預設的 I/O 逾時時間,也就是 57 秒。

    您也可以使用 API Monitoring 取得所有記錄檔 GET 記錄 API。 例如,藉由查詢 orgenvtimeRange 的記錄檔, 以及 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
    
    敬上
  6. 查看「Response Time」(回應時間) 頁面,找出其他 504 錯誤並檢查 檢查回應時間是否一致 (路由器上設定的 I/O 逾時值) 也就是 57 秒) 計算的所有 504 錯誤

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. 檢查要求時間是否和 I/O 逾時相同 路由器/虛擬主機上設定的內容如果是的話,表示路由器在 訊息處理器未於這段期間內回應。

    在上方顯示的 NGINX 存取記錄項目範例中,Request 57.001 秒的時間非常接近預設的 I/O 逾時設定 連線到路由器這表示路由器在訊息之前已逾時 處理者可以回應。

  5. 使用 Request 欄位。

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

診斷

  1. 判斷 504 錯誤是否是因為路由器逾時 訊息處理者可以回應方法如下 API 監控/要求時間 (這兩個欄位) 中的 Response Time 代表相同的資訊,但會以不同名稱呼叫) 設定路由器/虛擬主機和欄位 錯誤來源錯誤 Proxy 和 Fault Code 已設為 -,透過 API Monitoring 或 NGINX 存取權 記錄,如同「 常見診斷步驟」一文所述。
  2. 請檢查路由器或特定虛擬主機上設定的 I/O 逾時值是否為

    相關步驟請參閱本節說明。

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

Edge UI

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

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

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

Management API

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

  1. 執行 取得虛擬主機 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 秒內請求驗證碼。

,瞭解如何調查及移除這項存取權。

驗證路由器.properties 檔案的 I/O 逾時

  1. 登入路由器機器。
  2. 在「proxy_read_timeout」中搜尋資源 /opt/nginx/conf.d 目錄,檢查是否已以新的值設為該目錄 如下所示:
    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 逾時 將 default 虛擬主機的路由器設為 57 秒。如果 您會看到每個虛擬主機的資訊取得 proxy_read_timeout 代表用於建立 API 的特定虛擬主機 呼叫失敗 (發生 504 個錯誤)。

驗證 API Proxy 中的 I/O 逾時

您可以透過下列指令查看 I/O 逾時時間:

  • API Proxy 的目標端點
  • API Proxy 的服務呼叫政策
查看 API Proxy 目標端點的 I/O 逾時情形
  1. 在 Edge UI 中,選取要查看 I/O 的特定 API Proxy 逾時值。
  2. 選取要檢查的特定目標端點。
  3. io.timeout.millis 下方查看含有適當值的屬性 TargetEndpoint 中的 <HTTPTargetConnection> 元素 此外還會從 0 自動調整資源配置 您完全不必調整資源調度設定

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

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
    
查看 API Proxy 的服務呼叫政策中的 I/O 逾時設定
  1. 在 Edge UI 中,選取要查看新 I/O 的特定 API Proxy ServiceCALL 政策的逾時值。
  2. 選取要查看的具體 Service 摘要政策。
  3. <Timeout> 下方查看具備適當值的元素 <Timeout> <ServiceCallout> 設定。

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

    <Timeout>120000</Timeout>
    

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

  1. 登入訊息處理器機器。
  2. 在「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
    
  3. 在上方輸出範例中,請注意 「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 逾時 解決這個問題的處理器。

  1. 詳情請參閱 設定 I/O 逾時的最佳做法,以便瞭解逾時值 應針對透過 Apigee Edge 處理 API 要求流程的不同元件進行設定。
  2. 在上述範例中,假設您認為必須設定較高的逾時值 因為後端伺服器需要較長的時間,而您已將逾時時間提高 請將訊息處理器的值設為 120 秒,然後針對 例如:路由器上的 123 seconds如何避免影響所有 API Proxy 由於新的逾時值,請將 123 seconds設為 特定 API Proxy 中使用的特定虛擬主機
  3. 請遵循指示: 設定路由器的 I/O 逾時,以設定虛擬主機的逾時。