413 Request Entity Too Large - TooBigBody

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

問題

用戶端應用程式收到 HTTP 狀態碼 413 Request Entity Too Large 含有錯誤代碼 protocol.http.TooBigBody 做為 API 呼叫的回應。

錯誤訊息

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

HTTP/1.1 413 Request Entity Too Large

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

{
   "fault":{
      "faultstring":"Body buffer overflow",
      "detail":{
         "errorcode":"protocol.http.TooBigBody"
      }
   }
}

可能原因

如果用戶端應用程式將酬載大小傳送至 Apigee Edge, HTTP 要求大於 Apigee Edge 中允許的數量上限

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

原因 說明 適用的疑難排解操作說明
要求酬載大小超過允許的上限 用戶端應用程式在對 Apigee Edge 發出 HTTP 要求時,傳送的酬載大小為 超過 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.TooBigBody 的儲存格, 狀態碼 413,如下所示:

  8. 錯誤程式碼 protocol.http.TooBigBody 的相關資訊顯示為 如下所示:

  9. 按一下「查看記錄」,然後展開失敗要求的資料列。接著從 「Logs」(記錄) 視窗,記下詳細資料,如下所示:

    未壓縮

    情境 #1:要求以未壓縮格式傳送

    在「Logs」(記錄檔) 視窗中,記下下列詳細資料:

    • 狀態碼: 413
    • 錯誤來源: proxy
    • 錯誤代碼: protocol.http.TooBigBody
    • 要求長度(位元組): 15360440 (約 15 MB)

    如果「Fault Source」的值為 proxy,表示「Fault Code」 值為 protocol.http.TooBigBodyRequest Length 超過 10 MB,就表示用戶端的 HTTP 要求具有 要求酬載大小超過 Apigee 允許的限制

    經過壓縮

    情境 #2:要求以壓縮格式傳送酬載

    在「Logs」(記錄檔) 視窗中,記下下列詳細資料:

    • 狀態碼: 413
    • 錯誤來源: proxy
    • 錯誤代碼: protocol.http.TooBigBody
    • 要求長度(位元組): 15264 (約 15 KB)

    如果「Fault Source」的值為 proxy,表示「Fault Code」 值為 protocol.http.TooBigBody,「要求長度」為 不到 10 MB,就表示來自用戶端的 HTTP 要求 要求酬載的大小低於壓縮格式的允許上限,但 酬載大小大於 Apigee 未壓縮時的大小上限。

Trace

如何使用追蹤工具診斷錯誤:

  1. 啟用追蹤工作階段,並
    • 等待 413 Request Entity Too Large 錯誤發生,或
    • 如果可以重現問題,請發出 API 呼叫並重現問題 413 Request Entity Too Large 個錯誤
  2. 確認已啟用「Show all Flow Infos」

  3. 請選取其中一個失敗的要求,然後檢查追蹤記錄。
  4. 前往「Request Received from Client」階段。

    未壓縮

    情境 #1:要求以未壓縮格式傳送

    請注意下列資訊:

    • Content-Encoding:不存在
    • 內容長度: 15360204

    經過壓縮

    情境 #2:要求以壓縮格式傳送酬載

    請注意下列資訊:

    • 內容編碼: gzip
    • 內容長度: 14969
    • 內容類型: application/x-gzip
  5. 瀏覽追蹤記錄的各個階段,找出失敗的部分。
  6. 錯誤通常會在 Request Received from 用戶端階段,如下所示:

  7. 記下追蹤記錄中的錯誤值。上述追蹤記錄範例顯示:
    • 錯誤: Body buffer overflow
    • error.class: com.apigee.errors.http.user.RequestTooLarge
  8. 前往「Response Sent to Client」(回應已傳送至用戶端),並記下 追蹤記錄。下列追蹤記錄範例顯示:

    • 錯誤: 413 Request Entity Too Large
    • 錯誤內容: {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
  9. 前往追蹤記錄中的「AX」AX(已記錄 Analytics 資料) 階段,並按一下該階段。
  10. 在「Phase Details」部分,向下捲動至「Variables Read」

  11. 判斷變數 client.received.content.length 的值,這代表:
    • 以未壓縮格式傳送的要求酬載實際大小,
    • Apigee 解壓縮時的要求酬載大小 (當酬載 並以壓縮格式傳送一律與允許的值 限制 (10 MB)。
    ,瞭解如何調查及移除這項存取權。

    未壓縮

    情境 #1:以未壓縮格式要求酬載

    client.received.content.length 變數:15360204

    經過壓縮

    情境 #2:以壓縮格式要求酬載

    client.received.content.length 變數:10489856

  12. 下表說明 Apigee 根據下列條件傳回 413 錯誤的原因: 根據 client.received.content.length 變數的值而定的兩種情境:
    情境 client.received.content.length 的值 失敗原因
    以未壓縮格式要求酬載 約 15 MB 尺寸 >上限為 10 MB。
    要求酬載 (壓縮格式) 約 10 MB

    解壓縮後大小超過上限

NGINX

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

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

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

  3. 搜尋,查看在特定期間是否有任何 413 錯誤 (如果為 或是發生任何請求失敗 413
  4. 如果在 X-Apigee-fault-code 比對中發現任何 413 錯誤 protocol.http.TooBigBody的值,然後判斷 X-Apigee-fault-source.

    未壓縮

    情境 #1:以未壓縮格式要求酬載大小

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

    回應標頭
    X-Apigee-fault-code protocol.http.TooBigBody
    X-Apigee-fault-sourc policy

    注意要求長度: 15360440 (14.6 MB > 允許的大小上限)

    經過壓縮

    情境 #2:以壓縮格式要求酬載大小

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

    回應標頭
    X-Apigee-fault-code protocol.http.TooBigBody
    X-Apigee-fault-source policy

    注意要求長度: 15264 (14.9K,<允許的長度上限)

    在這個情境中,Apigee Edge 會傳回 413 要求長度低於系統允許的上限,因為要求可能會 以壓縮格式傳送,且酬載大小超過 Apigee Edge 解壓縮時會達到限制。

原因:要求酬載大小超過允許的上限

診斷

  1. 判定號碼的「錯誤程式碼」、「錯誤來源」和「要求酬載大小」。 您在使用 API 監控、追蹤工具或 NGINX 存取記錄檔時觀察到錯誤,詳情請參閱 與情境 1 (未壓縮) 相關的常見診斷步驟
  2. 如果 Fault Source 的值為 policyproxy,則 表示用戶端應用程式傳送至 Apigee 的要求酬載大小大於 在 Apigee Edge 中允許的數量上限
  3. 驗證從步驟 1 決定的要求酬載大小
  4. 您也可以驗證要求酬載大小是否確實存在 >上限為 10 MB 透過下列步驟檢查實際要求:
    1. 如果您無法存取用戶端應用程式實際提出的要求,請前往 解析度
    2. 如果您可以存取用戶端應用程式所提出實際要求,請進行 步驟如下:
      1. 驗證要求中傳遞的酬載大小。
      2. 如果您發現酬載大小超過 如果系統在 Apigee Edge 允許限制,就會造成問題。
      3. 要求範例:

        curl http://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile -v
        

        在上述案例中,test15mbfile 檔案的大小約為 15 MB。如果發生以下情況: 使用另一個用戶端,請取得用戶端記錄,找出所傳送的酬載大小。

解析度

前往「解析度」

原因:解壓縮後的要求酬載大小超過允許的上限

如果要求酬載是以壓縮格式和要求標頭傳送 將 Content-Encoding 設為 gzip, Apigee 解壓縮要求 酬載。在解壓縮程序中,如果 Apigee 發現酬載大小較大 超過 10 MB 允許上限,則系統會停止進一步解壓縮並回應 立即傳回「413 Request Entity Too Large」,並傳回錯誤代碼 protocol.http.TooBigBody

診斷

  1. 判斷「錯誤程式碼」 、「錯誤來源」和「要求酬載大小」 。 針對使用 API 監控、追蹤工具或 NGINX 存取記錄觀察到的錯誤,詳見: 與情境 2 (壓縮後) 相關的常見診斷步驟
  2. 如果「Fault Source」的值為 policyproxy,則: 這表示用戶端應用程式傳送至 Apigee 的要求酬載大小較大 超過 Apigee Edge 中允許的數量上限
  3. 驗證要求酬載大小 (如步驟 1 所述)。
    • 如果酬載大小 >上限為 10 MB,就是造成錯誤的原因。
    • 如果酬載大小 <那麼可能會超出 10 MB 的大小上限 酬載是以壓縮格式傳遞。在這種情況下,請檢查 內容酬載
  4. 您可以驗證用戶端發出的要求是否是以壓縮格式傳送, 未壓縮時的大小超過允許的上限,請使用下列其中一項參數 方法:

    Trace

    如何使用追蹤工具進行驗證:

    1. 如果您擷取失敗要求的追蹤記錄,請參閱 Trace
      1. 判斷 client.received.content.length 變數的值
      2. 檢查來自用戶端的要求是否包含 Content-Encoding: gzip 標頭
    2. 如果 client.received.content.length 變數的值大於 10 MB、 允許的上限和要求標頭 Content-Encoding: gzip,就是導致這項錯誤的原因。

    實際要求

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

    1. 如果您無法存取用戶端應用程式實際提出的要求,請前往 解析度
    2. 如果您可以存取用戶端應用程式所提出實際要求,請進行 步驟如下:
      1. 驗證要求中傳遞的酬載大小,以及 要求中傳送 Content-Encoding 標頭。
      2. 檢查酬載的未壓縮大小是否大於 Apigee Edge 的數量上限

        要求範例:

        curl https://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile.gz -H "Content-Encoding: gzip" -v
        

        在上述案例中,檔案 test15mbfile.gz 小於大小上限; 但未壓縮的 test15mbfile 檔案大小約為 15 MB, Content-Encoding 標頭為 gzip

        如果您使用其他用戶端,請取得用戶端記錄來確定酬載大小 以及 Content-Encoding 標頭設為 gzip 的狀態。

    訊息處理器記錄

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

    1. 如果您是 Private Cloud 使用者,可以透過訊息處理者的記錄檔來判斷 提供 HTTP 413 錯誤的相關重要資訊。
    2. 查看訊息處理器記錄:

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

    3. 搜尋並查看特定期間是否有任何 413 錯誤 (如果 問題),或是仍有任何要求因 413 而失敗。

      你可以使用以下搜尋字串:

      grep -ri "chunkCount"
      
      grep -ri "RequestTooLarge"
      
    4. 您會看到 system.log 中的路線與下列內容相似的行 (TotalReadchunkCount 可能依情況而異):
      2021-07-06 13:29:57,544  NIOThread@1 ERROR HTTP.SERVICE -
        TrackingInputChannel.checkMessageBodyTooLarge()
        : Message is too large.  TotalRead 10489856 chunkCount 2570
      
      2021-07-06 13:29:57,545  NIOThread@1 INFO  HTTP.SERVICE -
        ExceptionHandler.handleException()
        : Exception trace: com.apigee.errors.http.user.RequestTooLarge
        : Body buffer overflow
      
    5. 在解壓縮程序中,只要訊息處理器決定 讀取位元組 >10 MB 時,事件會停止並顯示下列一行:
      Message is too large.  TotalRead 10489856 chunkCount 2570
      

      它表示要求酬載大小超過 10 MB,且 Apigee 擲回 當大小開始超過 10 MB 限制時,錯誤 RequestTooLarge 錯誤碼為 protocol.http.TooBigBody

解析度

修正大小

選項 #1 [建議]:修正用戶端應用程式傳送酬載大小不應超過 允許的數量上限

  1. 分析特定用戶端傳送要求 / 酬載大小超過允許的原因 限制中所述的限額。
  2. 如果不是的話,請修改用戶端應用程式,使其傳送要求 / 酬載 大於允許的尺寸上限

    在上述範例中,如要修正問題,您可以傳送較小的檔案 舉例來說,test5mbfile (大小為 5 MB) 酬載,如下所示:

    curl https://<host>/testtoobigbody -k -X POST -F file=@test5mbfile -v
    

  3. 如果可行,而您要傳送的要求/酬載超過允許的上限,請前往 下一個選項

已簽署的網址格式

選項 #2 [建議]:在 Apigee Java 呼叫中使用已簽署的網址模式

如果酬載大於 10 MB,Apigee 會建議在 Apigee Java 摘要,以 邊緣呼叫:GitHub 上的已簽署網址產生器範例。

串流

方法 #3:使用串流功能

如果您的 API Proxy 需要處理非常大量的要求和/或回應,您可以 在 Apigee 中進行 streaming

CwC

方法 #4:使用 CwC 屬性提高緩衝區限制

這個選項只有在無法使用任何建議選項時,才應使用這個選項 如果提高預設大小,就會發生效能問題。

Apigee 提供 CwC 屬性,以便增加 請求和回應酬載大小上限詳情請參閱 設定路由器或訊息處理器的訊息大小限制

限制

Apigee 預期用戶端應用程式和後端伺服器傳送酬載大小不得超過 允許的數量上限 (如 Request/response size 所述) Apigee Edge 限制

  1. 如果您是公有雲使用者,則要求與回應數量上限 酬載大小與Request/response size Apigee Edge 限制
  2. 如果您是 Private Cloud 使用者 ,可能已經修改過預設值 限制的要求和回應酬載大小限制 (即使這不是建議做法)。 如要判斷要求酬載大小上限,請遵循 如何查看目前的限制

如何查看目前的限制?

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

  1. 在訊息處理器電腦上搜尋屬性 在 /opt/apigee/edge-message- processor/conf 目錄中的 HTTPRequest.body.buffer.limit,並使用下列指令碼查看已設定的值 指令:
    grep -ri "HTTPRequest.body.buffer.limit" /opt/apigee/edge-message-processor/conf
    
  2. 上述指令的結果範例如下:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.body.buffer.limit=10m
    
  3. 在上方輸出範例中,請注意 「HTTPRequest.body.buffer.limit」已設為 10m 這個值。 http.properties

    這表示在 Apigee 為不公開設定的要求酬載大小限制 雲端大小 10 MB

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

必須收集診斷資訊

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

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

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

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

  • 偵測到失敗要求的完整錯誤訊息
  • 機構名稱
  • 環境名稱
  • API Proxy 套裝組合
  • 失敗 API 要求的追蹤檔
  • 完成用於重現 413 錯誤的 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