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 khách sẽ nhận được mã trạng thái HTTP 502 Bad Gateway
kèm theo mã lỗi
messaging.adaptors.http.flow.DecompressionFailureAtResponse
để phản hồi API
cuộc gọi.
Thông báo lỗi
Ứng dụng sẽ nhận được mã phản hồi sau đây:
HTTP/1.1 502 Bad Gateway
Ngoài ra, bạn có thể nhận thấy thông báo lỗi tương tự như thông báo dưới đây:
{ "fault":{ "faultstring":"Decompression failure at response", "detail":{ "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse" } } }
Các nguyên nhân có thể
Lỗi này chỉ xảy ra nếu:
- Phương thức mã hoá được chỉ định trong tiêu đề phản hồi HTTP (từ máy chủ phụ trợ/máy chủ mục tiêu)
Content-Encoding
là hợp lệ và được hỗ trợ bởi Apigee Edge, - Định dạng tải trọng do máy chủ phụ trợ/mục tiêu gửi trong phản hồi HTTP
không
khớp với định dạng mã hoá được chỉ định trong tiêu đề
Content-Encoding
NHƯNG
Điều này là do Apigee Edge không thể giải mã tải trọng bằng phương thức mã hoá đã chỉ định kể từ khi
định dạng của tải trọng không cùng định dạng với định dạng mã hoá được chỉ định trong
Tiêu đề Content-Encoding
.
Dưới đây là một vài ví dụ về các giá trị được hỗ trợ Content-Encoding
và cách ứng dụng Apigee Edge
mong muốn cách biểu diễn tải trọng nằm trong các trường hợp đó:
Trường hợp | Content-Encoding | Biểu diễn tải trọng |
---|---|---|
Mã hoá đơn | gzip | Định dạng |
Mã hoá đơn | giảm | Định dạng này sử dụng cấu trúc |
Nhiều mã hoá | Nhiều mã hoá Ví dụ: trong trường hợp quá trình mã hoá được thực hiện hai lần, thì có thể:
|
Nhiều phương thức mã hoá được áp dụng cho tải trọng theo thứ tự nhất định khi xuất hiện trong tiêu đề. |
Sau đây là các nguyên nhân có thể gây ra lỗi này:
Nguyên nhân | Mô tả | Hướng dẫn khắc phục sự cố áp dụng cho |
---|---|---|
Định dạng tải trọng phản hồi không khớp với Content-Encoding | Định dạng của tải trọng phản hồi do máy chủ mục tiêu/phụ trợ gửi:
không được mã hoá hoặc không
khớp với phương thức mã hoá được chỉ định trong tiêu đề Content-Encoding . |
Người dùng Edge công khai và riêng tư |
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à 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 đề này.
- Chuyển đến thẻ Analyze (Phân tích) > Giám sát API > Điều tra.
- Chọn khung thời gian cụ thể mà bạn phát hiện thấy lỗi.
- Đảm bảo rằng bộ lọc Proxy được đặt thành Tất cả.
- Vẽ Mã lỗi theo Thời gian.
Chọn một ô có mã lỗi
messaging.adaptors.http.flow.DecompressionFailureAtResponse
là được hiển thị bên dưới:Thông tin về mã lỗi
messaging.adaptors.http.flow.DecompressionFailureAtResponse
được hiển thị như minh hoạ dưới đây:Nhấp vào Xem nhật ký rồi mở rộng hàng không thành công do lỗi
502
.- Từ 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:
502
- Nguồn lỗi:
target
- Mã lỗi:
messaging.adaptors.http.flow.DecompressionFailureAtResponse
.
- Mã trạng thái:
- Nếu Nguồn lỗi có giá trị
target
, thì điều đó cho biết rằng định dạng tải trọng phản hồi không khớp với phương thức mã hoá được hỗ trợ được chỉ định trong tiêu đề phản hồi của máy chủ phụ trợContent-Encoding
.
Công cụ theo dõi
Cách chẩn đoán lỗi bằng công cụ Theo dõi:
- Bật phiên theo dõi
và:
- Chờ lỗi
502 Bad Gateway
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 tạo
502 Bad Gateway
.
- Chờ lỗi
Đảm bảo bạn đã bật chế độ Show all FlowInfos (Hiện tất cả FlowInfos):
- Chọn một trong các phản hồi không đạt và kiểm tra dấu vết.
- Di chuyển qua các giai đoạn của quá trình theo dõi và xác định vị trí lỗi đã xảy ra.
Thông thường, bạn sẽ thấy lỗi trong luồng ngay sau Giai đoạn Phản hồi đã nhận từ máy chủ mục tiêu như minh hoạ dưới đây:
-
Lưu ý các giá trị của các thuộc tính trong dấu vết:
- Mã hoá nội dung:
gzip
- Nội dung nội dung phản hồi:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Mã hoá nội dung:
Chuyển đến giai đoạn lỗi ngay sau Phản hồi đã nhận được từ máy chủ mục tiêu giai đoạn:
Lưu ý các thuộc tính:
- lỗi:
Decompression failure at response
- error.class:
com.apigee.errors.http.server.BadGateway
error.cause:
Not in GZIP format
Lỗi error.cause cho biết rằng tải trọng phản hồi không ở định dạng GZIP. Điều này có nghĩa là Apigee Edge dự kiến tải trọng phản hồi sẽ ở định dạng GZIP đã được chỉ định trong tiêu đề
Content-Encoding
(được xác định trong phần trước bước).Do đó, Apigee Edge không thể giải nén tải trọng bằng gzip và trả về lỗiDecompression failure at response
.
Lưu ý rằng phản hồi từ máy chủ mục tiêu/phụ trợ là
200
trong trường này case; tuy nhiên, ứng dụng khách sẽ nhận được một502
vì lỗi được Apigee Edge trả về.- lỗi:
Chuyển đến giai đoạn Phản hồi đã gửi cho khách hàng trong dấu vết rồi nhấp vào biểu tượng đó.
Hãy ghi lại các chi tiết sau đây trong dấu vết:
- Mã trạng thái:
502 Bad Gateway
. - Nội dung lỗi:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Mã trạng thái:
Chuyển đến giai đoạn AX (Đã ghi dữ liệu Analytics) trong dấu vết và nhấp vào đó.
- Cuộn xuống phần Chi tiết giai đoạn, Tiêu đề lỗi và xác định giá trị của X-Apigee-fault-code và X-Apigee-fault-source như minh hoạ dưới đây:
- Bạn sẽ thấy các giá trị của X-Apigee-fault-code và X-Apigee-fault-source
dưới tên
messaging.adaptors.http.flow.DecompressionFailureAtResponse
vàtarget
, cho biết rằng định dạng tải trọng phản hồi không khớp với mã hoá được chỉ định trong tiêu đềContent-Encoding
.Tiêu đề phản hồi Giá trị X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
X-Apigee-fault-source target
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ể sử dụng nhật ký truy cập NGINX để
xác định thông tin chính về lỗi HTTP
502
. Kiểm tra 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 các giá trị thực tế.
- Tìm kiếm để xem có lỗi
502
nào trong một khoảng thời gian cụ thể hay không (nếu sự cố đã xảy ra trong quá khứ) hoặc nếu có bất kỳ phản hồi nào vẫn không thành công với502
. Nếu bạn tìm thấy bất kỳ lỗi
502
nào với X-Apigee-fault-code khớp với giá trị củamessaging.adaptors.http.flow.DecompressionFailureAtResponse
, sau đó xác định giá trị của X-Apigee-fault-source..Lỗi 502 mẫu trong nhật ký truy cập NGINX:
Mục nhập mẫu ở trên từ nhật ký truy cập NGINX có các giá trị sau cho X-Apigee-fault-code và X-Apigee-fault-code
Tiêu đề phản hồi Giá trị X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
X-Apigee-fault-source target
Nguyên nhân: Định dạng tải trọng của phản hồi không khớp với Content-Encoding
Theo mặc định, Apigee Edge luôn giải nén tải trọng nếu tiêu đề phản hồi
Content-Encoding
chứa dữ liệu hợp lệ và
mã hoá được hỗ trợ. Do đó, dự kiến định dạng của tải trọng phản hồi
phải khớp với phương thức mã hoá được chỉ định trong tiêu đề phản hồi Content-Encoding
.
Nếu thông tin không khớp, bạn sẽ gặp lỗi này.
Chẩn đoán
- Xác định Mã lỗi và Nguồn lỗi cho lỗi phát hiện được bằng API Nhật ký giám sát, công cụ theo dõi hoặc nhật ký truy cập NGINX như được giải thích trong Các bước chẩn đoán thường gặp.
- Nếu Mã lỗi là
messaging.adaptors.http.flow.DecompressionFailureAtResponse
và Nguồn lỗi có giá trịtarget
, sau đó là giá trị này cho biết định dạng của tải trọng phản hồi do máy chủ phụ trợ/mục tiêu gửi không khớp với phương thức mã hoá được hỗ trợ được chỉ định trong tiêu đề phản hồiContent-Encoding
. Bạn có thể xác định thông tin không khớp trong phản hồi HTTP bằng một trong những cách sau phương thức:
Thông báo lỗi
Cách xác thực bằng thông báo lỗi:
-
Nếu bạn có quyền xem thông báo lỗi hoàn chỉnh nhận được từ Apigee Edge, thì tham khảo
faultstring
.Thông báo lỗi mẫu:
"faultstring":"Decompression failure at response"
- Trong thông báo lỗi ở trên, thông báo lỗi này hiển thị
"Decompression failure at response"
ngụ ý rằng phản hồi không thể giải nén bằng mã hoá được chỉ định trong Tiêu đềContent-Encoding
.
Trace
Cách xác thực bằng tính năng Theo dõi:
- Xác định Content-Type và error.require sử dụng Trace như giải thích trong Các bước chẩn đoán thông thường.
Sau đây là các giá trị trong dấu vết mẫu:
- Mã hoá nội dung:
gzip
- error.cause:
Not in GZIP format
Giá trị trong tiêu đề phản hồi Content-Encoding là gzip; tuy nhiên, tải trọng phản hồi không ở định dạng GZIP (như được biểu thị bằng error.cause). Do đó, Apigee Edge sẽ phản hồi bằng
502 Bad Gateway
và mã lỗimessaging.adaptors.http.flow.DecompressionFailureAtResponse
.- Mã hoá nội dung:
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 có quyền truy cập vào yêu cầu thực tế được gửi đến máy chủ đích/máy chủ phụ trợ ứng dụng, sau đó thực hiện các bước sau:
- Nếu bạn là người dùng Đám mây công cộng/Đám mây riêng tư, hãy gửi yêu cầu trực tiếp tới máy chủ phụ trợ từ chính máy chủ phụ trợ đó hoặc từ bất kỳ máy chủ nào khác máy mà bạn được phép gửi yêu cầu đến máy chủ phụ trợ.
- Nếu là người dùng Đám mây riêng tư, bạn cũng có thể gửi yêu cầu này vào máy chủ phụ trợ từ một trong các Bộ xử lý thư.
- Kiểm tra phản hồi do máy chủ phụ trợ gửi và xác định giá trị
đã được chuyển vào tiêu đề phản hồi
Content-Encoding.
- Xác định định dạng của tải trọng được gửi trong yêu cầu.
- Nếu giá trị của tiêu đề
Content-Encoding
nằm trong danh sách các phương thức mã hoá được hỗ trợ, nhưng định dạng của tải trọng phản hồi thì có không khớp với phương thức mã hoá được chỉ định trong tiêu đềContent-Encoding
, thì đó là nguyên nhân của vấn đề.Mẫu:
curl -v https://HOSTALIAS/test
***trimmed*** > < HTTP/1.1 200 OK < Accept-Ranges: bytes <
Content-Encoding: gzip
< Date: Mon, 02 Aug 2021 08:17:35 GMT < Transfer-Encoding: chunked < < response_payload.zip Response Body(not in GZIP format)>Phản hồi mẫu ở trên gửi giá trị
gzip
đến Tiêu đềContent-Encoding
là một hỗ trợ mã hoá trong Apigee Edge. Tuy nhiên,response_payload.zip
được gửi dưới dạng tệp zip. Do đó, điều này không phản hồi được với lỗi502 Bad Gateway
kèm theo mã lỗi:messaging.adaptors.http.flow.DecompressionFailureAtResponse
.
Nhật ký Trình xử lý thư
Để xác thực bằng nhật ký Trình xử lý thư:
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 chính về lỗi HTTP
502
.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ó bất kỳ lỗi
502
nào trong một khoảng thời gian cụ thể hay không khoảng thời gian (nếu vấn đề đã xảy ra trong quá khứ) hoặc có phản hồi nào không vẫn không thành công với502
. Bạn có thể sử dụng chuỗi tìm kiếm sau:grep -ri "ZipException"
Bạn sẽ thấy các dòng từ system.log tương tự như sau:
Tình huống #1
Tình huống 1: Khi phản hồi của API có tiêu đề Content-Encoding: gzip
2021-08-02 06:50:25,433 NIOThread@2 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:3.8.1.1:9000 Local:10.0.115.32:41298]@38140 useCount=1 bytesRead=0 bytesWritten=203 age=469ms lastIO=0ms isOpen=true).onExceptionRead exception: {}
java.util.zip.ZipException: Not in GZIP format
---trimmed-- 2021-08-02 06:50:25,433 NIOThread@2 INFO HTTP.CLIENT - HTTPClient$Context.logContextDetails() : Request details : host=null path=/folder/testFile method=GET. Channel details : Bytes read=0 2021-08-02 06:50:25,434 NIOThread@2 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@4806fdab, Not in GZIP format) 2021-08-02 06:50:25,434 NIOThread@2 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exceptionjava.util.zip.ZipException: Not in GZIP format
occurred while writing to channel null 2021-08-02 06:50:25,434 NIOThread@2 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: Not in GZIP formatDòng
java.util.zip.ZipException: Not in GZIP format
trong thông báo lỗi ở trên cho biết phản hồi tải trọng không được gửi ở định dạng GZIP mặc dùContent-Encoding
được chỉ định là gzip. Do đó, Apigee Edge sẽ đưa ra trường hợp ngoại lệ và trả về mã trạng thái502
có mã lỗimessaging.adaptors.http.flow.DecompressionFailureAtResponse
cho ứng dụng khách.Tình huống #2
Tình huống 2: Khi phản hồi của API có tiêu đề Content-Encoding: deflate
2021-08-02 06:35:21,215 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:3.8.1.1:9000 Local:192.168.194.140:35224]@36014 useCount=1 bytesRead=0 bytesWritten=202 age=439ms lastIO=2ms isOpen=true).onExceptionRead exception: {}
java.util.zip.ZipException: incorrect header check
---trimmed---- Caused by:java.util.zip.DataFormatException: incorrect header check
---trimmed--- 2021-08-02 06:35:21,215 NIOThread@0 INFO HTTP.CLIENT - HTTPClient$Context.logContextDetails() : Request details : host=null path=/folder/testFile method=GET. Channel details : Bytes read=0 2021-08-02 06:35:21,216 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@3966e277, incorrect header check) 2021-08-02 06:35:21,216 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception java.util.zip.ZipException: incorrect header check occurred while writing to channel null 2021-08-02 06:35:21,217 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: incorrect header checkĐường kẻ
java.util.zip.ZipException: incorrect header check
vàCaused by: java.util.zip.DataFormatException: incorrect header check
trong thông báo lỗi ở trên, cho biết rằng tải trọng phản hồi không được gửi trong và không phù hợp với mã hoá được chỉ định trong Tiêu đềContent-Encoding
giảm bớt. Do đó, Apigee Edge gửi ngoại lệ và trả về mã trạng thái502
có mã lỗimessaging.adaptors.http.flow.DecompressionFailureAtResponse
cho ứng dụng khách.
-
Độ phân giải
- Trường hợp không cần tải trọng phản hồi nén trong quy trình proxy API trong Apigee Edge
và trong máy chủ phụ trợ, thì không truyền tiêu đề
Content-Encoding
. Nếu cần nén tải trọng phản hồi, hãy chuyển sang bước 2. - Nếu cần nén tải trọng phản hồi, hãy đảm bảo rằng máy chủ phụ trợ
luôn gửi dữ liệu sau:
- Bất kỳ
mã hoá được hỗ trợ làm giá trị cho tiêu đề
Content-Encoding
trong phản hồi - Tải trọng phản hồi ở định dạng được hỗ trợ cho Apigee Edge khớp với phương thức mã hoá
định dạng được chỉ định trong tiêu đề
Content-Encoding
- Bất kỳ
mã hoá được hỗ trợ làm giá trị cho tiêu đề
- Trong ví dụ được thảo luận ở trên, tải trọng phản hồi ở định dạng ZIP nhưng tiêu đề phản hồi
chỉ định
Content-Encoding: gzip
. Bạn có thể khắc phục vấn đề bằng cách gửi phản hồi tiêu đề làContent-Encoding: gzip
và tải trọng phản hồi tronggzip
định dạng:curl -v https://HOSTALIAS/v1/test
> < HTTP/1.1 200 OK < Accept-Ranges: bytes <
Content-Encoding: gzip
< Date: Mon, 02 Aug 2021 08:17:35 GMT < Transfer-Encoding: chunked < < response_payload.gz Response Body(in GZIP format)>
Thông số kỹ thuật
Apigee Edge phản hồi bằng mã trạng thái 502 Bad Gateway
kèm theo mã lỗi
messaging.adaptors.http.flow.DecompressionFailureAtResponse
theo RFC sau đây
thông số kỹ thuật:
Thông số kỹ thuật |
---|
RFC 7231, mục 6.5.1 |
RFC 7231, mục 3.1.2.2 |
Nếu bạn vẫn cần hỗ trợ từ Nhóm hỗ trợ Apigee, hãy truy cập vào 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 những thông tin chẩn đoán sau đây rồi liên hệ với Bộ phận hỗ trợ Apigee Edge:
Nếu bạn là người dùng Cloud Public, 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ỗi502
- Tệp theo dõi cho các phản hồi của API
Nếu bạn là người dùng Đám mây riêng tư, hãy cung cấp các thông tin sau:
- Đã nhận thấy thông báo lỗi hoàn chỉnh đối với các phản hồi không thành công
- Tên môi trường
- Gói Proxy API
- Tệp theo dõi cho các phản hồi của API
Nhật ký truy cập NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Vị trí: ORG, ENV và PORT# được thay thế bằng giá trị thực tế.
- Nhật ký hệ thống của Trình xử lý thư
/opt/apigee/var/log/edge-message-processor/logs/system.log