Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến tài liệu về
Apigee X. thông tin
Triệu chứng
Ứng dụng sẽ nhận một mã trạng thái HTTP 413 Request Entity Too Large
với mã lỗi protocol.http.TooBigBody
làm phản hồi cho lệnh gọi API.
Thông báo lỗi
Ứng dụng khách nhận được mã phản hồi sau đây:
HTTP/1.1 413 Request Entity Too Large
Ngoài ra, bạn có thể nhận thấy thông báo lỗi sau:
{ "fault":{ "faultstring":"Body buffer overflow", "detail":{ "errorcode":"protocol.http.TooBigBody" } } }
Các nguyên nhân có thể
Lỗi này xảy ra nếu kích thước tải trọng mà ứng dụng khách gửi đến Apigee Edge trong yêu cầu HTTP lớn hơn giới hạn được cho phép trong Apigee Edge .
Dưới đây là các nguyên nhân có thể gây ra lỗi này :
Nguyên nhân | Nội dung mô tả | Hướng dẫn khắc phục sự cố áp dụng cho |
---|---|---|
Kích thước tải trọng của yêu cầu lớn hơn giới hạn cho phép | Kích thước tải trọng mà ứng dụng khách gửi qua yêu cầu HTTP tới Apigee Edge vượt quá giới hạn cho phép trong Apigee Edge. | Người dùng Edge Public và Private Cloud |
Yêu cầu kích thước tải trọng vượt quá giới hạn cho phép sau khi giải nén | Kích thước tải trọng mà ứng dụng khách gửi ở định dạng nén trong yêu cầu HTTP tới Apigee Edge vượt quá giới hạn cho phép khi được giải nén bằng Apigee Edge. | Người dùng Edge Public và Private Cloud |
Các bước chẩn đoán phổ biến
Hãy sử dụng một trong các công cụ/kỹ thuật sau để chẩn đoán lỗi này:
Giám sát API
Cách chẩn đoán lỗi bằng tính năng Giám sát API:
- Đăng nhập vào giao diện người dùng Apigee Edge với tư cách là một người dùng có vai trò thích hợp.
Chuyển sang tổ chức mà bạn muốn điều tra vấn đề
- Chuyển đến trang Phân tích > Giám sát API > Điều tra.
- Chọn khung thời gian cụ thể mà bạn quan sát thấy lỗi.
- Bạn có thể chọn bộ lọc Proxy để thu hẹp mã lỗi.
- Vẽ Mã lỗi dựa trên Thời gian.
Chọn một ô có Mã lỗi
protocol.http.TooBigBody
và Mã trạng thái413
như bên dưới:Thông tin về mã lỗi
protocol.http.TooBigBody
hiển thị như sau:- Nhấp vào Xem nhật ký rồi mở rộng hàng cho yêu cầu không thành công. Sau đó, trong cửa sổ Logs (Nhật ký), hãy lưu ý thông tin chi tiết như sau :
Không nén
Tình huống 1: Yêu cầu tải trọng được gửi ở dạng không nén
Trong cửa sổ Nhật ký, hãy lưu ý những thông tin chi tiết sau:
- Mã trạng thái:
413
- Nguồn lỗi:
proxy
- Mã lỗi:
protocol.http.TooBigBody
. - Độ dài yêu cầu(byte):
15360440
(~15 MB)
Nếu Nguồn lỗi có giá trị
proxy
, thì Mã lỗi sẽ có giá trịprotocol.http.TooBigBody
và Độ dài yêu cầu lớn hơn 10 MB, thì tức là yêu cầu HTTP từ ứng dụng có kích thước tải trọng yêu cầu lớn hơn giới hạn được cho phép trong Apigee.Đã nén
Tình huống 2: Yêu cầu tải trọng được gửi ở dạng nén
Trong cửa sổ Logs (Nhật ký), hãy lưu ý những thông tin chi tiết sau:
- Mã trạng thái:
413
- Nguồn lỗi:
proxy
- Mã lỗi:
protocol.http.TooBigBody
. - Độ dài yêu cầu(byte):
15264
(~15kB)
Nếu Nguồn lỗi có giá trị
proxy
, thì Mã lỗi sẽ có giá trịprotocol.http.TooBigBody
và Độ dài yêu cầu nhỏ hơn 10 MB, thì tức là yêu cầu HTTP từ ứng dụng có kích thước tải trọng yêu cầu thấp hơn giới hạn cho phép ở định dạng nén, nhưng kích thước tải trọng lớn hơn giới hạn cho phép khi được giải nén bằng Apigee. - Mã trạng thái:
Trace
Cách chẩn đoán lỗi bằng công cụ Theo dõi:
- Bật tính năng phiên theo dõi và
- Chờ lỗi
413 Request Entity Too Large
xảy ra hoặc - Nếu bạn có thể tái hiện vấn đề đó, hãy thực hiện lệnh gọi API và tái hiện lỗi
413 Request Entity Too Large
- Chờ lỗi
Nhớ bật tuỳ chọn Hiển thị tất cả thông tin luồng.
- Chọn một trong các yêu cầu không thành công rồi kiểm tra dấu vết.
- Chuyển đến giai đoạn Đã nhận yêu cầu từ ứng dụng.
Không nén
Tình huống 1: Yêu cầu tải trọng được gửi ở dạng không nén
Xin lưu ý những thông tin sau:
- Mã hoá nội dung: không có
- Content-Length:
15360204
Đã nén
Tình huống 2: Yêu cầu tải trọng được gửi ở dạng nén
Xin lưu ý những thông tin sau:
- Mã hoá nội dung:
gzip
- Content-Length:
14969
- Loại nội dung:
application/x-gzip
- Di chuyển qua các giai đoạn trong quá trình theo dõi và xác định vị trí xảy ra lỗi.
Bạn thường sẽ thấy lỗi này trong một quy trình sau giai đoạn Yêu cầu nhận được từ ứng dụng như minh hoạ dưới đây:
- Ghi lại giá trị của lỗi trong dấu vết. Dấu vết mẫu ở trên cho thấy:
- lỗi:
Body buffer overflow
- error.class:
com.apigee.errors.http.user.RequestTooLarge
- lỗi:
Chuyển đến Response Sent to Client (Phản hồi được gửi tới ứng dụng khách) và ghi lại các giá trị của lỗi trong dấu vết. Dấu vết mẫu dưới đây cho thấy:
- lỗi:
413 Request Entity Too Large
- Nội dung lỗi:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- lỗi:
- Chuyển đến Giai đoạn AX (Dữ liệu phân tích được ghi lại) trong dấu vết rồi nhấp vào đó.
Trong mục Chi tiết giai đoạn, hãy cuộn xuống mục Đọc biến.
- Xác định giá trị của biến client.forward.content.length, cho biết rằng:
- Kích thước thực tế của tải trọng yêu cầu khi nó được gửi ở định dạng không nén và
- Kích thước của tải trọng yêu cầu khi giải nén bằng Apigee, khi tải trọng được gửi ở định dạng nén. Giá trị này sẽ luôn bằng với giá trị giới hạn cho phép (10 MB) trong trường hợp này.
Không nén
Tình huống 1: Yêu cầu tải trọng ở dạng không nén
Biến client.received.content.length:
15360204
Đã nén
Tình huống 2: Yêu cầu trọng tải ở định dạng nén
Biến client.received.content.length:
10489856
- Bảng sau đây giải thích lý do Apigee được Apigee trả về lỗi
413
trong 2 trường hợp này dựa trên giá trị của biến client.received.content.length:Trường hợp Giá trị của client.forward.content.length Lý do không thành công Yêu cầu tải trọng ở định dạng không nén Khoảng 15 MB Kích thước > giới hạn cho phép là 10 MB. Tải trọng yêu cầu ở định dạng nén Khoảng 10 MB Đã vượt quá giới hạn kích thước khi giải nén
NGINX
Cách chẩn đoán lỗi bằng nhật ký truy cập NGINX:
- Nếu là người dùng Đám mây riêng tư, bạn có thể dùng nhật ký truy cập NGINX để xác định thông tin chính về lỗi HTTP
413
. Kiểm tra nhật ký truy cập NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Tìm kiếm xem có lỗi
413
nào trong một khoảng thời gian cụ thể hay không (nếu vấn đề đã xảy ra trong quá khứ) hoặc có yêu cầu nào vẫn không thành công với413
hay không. - Nếu bạn tìm thấy bất kỳ lỗi
413
nào trong đó X-Apigee-fault-code khớp giá trị của X-Apigee-fault-code , thì hãy xác định giá trị của X-Apigee-fault-codeKhông nén
Tình huống 1 : Yêu cầu kích thước tải trọng ở định dạng không nén
Mục mẫu ở trên từ nhật ký truy cập NGINX có các giá trị sau đây cho X-Apigee-fault-code và X-Apigee-fault-code
Tiêu đề phản hồi Giá trị X-Apigee-fault-code protocol.http.TooBigBody
X-Apigee-fault-sourc policy
Lưu ý Độ dài yêu cầu:
15360440
(14,6 MB > giới hạn cho phép)Đã nén
Tình huống 2 : Yêu cầu kích thước tải trọng ở định dạng nén
Mục mẫu ở trên từ nhật ký truy cập NGINX có các giá trị sau đây cho X-Apigee-fault-code và X-Apigee-fault-code
Tiêu đề phản hồi Giá trị X-Apigee-fault-code protocol.http.TooBigBody
X-Apigee-fault-source policy
Lưu ý Độ dài yêu cầu:
15264
(14,9 K < giới hạn cho phép)Trong trường hợp này, Apigee Edge trả về
413
mặc dù Yêu cầu dài hơn thấp hơn giới hạn cho phép vì có thể yêu cầu đã được gửi ở định dạng nén và kích thước của tải trọng vượt quá giới hạn khi giải nén của Apigee Edge.
Nguyên nhân: Yêu cầu kích thước tải trọng lớn hơn giới hạn cho phép
Chẩn đoán
- Xác định Mã lỗi, Nguồn lỗi và Yêu cầu kích thước tải trọng cho lỗi quan sát được bằng tính năng Giám sát API, Công cụ theo dõi hoặc nhật ký truy cập NGINX như giải thích trong phần Các bước chẩn đoán phổ biến trong Tình huống #1 (không nén).
- Nếu Nguồn lỗi có giá trị
policy
hoặcproxy
, thì tức là kích thước tải trọng của yêu cầu mà ứng dụng khách gửi tới Apigee lớn hơn giới hạn được cho phép trong Apigee Edge. - Xác minh Yêu cầu kích thước tải trọng như xác định trong bước #1.
- Nếu kích thước tải trọng > giới hạn cho phép là 10 MB, thì đó là nguyên nhân gây ra lỗi.
- Nếu kích thước tải trọng < 10 MB trong giới hạn cho phép, thì có thể tải trọng yêu cầu sẽ được truyền ở định dạng nén. Truy cập Nguyên nhân: Yêu cầu kích thước tải trọng vượt quá giới hạn cho phép sau khi giải nén
- Bạn cũng có thể xác thực xem kích thước tải trọng yêu cầu có thực sự vượt quá giới hạn cho phép 10 MB hay không bằng cách kiểm tra yêu cầu thực tế theo các bước sau:
- Nếu bạn không có quyền truy cập vào yêu cầu thực tế do ứng dụng đưa ra, hãy chuyển đến mục Resolution (Giải pháp).
- Nếu bạn có quyền truy cập vào yêu cầu thực tế do ứng dụng đưa ra, hãy thực hiện các bước sau:
- Xác minh kích thước của tải trọng được chuyển trong yêu cầu.
- Nếu bạn nhận thấy kích thước của tải trọng vượt quá giới hạn cho phép trong Apigee Edge, thì đó chính là nguyên nhân của vấn đề.
Yêu cầu mẫu:
curl http://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile -v
Trong trường hợp trên, tệp
test15mbfile
có kích thước ~15 MB. Nếu bạn đang dùng một số ứng dụng khác, hãy lấy nhật ký ứng dụng để tìm kích thước tải trọng đang được gửi.
Độ phân giải
Chuyển đến mục Độ phân giải.
Nguyên nhân: Yêu cầu Kích thước tải trọng vượt quá giới hạn cho phép sau khi giải nén
Nếu tải trọng yêu cầu được gửi ở định dạng nén và tiêu đề yêu cầu Content-Encoding
được đặt thành gzip,
Apigee sẽ giải nén tải trọng yêu cầu. Trong quá trình giải nén, nếu Apigee nhận thấy kích thước tải trọng lớn hơn 10 MB,
giới hạn cho phép, thì ứng dụng sẽ dừng giải nén thêm và phản hồi lại
ngay lập tức bằng 413 Request Entity Too Large
với mã lỗi
protocol.http.TooBigBody
.
Chẩn đoán
- Xác định Mã lỗi, Nguồn lỗi và Yêu cầu kích thước tải trọng cho lỗi quan sát được bằng tính năng Giám sát API, Công cụ theo dõi hoặc nhật ký Truy cập NGINX như giải thích trong phần Các bước chẩn đoán phổ biến trong Tình huống #2 (được nén).
- Nếu Nguồn lỗi có giá trị
policy
hoặcproxy
, thì tức là kích thước tải trọng yêu cầu mà ứng dụng khách gửi tới Apigee lớn hơn giới hạn được cho phép trong Apigee Edge. - Xác minh Kích thước tải trọng của yêu cầu theo xác định trong bước 1.
- Nếu kích thước tải trọng > giới hạn cho phép là 10 MB, thì đó là nguyên nhân gây ra lỗi.
- Nếu kích thước tải trọng < 10 MB trong giới hạn cho phép, thì có thể tải trọng yêu cầu sẽ được truyền ở định dạng nén. Trong trường hợp này, hãy kiểm tra kích thước chưa nén của tải trọng yêu cầu nén.
- Bạn có thể xác thực xem yêu cầu của ứng dụng được gửi ở định dạng nén và kích thước không nén có lớn hơn giới hạn cho phép hay không bằng một trong những phương thức sau:
Trace
Cách xác thực bằng công cụ Theo dõi:
- Nếu bạn đã thu thập được dấu vết của yêu cầu không thành công, hãy tham khảo các bước được nêu chi tiết trong bài viết Dấu vết và
- Xác định giá trị của biến client.received.content.length
- Xác minh xem yêu cầu của ứng dụng có chứa tiêu đề Content-Encoding:
gzip
hay không
- Nếu giá trị của biến client.received.content.length lớn hơn 10 MB,
giới hạn cho phép và tiêu đề yêu cầu Content-Encoding:
gzip
, thì đó chính là nguyên nhân gây ra lỗi này.
Yêu cầu thực tế
Cách xác thực bằng yêu cầu thực tế:
- Nếu bạn không có quyền truy cập vào yêu cầu thực tế do ứng dụng đưa ra, hãy chuyển đến mục Resolution (Giải pháp).
- Nếu bạn có quyền truy cập vào yêu cầu thực tế do ứng dụng đưa ra, hãy thực hiện các bước sau:
- Xác minh kích thước của tải trọng được truyền trong yêu cầu cùng với tiêu đề
Content-Encoding
được gửi trong yêu cầu. Kiểm tra xem kích thước không nén của tải trọng có vượt quá giới hạn cho phép trong Apigee Edge hay không
Yêu cầu mẫu:
curl https://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile.gz -H "Content-Encoding: gzip" -v
Trong trường hợp trên, tệp
test15mbfile.gz
nhỏ hơn giới hạn kích thước; tuy nhiên, kích thước của tệp không néntest15mbfile
là ~15 MB và tiêu đềContent-Encoding
làgzip
.Nếu bạn đang dùng một ứng dụng nào đó khác, hãy lấy nhật ký ứng dụng để tìm hiểu kích thước tải trọng đang được gửi và liệu tiêu đề
Content-Encoding
có được đặt thànhgzip
hay không.
- Xác minh kích thước của tải trọng được truyền trong yêu cầu cùng với tiêu đề
Nhật ký Trình xử lý thư
Cách xác thực bằng nhật ký Trình xử lý thông báo:
- Nếu là người dùng Đám mây riêng tư, bạn có thể sử dụng nhật ký Trình xử lý thư để xác định thông tin quan trọng về lỗi HTTP
413
. Kiểm tra nhật ký Trình xử lý thư:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Tìm kiếm để xem có lỗi
413
nào trong một khoảng thời gian cụ thể hay không (nếu đã xảy ra vấn đề trong quá khứ) hoặc có yêu cầu nào vẫn không thành công với413
hay không.Bạn có thể sử dụng các chuỗi tìm kiếm sau:
grep -ri "chunkCount"
grep -ri "RequestTooLarge"
- Bạn sẽ thấy các dòng từ
system.log
tương tự như sau (TotalRead
vàchunkCount
có thể khác nhau tuỳ theo trường hợp của bạn):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
- Trong quá trình giải nén, ngay khi xác định rằng tổng số byte đã đọc lớn hơn 10 MB, Bộ xử lý thông báo sẽ dừng và in dòng sau:
Message is too large. TotalRead 10489856 chunkCount 2570
Tức là Request Payload Size (Kích thước tải trọng yêu cầu) lớn hơn 10 MB và Apigee sẽ gửi lỗi
RequestTooLarge
khi kích thước bắt đầu vượt quá giới hạn 10 MB với mã lỗi làprotocol.http.TooBigBody
- Nếu bạn đã thu thập được dấu vết của yêu cầu không thành công, hãy tham khảo các bước được nêu chi tiết trong bài viết Dấu vết và
Độ phân giải
Cố định kích thước
Lựa chọn 1 [Nên dùng]: Khắc phục lỗi ứng dụng khách không gửi kích thước tải trọng lớn hơn giới hạn cho phép
- Phân tích lý do khiến ứng dụng cụ thể gửi yêu cầu / kích thước tải trọng vượt quá giới hạn cho phép như xác định trong phần Giới hạn.
Nếu điều này là không mong muốn, hãy sửa đổi ứng dụng khách của bạn để ứng dụng gửi yêu cầu / kích thước tải trọng nhỏ hơn giới hạn cho phép.
Trong ví dụ thảo luận ở trên, bạn có thể khắc phục vấn đề này bằng cách truyền một tệp có kích thước nhỏ hơn, giả sử tải trọng
test5mbfile
(với kích thước là 5 MB) như minh hoạ dưới đây:curl https://<host>/testtoobigbody -k -X POST -F file=@test5mbfile -v
- Nếu điều này là mong muốn và bạn muốn gửi một yêu cầu/trọng tải nhiều hơn giới hạn cho phép, hãy chuyển đến các lựa chọn tiếp theo.
Mẫu URL đã ký
Lựa chọn 2 [Nên dùng]: Sử dụng mẫu URL đã ký trong Apigee Javachú thích cho ứng dụng
Đối với các tải trọng lớn hơn 10 MB, Apigee khuyến nghị sử dụng mẫu URL đã ký trong Apigee JavaAnnotation, được minh hoạ trong ví dụ về Edge Annotation: Signed URL Generator trên GitHub.
Phát trực tiếp
Lựa chọn 3 : Sử dụng tính năng phát trực tuyến
Nếu proxy API của bạn cần xử lý các yêu cầu và/hoặc phản hồi rất lớn, bạn có thể bật tính năng truyền trực tuyến trong Apigee.
CwC
Lựa chọn 4 : Sử dụng thuộc tính CwC để tăng hạn mức vùng đệm
Bạn chỉ nên sử dụng tuỳ chọn này khi không thể sử dụng bất kỳ tuỳ chọn đề xuất nào vì có thể có vấn đề về hiệu suất nếu tăng kích thước mặc định.
Apigee cung cấp một thuộc tính CwC cho phép tăng giới hạn kích thước tải trọng cho yêu cầu và phản hồi. Để biết thông tin chi tiết, hãy tham khảo bài viết Đặt giới hạn kích thước thông báo trên Bộ định tuyến hoặc Trình xử lý thư
Các giới hạn
Apigee ứng dụng và máy chủ phụ trợ không gửi kích thước tải trọng lớn hơn giới hạn cho phép như được ghi trong tài liệu về Request/response size
trong Giới hạn của API Edge.
- Nếu bạn là người dùng Cloud công khai, thì giới hạn tối đa cho kích thước tải trọng yêu cầu và phản hồi như được ghi trong tài liệu
Request/response size
trong phần Giới hạn của API Pixel. - Nếu là người dùng Đám mây riêng tư , thì có thể bạn đã sửa đổi giới hạn mặc định đối với kích thước tải trọng của yêu cầu và phản hồi (mặc dù bạn không nên áp dụng phương pháp này). Bạn có thể xác định giới hạn kích thước tải trọng tối đa của yêu cầu bằng cách làm theo các hướng dẫn trong bài viết Cách kiểm tra giới hạn hiện tại.
Cách kiểm tra hạn mức hiện tại?
Phần này giải thích cách xác minh rằng thuộc tính HTTPRequest.body.buffer.limit
đã được cập nhật với một giá trị mới trên Bộ xử lý thông báo.
- Trên máy Trình xử lý thông báo, hãy tìm thuộc tính
HTTPRequest.body.buffer.limit
trong thư mục/opt/apigee/edge-message- processor/conf
rồi kiểm tra xem bạn đã đặt giá trị nào bằng lệnh sau:grep -ri "HTTPRequest.body.buffer.limit" /opt/apigee/edge-message-processor/conf
- Kết quả mẫu từ lệnh trên như sau:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.body.buffer.limit=10m
Trong kết quả ví dụ ở trên, hãy lưu ý rằng thuộc tính
HTTPRequest.body.buffer.limit
đã được thiết lập bằng giá trị10m
tronghttp.properties
.Mã này cho biết giới hạn đối với kích thước tải trọng của yêu cầu được định cấu hình trong Apigee dành cho đám mây riêng tư là 10 MB.
Nếu bạn vẫn cần Nhóm hỗ trợ Apigee hỗ trợ, hãy truy cập trang Phải thu thập thông tin chẩn đoán.
Phải thu thập thông tin chẩn đoán
Thu thập thông tin chẩn đoán sau đây, sau đó liên hệ với Bộ phận hỗ trợ API Apigee:
Nếu bạn là người dùng Public Cloud, hãy cung cấp những thông tin sau:
- Tên tổ chức
- Tên môi trường
- Tên proxy API
- Hoàn tất lệnh curl dùng để tái hiện lỗi
413
- Tệp theo dõi cho các yêu cầu API
Nếu bạn là người dùng Đám mây riêng tư, hãy cung cấp những thông tin sau:
- Đã phát hiện thấy thông báo lỗi hoàn chỉnh đối với các yêu cầu không thành công
- Tên tổ chức
- Tên môi trường
- Gói Proxy API
- Tệp theo dõi cho các yêu cầu API không thành công
- Hoàn tất lệnh curl dùng để tái hiện lỗi
413
Nhật ký truy cập NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Trong đó: ORG, ENV và PORT# được thay thế bằng giá trị thực tế.
- Nhật ký hệ thống của Bộ xử lý thư
/opt/apigee/var/log/edge-message-processor/logs/system.log