502 閘道錯誤 - TooBigLine

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

問題

用戶端應用程式會取得 502 Bad Gateway 的 HTTP 狀態碼,以及錯誤代碼 protocol.http.TooBigLine 做為 API 呼叫的回應。

錯誤訊息

用戶端應用程式會取得以下回應代碼:

HTTP/1.1 502 Bad Gateway

此外,您可能會遇到以下錯誤訊息:

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

可能原因

如果目標/後端伺服器 (即 HTTP 回應的一部分) 傳送至 Apigee Edge 的 Response-Line 大小大於 Apigee Edge 中的限制,就會發生這個錯誤。

查看這個錯誤的可能原因之前,我們先瞭解「回應行」代表的意義,以及如何查看其大小。

瞭解回應行

一般的 HTTP 回應由三個部分組成:

  1. 狀態行 (在 Apigee 中稱為 Response-Line)
  2. ( 一組 HTTP 標頭)
  3. [ 內文 ]

回應行包含三個部分:通訊協定版本後面加上數字狀態碼及其相關文字詞組,如下所示:

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

當目標/後端伺服器應用程式傳送 HTTP 回應時,傳送的第一行代表上述的 Response-Line。後面接有標頭和回應主體/酬載。下列範例螢幕截圖顯示一般的 curl 要求、Request 部分、Response 部分 (以及 Response-Line)。

瞭解回應行大小

  1. 在上述的範例中,回應中的 start 行 (第一行) 也稱為「Response-Line」

    HTTP/1.1 200 OK
    

    由於這個回應行包含 15 ASCII characters,因此其大小為 ~15 bytes。由於這個值未超過 Apigee Edge 允許的限制,因此 Apigee Edge 會將回應傳回用戶端,而且不會發生任何錯誤。

  2. 同樣地,如果您查看上述錯誤訊息中的 faultstring,則包含 "response line size exceeding 2,048"。這表示目標/後端伺服器傳送之 HTTP 回應中的 Response-Line 超過 2,048 個位元組。

瞭解大型回應行

根據 Status-Line (此處稱為 Response-Line) 和一般 HTTP 要求與回應的定義,其大小遠低於 Apigee Edge 中定義的預設上限 2 K,因此可能不會達到上限。不過,下列情形可能會超過這個限制:

  1. 目標/後端伺服器不是 HTTP 系統。可能會以非 HTTP 回應回應。
  2. 目標/後端伺服器發生問題,並做為 HTTP 回應的一部分傳送較長的回應行。

詳情請參閱 取得錯誤通訊協定.http.TooBigLine、「回應行大小超過 2,048」一節。

以下是發生錯誤的可能原因:

原因 說明 適用的疑難排解指示
回應行大小超過系統允許的上限 目標/後端伺服器作為 Apigee Edge HTTP 回應的一部分傳送的 Response-Line 大小超過 Apigee Edge 中的限制 Edge Public and Private Cloud 使用者

常見診斷步驟

請使用下列其中一種工具/技巧診斷這項錯誤:

API Monitoring

如何使用 API Monitoring 診斷錯誤:

  1. 適當角色的使用者 登入 Apigee Edge UI
  2. 切換至您想要調查問題的機構。

  3. 前往「分析」>「API 監控」>「調查」頁面。
  4. 請選取你發現錯誤的特定時間範圍。
  5. 您可以選取「Proxy」篩選器來縮小錯誤代碼的範圍。
  6. 將「Fault Code」與「Time」進行比較。
  7. 選取含有錯誤代碼 protocol.http.TooBigLine 的儲存格,如下所示:

    ( 查看較大圖片)。

  8. 系統會顯示錯誤代碼 protocol.http.TooBigLine 的相關資訊,如下所示:

    ( 查看較大圖片)。

  9. 按一下「查看記錄」,然後展開失敗要求的資料列。

  10. 在「記錄檔」視窗中記下下列詳細資料:
    • 狀態碼: 502
    • Fault 資料來源: target
    • 錯誤代碼: protocol.http.TooBigLine
  11. 如果「Fault Source」的值為 target,且「Fault Code」的值為 protocol.http.TooBigLine,則表示來自目標/ 後端伺服器的 HTTP 回應大小大於 Apigee Edge 中的上限上限。

追蹤工具

  1. 啟用追蹤工作階段,然後採取下列其中一種做法:
    1. 等待發生 502 Bad Gateway 錯誤。
    2. 如果可以重現問題,請發出 API 呼叫並重現 502 Bad Gateway 錯誤。
  2. 請選取其中一個失敗的要求,然後檢查追蹤記錄。
  3. 瀏覽追蹤記錄的不同階段,找出發生錯誤的位置。
  4. 您通常會在「要求傳送至目標伺服器」階段之後的 flowinfo「錯誤」階段看到錯誤,如下所示:

    記下追蹤記錄中的錯誤值:

    • 錯誤: response line exceeding 2,048
    • error.classcom.apigee.errors.http.server.BadGateway

    這表示 Apigee Edge (訊息處理器元件) 因回應行大小超出允許的上限,而在收到後端伺服器的回應時立即擲回錯誤。

  5. 您會在「Response 已傳送至用戶端」階段中看到傳送至用戶端的錯誤訊息,如下所示:

    ( 查看較大圖片)。

  6. 記下追蹤記錄中的錯誤值:
    • 錯誤: 502 Bad Gateway
    • 錯誤內容: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. 您也可以前往追蹤記錄中的 AX (Analytics (分析) 已記錄) 階段,按一下該階段即可查看錯誤詳細資料。

    ( 查看較大圖片)。

    請注意下列值:

    要求標頭
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    錯誤內容:內文 {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

NGINX

如何使用 NGINX 存取記錄檔診斷錯誤:

  1. 如果您是 Private Cloud 使用者,即可使用 NGINX 存取記錄檔來判斷 HTTP 502 錯誤的相關重要資訊。
  2. 查看 NGINX 存取記錄檔:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中:ORGENVPORT# 替換為實際值。

  3. 搜尋特定時間範圍內是否有任何 502 錯誤 (如果問題過去發生),或是否有任何要求仍失敗並顯示 502
  4. 如果在 X-Apigee-fault-code X-Apigee-fault-code 的值相符的情況下發現任何 502 錯誤,請判斷 X-Apigee-fault-code 的值。

    以上 NGINX 存取記錄中的範例項目,針對 X- Apigee-fault-codeX-Apigee-fault-source 提供下列值:

    回應標頭
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target

原因:回應行的大小超過允許的上限

診斷

  1. 使用 API 監控、追蹤工具或 NGINX 存取記錄檔,按照常見診斷步驟說明,找出錯誤的「Fault Code」和「Fault Source」
  2. 如果「Fault Source」的值為 target,表示目標/後端伺服器應用程式傳送至 Apigee 的 Response-Line 大小超過 Apigee Edge 中允許的限制
  3. 您可以使用下列任一方法驗證 Response-Line 的大小是否超過 2 KB 的限制:

    錯誤訊息

    如何使用錯誤訊息進行驗證:

    如果您可以存取 Apigee Edge 傳送的完整錯誤訊息,請參閱 faultstring

    錯誤訊息示例:

    "faultstring":"response line size exceeding 2,048"
    

    上述 faultstring 表示回應行的大小超過系統允許的上限 (2 KB)。

    實際要求

    如何使用實際要求進行驗證:

    如果您可以存取對目標/後端伺服器應用程式傳送的實際要求,請執行下列步驟:

    1. 確認回應行的大小
    2. 如果您發現 URI 大小超過 Apigee Edge 中的限制,就是問題原因。

      目標/後端伺服器的回應範例:

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0
      

      在上述範例中,回應行 HTTP/1.1 200 1111…<trimmed>...11111111 大於 2 KB,也就是超過 2 K ASCII 字元。

      如果您使用其他用戶端,可以查看用戶端記錄檔,並嘗試找出傳送至 Apigee Edge 的回應行大小。

    訊息處理器記錄

    如何使用訊息處理器記錄進行驗證:

    如果您是 Private Cloud 使用者,可以使用訊息處理器記錄檔來驗證回應行大小是否超過 Apigee Edge 中的限制

    1. 依據常見診斷步驟的說明,使用 API 監控、追蹤工具或 NGINX 存取記錄檔判斷失敗要求的訊息 ID。
    2. 在郵件處理器記錄中搜尋郵件 ID:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. 您會看到 system.log 的幾行程式碼,內容類似:

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
      

      上方錯誤訊息中的 message = response line size exceeding 2,048 文字表示「Response-Line」的大小超過 2 KB。因此,Apigee Edge 會擲回例外狀況,將含有錯誤代碼 protocol.http.TooBigline 502 狀態碼傳回至用戶端應用程式。

解析度

固定大小

選項 #1 [建議]:修正目標/後端伺服器應用程式,不要傳送大小超過允許限制的 Response-Lines

  1. 分析特定用戶端傳送大小超過「限制」中允許限制的回應原因。
  2. 如果無法採用,請修改目標/後端伺服器應用程式,使其傳送小於允許限制的 Response-Line。
  3. 如需要傳送超過允許限制的 Response-Line,請前往下一個選項。

CwC

選項 #2:使用 CwC 屬性提高回覆行數量上限

Apigee 提供 CwC 屬性,可讓您提高回應行的大小限制。詳情請參閱 設定訊息處理器的回應行限制

限制

Apigee 預期用戶端應用程式和後端伺服器不會傳送大小超出 Apigee 邊緣限制中「要求/回應行限制」限制的 Request/Response-Lines。

  1. 如果您是公開雲端使用者,則要求和回應行大小上限請參閱 Apigee Edge 限制中的 Request/Response-Line 大小上限。
  2. 如果您是私有雲使用者 ,您可能已修改要求和回應行大小的預設上限 (即便這不是建議做法)。如要決定回應行的大小上限,請按照如何查看目前限制中的指示操作。

如何查看目前的限制?

本節說明如何確認訊息處理器中的 HTTPResponse.line.limit 屬性已更新為新值。

  1. 在訊息處理器機器中,在 /opt/apigee/edge-message-processor/conf 目錄中搜尋 HTTPResponse.line.limit 屬性,並查看以下設定值:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. 上述指令的結果範例如下:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
    
  3. 請注意,在上述輸出範例中,請注意 http.properties 中的 HTTPResponse.line.limit 屬性已設為 2k 值。

    這表示在適用於私有雲的 Apigee 中,設定的回應行大小限制為 2 KB

如果您仍需獲得 Apigee 支援團隊的協助,請參閱「必須收集診斷資訊」一文。

必須收集診斷資訊

收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡:

如果您是公開雲端使用者,請提供下列資訊:

  • 機構組織名稱
  • 環境名稱
  • API Proxy 名稱
  • 用來重現 502 錯誤的完整 curl 指令
  • API 要求的追蹤檔

如果您是 Private Cloud 使用者,請提供下列資訊:

  • 觀察失敗要求的完整錯誤訊息
  • 機構組織名稱
  • 環境名稱
  • API Proxy 套裝組合
  • 失敗 API 要求的追蹤檔
  • 完成用來重現 502 錯誤的 curl 指令
  • NGINX 存取記錄檔 /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中:系統會將 ORGENVPORT# 替換為實際值。

  • 訊息處理器系統記錄 /opt/apigee/var/log/edge-message-processor/logs/system.log