502 閘道錯誤 - TooBigHeaders

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

問題

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

錯誤訊息

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"response headers size exceeding 25,600",
      "detail":{
         "errorcode":"protocol.http.TooBigHeaders"
      }
   }
}

可能原因

如果目標/後端傳送的標頭總大小,就會發生這個錯誤 作為 HTTP 回應一部分時,將伺服器傳送至 Apigee Edge 在 Apigee Edge 中允許的限制

以下是導致這個錯誤的可能原因:

原因 說明 適用的疑難排解操作說明
回應中的標頭大小超過允許的上限 某個標頭的大小,或是所有 目標/後端伺服器在 HTTP 回應至 Apigee Edge 時一併傳送的標頭 超過 Apigee Edge 中允許的數量上限 邊緣公有雲和私有雲使用者

常見的診斷步驟

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

API Monitoring

如何使用 API Monitoring 診斷錯誤:

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

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

    ( 查看較大的圖片)

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

    ( 查看較大的圖片)

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

    ( 查看較大的圖片)

  10. 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
    • 狀態碼: 502
    • 錯誤來源: target
    • 錯誤代碼: protocol.http.TooBigHeaders
  11. 如果錯誤來源的值target錯誤 Code 的值是 protocol.http.TooBigHeaders,就表示 來自目標/ 後端伺服器的 HTTP 回應,含有大小更大的標頭 超過 Apigee Edge 中允許的數量上限

追蹤工具

  1. 啟用追蹤工作階段 和下列其中一項:
    1. 等待 502 Bad Gateway 錯誤發生,或
    2. 如果可以重現問題,請發出 API 呼叫,並重現 502 Bad Gateway 錯誤。
  2. 請選取其中一個失敗的要求,然後檢查追蹤記錄。
  3. 瀏覽追蹤記錄的各個階段,找出失敗之處 發生。
  4. 通常您會在名為 Error 的流程中,緊接在 要求已傳送至目標伺服器階段,如下所示:

    ( 查看較大的圖片)

    請注意追蹤記錄中的錯誤值:

    • 錯誤: response headers size exceeding 25,600
    • error.classcom.apigee.errors.http.server.BadGateway

    這表示 Apigee Edge (訊息處理器元件) 將錯誤擲回 因標頭大小而收到來自後端伺服器的回應時。 超過允許的上限

  5. 您會在 Response Sent to Client 中看到失敗的結果 Apigee Edge 傳送的錯誤回應,如下所示:

    ( 查看較大的圖片)

  6. 記下追蹤記錄中的錯誤值。上述追蹤記錄範例顯示:
    • 錯誤: 502 Bad Gateway
    • 錯誤內容: {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
  7. 前往追蹤記錄中的「AX」AX(已記錄的 Analytics 資料) 階段 然後按一下即可查看相關詳情

    ( 查看較大的圖片)

    請注意下列值:

    錯誤標頭
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source target
    錯誤內容:內文 {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}

NGINX

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

  1. 如果您是 Private Cloud 使用者,可以使用 NGINX 存取記錄 然後判斷 HTTP 502 Bad Gateway 的重要資訊。
  2. 查看 NGINX 存取記錄:

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

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

  3. 搜尋是否有任何502錯誤 在特定期間傳回錯誤代碼 protocol.http.TooBigHeaders (如果問題是過去發生) 或者 502
  4. 如果 X-Apigee-fault-code 未顯示任何 502 錯誤 比對 protocol.http.TooBigHeaders 的值,然後 是 X-Apigee-fault-source. 的價值

    NGINX 存取記錄中的 502 錯誤示例:

    上述 NGINX 存取記錄的範例項目如下 X-Apigee-fault-code X-Apigee-fault-code

    錯誤標頭
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source target

原因:回應中的標頭大小超出允許的上限

診斷

  1. 判定錯誤程式碼錯誤來源回應酬載大小 您在使用 API 監控、追蹤工具或 NGINX 存取記錄檔時觀察到錯誤,詳情請參閱 常見的診斷步驟
  2. 如果「Fault Source」的值為 target,則表示 目標/後端伺服器傳送給 Apigee 的回應具有較大的標頭大小 超過 Apigee Edge 允許的數量上限
  3. 您可以驗證來自目標/後端的回應是否具有大小是 大於允許的數量上限:

    錯誤訊息

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

    如果您可以存取 Apigee Edge 收到的完整錯誤訊息, 請參閱 faultstringfaultstring 表示 回應標頭大小超出允許的上限。

    錯誤訊息示例:

    "faultstring":"response headers size exceeding 25,600"
    

    在上述錯誤訊息中,請注意 faultstring 回應中的標頭總大小超過允許的上限

    實際要求

    如要使用實際要求進行驗證,請按照下列步驟操作:

    如果您可以存取對目標/後端伺服器提出的實際要求, 然後執行下列步驟:

    1. 如果您是公用 Cloud/Private Cloud 使用者,請提出要求 或從後端伺服器本身 可讓您向後端提出要求的機器 伺服器
    2. 如果您是 Private Cloud 使用者,也可以提出要求: 將要求傳送至後端伺服器
    3. 檢查從後端伺服器接收的回應,特別是 運算並驗證回應中傳遞的標頭總大小。
    4. 如果您發現回應酬載中的標頭大小 超過 Apigee Edge 中允許的數量上限。 這就是問題的原因

      目標伺服器的回應範例:

      curl -v https://TARGET_SERVER_HOST/test
      
      * About to connect() to 10.1.0.10 port 9000 (#0)
      *   Trying 10.1.0.10...
      * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0)
      > GET /test HTTP/1.1
      > User-Agent: curl/7.29.0
      > Host: 10.1.0.10:9000
      > Accept: */*
      <
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Length: 0
      < Content-Type: text/plain; charset=utf-8
      < Last-Modified: Tue, 20 Jul 2021 09:23:56 GMT
      < Testheader1: XVlBzgba—-<snipped>---THctcuAx
      < Testheader2: hxKQFDaFpLSj—-<snipped>---FbcXoEFfRsWxP
      < Date: Fri, 23 Jul 2021 09:51:22 GMT
      <
      * Connection #0 to host 10.1.0.10 left intact
      

      在上述範例中,Testheader1Testheader2 的大小較高,因此 因為這項錯誤超過 Apigee Edge

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

    訊息處理器記錄

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

    如果您是私有雲使用者,可以透過訊息處理器的記錄檔 驗證回應標頭大小是否超過 在 Apigee Edge 中允許的限制

    1. 查看訊息處理器記錄:

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

    2. 搜尋,查看特定期間是否有任何 502 錯誤 期間 (如果問題過去發生) 或有任何請求 仍因 502 失敗您可能會使用以下搜尋字串:
      grep -ri "response headers size exceeding"
      
    3. 您會看到 system.log 中的行,如下所示。 回應標頭大小可能會因您的情況而異:
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest rev:1
      messageid:r23ijb1b-1  NIOThread@1 ERROR HTTP.CLIENT -
      HTTPClient$Context$3.onException() :  ClientChannel[Connected:
      Remote:3.7.1.1:9000 Local:192.168.2.1:56098]@8414 useCount=1
      bytesRead=0 bytesWritten=207 age=640ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response headers size exceeding 25,600
      
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest
      rev:1 messageid:r23ijb1b-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@31f3ef88, response headers size exceeding 25,600)
      
    4. 訊息處理者從後端/目標取得回應後 伺服器發現標頭總大小超過 25 KB 指令便會停止並擲回錯誤:

      response headers size exceeding 25,600

      它表示總標頭大小超過 25 KB,且 Apigee 如果大小開始超過 25 KB 的限制 (包含故障程式碼),就會擲回錯誤 本裝置:protocol.http.TooBigHeaders

解析度

修正大小

選項 #1 [建議]:修正目標伺服器應用程式不要傳送標頭大小的問題 超過 Apigee 限制

  1. 分析特定目標伺服器的原因,進一步傳送回應標頭大小 超出限制中定義的允許上限。
  2. 如果不是,請修改後端伺服器應用程式,將其從 回應標頭的大小小於允許的限制 Apigee Edge
  3. 檢查是否能在回應內文中傳送標頭資訊。
  4. 可以的話,請傳送您打算傳送的任何大量資訊 回應主體中的標頭以免超出回應時間 標頭限制。
,瞭解如何調查及移除這項存取權。

CwC

方法 #2:使用 CwC 屬性增加回應標頭大小限制

Apigee 提供 CwC 屬性,允許提高回應標頭大小上限。 詳情請參閱 設定訊息處理器的限制

限制

Apigee 預期用戶端應用程式和後端伺服器不會傳送 標題大小超出文件說明的數量上限 中要求/回應標頭大小 Apigee Edge 限制

  1. 如果您是公有雲使用者,則 要求和回應標頭大小如以下所示:要求/回應標頭大小Apigee Edge 限制
  2. 如果您是 Private Cloud 使用者 ,可能已修改預設上限 要求和回應標頭的大小限制 (即使這不是建議做法)。 如需確認回應標頭大小上限,請參閱 如何查看目前的限制

如何查看目前的限制?

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

  1. 在訊息處理器電腦上搜尋屬性 HTTPResponse.headers.limit/opt/apigee/edge-message-processor/conf 目錄,然後查看 各設定的值如下所示:
    grep -ri "HTTPResponse.headers.limit" /opt/apigee/edge-message-processor/conf
    
  2. 上述指令的結果範例如下:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.headers.limit=25k
    
  3. 在上方的輸出內容範例中,請注意屬性 HTTPResponse.headers.limit 已在 http.properties 中設為 25k

    這表示在 Apigee 中為不公開設定的回應酬載大小限制 雲端為 25 KB

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

必須收集診斷資訊

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

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

  • 機構名稱
  • 環境名稱
  • API Proxy 名稱
  • 完成 curl 指令 (用來重現 502 錯誤)
  • 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