502 閘道錯誤 - TooBigLine

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

問題

用戶端應用程式收到 HTTP 狀態碼 502 Bad Gateway 和錯誤代碼 protocol.http.TooBigLine 做為 API 呼叫的回應。

錯誤訊息

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

HTTP/1.1 502 Bad Gateway

此外,您也可能會看到下列錯誤訊息:

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

可能原因

如果 Response-Line 大小由 將目標/後端伺服器連結到 Apigee 作為 HTTP 回應的邊緣大於允許的最大值 Apigee Edge 的相關限制

在探討這項錯誤的可能原因前,我們先來看看什麼是回應行 以及如何檢查其大小

瞭解回應線

一般 HTTP 回應包含三個部分:

  1. 狀態列 (在 Apigee 中稱為 Response-Line)
  2. ( HTTP 標頭集合)
  3. [ 內文 ]

Response-Line 由三個部分組成:通訊協定版本後面接著 數字 狀態碼及其相關文字詞組,如下所示:

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

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

瞭解回應行大小

  1. 在上述範例中,回應中的 start 行 (第一行) 也會 Response-Line 如下所示:

    HTTP/1.1 200 OK
    

    這個回應行的大小為 ~15 bytes,因為其中包含 15 ASCII characters。由於此屬性位於 Apigee Edge 中允許的上限,系統會將回應傳回給用戶端, 發生錯誤

  2. 同樣地,如果您查看 faultstring 錯誤訊息,其中包含 "response line size exceeding 2,048"。這表示 HTTP 回應中的 Response-Line 超過 2,048 個位元組

瞭解大型回應行

根據 狀態行 (稱為 Response-Line) 以及一般 HTTP 要求和 這個回應的大小將遠低於 Apigee Edge 中定義的預設上限 2 K。 因此我們可能不會 達到上限。但在某些情況下,可能會超過這項限制:

  1. 目標/後端伺服器不是 HTTP 系統。回應可能傳回非 HTTP 回應。
  2. 目標/後端伺服器發生問題,並傳送較長的 Response-Line 做為 HTTP 回應。

詳情請參閱 收到錯誤通訊協定.http.TooBigLine「回應行大小超過 2,048」

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

原因 說明 適用的疑難排解操作說明
回應行大小超過允許的上限 做為 對 Apigee Edge 的 HTTP 回應大於 在 Apigee Edge 中允許的數量上限 邊緣公有雲和私有雲使用者

常見的診斷步驟

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

API Monitoring

如何使用 API Monitoring 診斷錯誤:

  1. 以下列使用者身分登入 Apigee Edge UI 擔任適當角色
  2. 切換到您要調查問題的機構。

  3. 前往「Analyze」(分析) >「API 監控 >調查頁面。
  4. 請選取您發現錯誤的確切時間範圍。
  5. 您可以選取「Proxy」篩選器來縮小錯誤程式碼的範圍。
  6. 根據「時間」繪製「Fault Code」指標。
  7. 選取含有錯誤程式碼 protocol.http.TooBigLine 的儲存格 如下所示:

    ( 查看較大的圖片)

  8. 畫面上會顯示錯誤程式碼的相關資訊 protocol.http.TooBigLine,如下所示:

    ( 查看較大的圖片)

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

  10. 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
    • 狀態碼: 502
    • 錯誤來源: target
    • 錯誤代碼: protocol.http.TooBigLine
  11. 如果錯誤來源的值target錯誤 Code 的值是 protocol.http.TooBigLine,就表示 來自目標/ 後端伺服器的 HTTP 回應的 Response-Line 大小大於 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. 您會在傳送至用戶端的回應中 用戶端階段,如下所示:

    ( 查看較大的圖片)

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

    ( 查看較大的圖片)

    請注意下列值:

    要求標頭
    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 未顯示任何 502 錯誤 比對 protocol.http.TooBigLine 的值,然後 是 X-Apigee-fault-source. 的價值

    上述 NGINX 存取記錄的範例項目包含下列 X- Apigee-fault-code X-Apigee-fault-source:

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

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

診斷

  1. 針對使用 API 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 Monitoring、Trace 工具或 NGINX 存取記錄 常見的診斷步驟
  2. 如果 Fault Source 的值為 target,則表示 目標/後端伺服器應用程式傳送至 Apigee 的 Response-Line 大小大於 在 Apigee Edge 中允許限制
  3. 您可以使用 1 行程式碼,驗證 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 的 Response-Line 大小。

    訊息處理器記錄

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

    如果您是 Private Cloud 使用者,可將訊息處理者的記錄檔用於 檢查 Response-Line 大小是否超過 在 Apigee Edge 中允許限制

    1. 利用 API 監控、追蹤工具、追蹤工具 或 NGINX 存取記錄 (方法請見常見診斷步驟)。
    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 會擲回例外狀況,並傳回 502 狀態碼 產生錯誤程式碼protocol.http.TooBigline 至用戶端應用程式

解析度

修正大小

選項 #1 [建議]:修正無法傳送目標/後端伺服器應用程式的問題 回應行的大小超過允許的上限

  1. 分析特定客戶的原因,以便傳送更多大小的回應行 超出限制中定義的允許上限。
  2. 如果不是,請修改目標/後端伺服器應用程式,使其 傳送的大小低於允許的上限。
  3. 如果您希望回應的話,而您想傳送大於 請前往下一個選項

CwC

方法 #2:使用 CwC 屬性提高回應行上限

Apigee 提供 CwC 屬性,以便增加回應行的大小限制。 詳情請參閱 設定訊息處理器的回應行限制

限制

Apigee 預期用戶端應用程式和後端伺服器不會傳送要求/回應行 大小超出要求/回應行數限制所述的允許上限 在 Apigee Edge 限制中。

  1. 如果您是 Public Cloud 使用者,則要求與要求的上限 回應行大小如以下所示的 Request/Response-Line 大小Apigee Edge 限制
  2. 如果您是 Private Cloud 使用者 ,可能已修改預設上限 請求和回應行的大小限制 (即使並非建議做法)。 您可以按照 如何查看目前的限制

如何查看目前的限制?

本節說明如何驗證 HTTPResponse.line.limit 資源 已透過訊息處理器上的新值進行更新。

  1. 在訊息處理器電腦上搜尋屬性 HTTPResponse.line.limit/opt/apigee/edge-message-processor/conf 目錄,然後查看 各設定的值如下所示:
    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. 請注意,在上方的輸出範例中,請注意屬性 HTTPResponse.line.limit 已在 http.properties 中設為 2k

    這表示在 Apigee 中為不公開狀態所設定的回應行大小限制 雲端為 2 KB

如果仍需 Apigee 支援團隊的協助,請前往 必須收集診斷資訊

必須收集診斷資訊

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

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

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

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

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

    其中: ORGENVPORT# 會替換為 實際價值

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