查看 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 診斷錯誤:
- 以下列使用者身分登入 Apigee Edge UI: 擔任適當角色
切換至您要調查問題的機構
- 前往「Analyze」(分析) >「API 監控 >調查頁面。
- 請選取您發現錯誤的確切時間範圍。
- 您可以選取「Proxy」篩選器來縮小錯誤程式碼的範圍。
- 根據「時間」繪製「Fault Code」指標。
選取包含「錯誤程式碼」圖示
protocol.http.TooBigBody
的儲存格, 狀態碼413
,如下所示:錯誤程式碼
protocol.http.TooBigBody
的相關資訊顯示為 如下所示:- 按一下「查看記錄」,然後展開失敗要求的資料列。接著從
「Logs」(記錄) 視窗,記下詳細資料,如下所示:
未壓縮
情境 #1:要求以未壓縮格式傳送
在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
- 狀態碼:
413
- 錯誤來源:
proxy
- 錯誤代碼:
protocol.http.TooBigBody
。 - 要求長度(位元組):
15360440
(約 15 MB)
如果「Fault Source」的值為
proxy
,表示「Fault Code」 值為protocol.http.TooBigBody
和 Request 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
如何使用追蹤工具診斷錯誤:
- 啟用追蹤工作階段,並
- 等待
413 Request Entity Too Large
錯誤發生,或 - 如果可以重現問題,請發出 API 呼叫並重現問題
413 Request Entity Too Large
個錯誤
- 等待
確認已啟用「Show all Flow Infos」。
- 請選取其中一個失敗的要求,然後檢查追蹤記錄。
- 前往「Request Received from Client」階段。
未壓縮
情境 #1:要求以未壓縮格式傳送
請注意下列資訊:
- Content-Encoding:不存在
- 內容長度:
15360204
經過壓縮
情境 #2:要求以壓縮格式傳送酬載
請注意下列資訊:
- 內容編碼:
gzip
- 內容長度:
14969
- 內容類型:
application/x-gzip
- 瀏覽追蹤記錄的各個階段,找出失敗的部分。
錯誤通常會在 Request Received from 用戶端階段,如下所示:
- 記下追蹤記錄中的錯誤值。上述追蹤記錄範例顯示:
- 錯誤:
Body buffer overflow
- error.class:
com.apigee.errors.http.user.RequestTooLarge
- 錯誤:
前往「Response Sent to Client」(回應已傳送至用戶端),並記下 追蹤記錄。下列追蹤記錄範例顯示:
- 錯誤:
413 Request Entity Too Large
- 錯誤內容:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- 錯誤:
- 前往追蹤記錄中的「AX」AX(已記錄 Analytics 資料) 階段,並按一下該階段。
在「Phase Details」部分,向下捲動至「Variables Read」。
- 判斷變數 client.received.content.length 的值,這代表:
- 以未壓縮格式傳送的要求酬載實際大小,
- Apigee 解壓縮時的要求酬載大小 (當酬載 並以壓縮格式傳送一律與允許的值 限制 (10 MB)。
未壓縮
情境 #1:以未壓縮格式要求酬載
client.received.content.length 變數:
15360204
經過壓縮
情境 #2:以壓縮格式要求酬載
client.received.content.length 變數:
10489856
- 下表說明 Apigee 根據下列條件傳回
413
錯誤的原因: 根據 client.received.content.length 變數的值而定的兩種情境:情境 client.received.content.length 的值 失敗原因 以未壓縮格式要求酬載 約 15 MB 尺寸 >上限為 10 MB。 要求酬載 (壓縮格式) 約 10 MB 解壓縮後大小超過上限
NGINX
如何使用 NGINX 存取記錄診斷錯誤:
- 如果您是 Private Cloud 使用者,可以透過 NGINX 存取記錄檔判斷
提供 HTTP
413
錯誤的相關重要資訊。 查看 NGINX 存取記錄:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 搜尋,查看在特定期間是否有任何
413
錯誤 (如果為 或是發生任何請求失敗413
。 - 如果在 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 解壓縮時會達到限制。
原因:要求酬載大小超過允許的上限
診斷
- 判定號碼的「錯誤程式碼」、「錯誤來源」和「要求酬載大小」。 您在使用 API 監控、追蹤工具或 NGINX 存取記錄檔時觀察到錯誤,詳情請參閱 與情境 1 (未壓縮) 相關的常見診斷步驟。
- 如果 Fault Source 的值為
policy
或proxy
,則 表示用戶端應用程式傳送至 Apigee 的要求酬載大小大於 在 Apigee Edge 中允許的數量上限。 - 驗證從步驟 1 決定的要求酬載大小。
- 如果酬載大小 >上限為 10 MB,就是造成錯誤的原因。
- 如果酬載大小 <那麼可能會超出 10 MB 的大小上限 酬載是以壓縮格式傳遞。前往 原因:解壓縮後的要求酬載大小超過允許的上限
- 您也可以驗證要求酬載大小是否確實存在 >上限為 10 MB
透過下列步驟檢查實際要求:
- 如果您無法存取用戶端應用程式實際提出的要求,請前往 解析度:
- 如果您可以存取用戶端應用程式所提出實際要求,請進行
步驟如下:
- 驗證要求中傳遞的酬載大小。
- 如果您發現酬載大小超過 如果系統在 Apigee Edge 允許限制,就會造成問題。
要求範例:
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
。
診斷
- 判斷「錯誤程式碼」 、「錯誤來源」和「要求酬載大小」 。 針對使用 API 監控、追蹤工具或 NGINX 存取記錄觀察到的錯誤,詳見: 與情境 2 (壓縮後) 相關的常見診斷步驟。
- 如果「Fault Source」的值為
policy
或proxy
,則: 這表示用戶端應用程式傳送至 Apigee 的要求酬載大小較大 超過 Apigee Edge 中允許的數量上限。 - 驗證要求酬載大小 (如步驟 1 所述)。
- 如果酬載大小 >上限為 10 MB,就是造成錯誤的原因。
- 如果酬載大小 <那麼可能會超出 10 MB 的大小上限 酬載是以壓縮格式傳遞。在這種情況下,請檢查 內容酬載
- 您可以驗證用戶端發出的要求是否是以壓縮格式傳送,
未壓縮時的大小超過允許的上限,請使用下列其中一項參數
方法:
Trace
如何使用追蹤工具進行驗證:
實際要求
如要使用實際要求進行驗證,請按照下列步驟操作:
- 如果您無法存取用戶端應用程式實際提出的要求,請前往 解析度:
- 如果您可以存取用戶端應用程式所提出實際要求,請進行
步驟如下:
- 驗證要求中傳遞的酬載大小,以及
要求中傳送
Content-Encoding
標頭。 檢查酬載的未壓縮大小是否大於 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
的狀態。
- 驗證要求中傳遞的酬載大小,以及
要求中傳送
訊息處理器記錄
如何使用訊息處理器記錄進行驗證:
- 如果您是 Private Cloud 使用者,可以透過訊息處理者的記錄檔來判斷
提供 HTTP
413
錯誤的相關重要資訊。 查看訊息處理器記錄:
/opt/apigee/var/log/edge-message-processor/logs/system.log
搜尋並查看特定期間是否有任何
413
錯誤 (如果 問題),或是仍有任何要求因413
而失敗。你可以使用以下搜尋字串:
grep -ri "chunkCount"
grep -ri "RequestTooLarge"
- 您會看到
system.log
中的路線與下列內容相似的行 (TotalRead
和chunkCount
可能依情況而異):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
- 在解壓縮程序中,只要訊息處理器決定
讀取位元組 >10 MB 時,事件會停止並顯示下列一行:
Message is too large. TotalRead 10489856 chunkCount 2570
它表示要求酬載大小超過 10 MB,且 Apigee 擲回 當大小開始超過 10 MB 限制時,錯誤
RequestTooLarge
錯誤碼為protocol.http.TooBigBody
解析度
修正大小
選項 #1 [建議]:修正用戶端應用程式傳送酬載大小不應超過 允許的數量上限
- 分析特定用戶端傳送要求 / 酬載大小超過允許的原因 限制中所述的限額。
如果不是的話,請修改用戶端應用程式,使其傳送要求 / 酬載 大於允許的尺寸上限
在上述範例中,如要修正問題,您可以傳送較小的檔案 舉例來說,
test5mbfile
(大小為 5 MB) 酬載,如下所示:curl https://<host>/testtoobigbody -k -X POST -F file=@test5mbfile -v
- 如果可行,而您要傳送的要求/酬載超過允許的上限,請前往 下一個選項
已簽署的網址格式
選項 #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 限制。
- 如果您是公有雲使用者,則要求與回應數量上限
酬載大小與
Request/response size
Apigee Edge 限制。 - 如果您是 Private Cloud 使用者 ,可能已經修改過預設值 限制的要求和回應酬載大小限制 (即使這不是建議做法)。 如要判斷要求酬載大小上限,請遵循 如何查看目前的限制。
如何查看目前的限制?
本節說明如何驗證資源 HTTPRequest.body.buffer.limit
已透過訊息處理器上的新值進行更新。
- 在訊息處理器電腦上搜尋屬性
在
/opt/apigee/edge-message- processor/conf
目錄中的HTTPRequest.body.buffer.limit
,並使用下列指令碼查看已設定的值 指令:grep -ri "HTTPRequest.body.buffer.limit" /opt/apigee/edge-message-processor/conf
- 上述指令的結果範例如下:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.body.buffer.limit=10m
在上方輸出範例中,請注意 「
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
其中: ORG、ENV 和 PORT# 會替換為 實際價值
- 訊息處理器系統記錄:
/opt/apigee/var/log/edge-message-processor/logs/system.log