Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào
tài liệu Apigee X. thông tin
Dấu hiệu
Ứng dụng khách nhận được mã trạng thái HTTP 502 Bad Gateway với mã lỗi messaging.adaptors.http.flow.DecompressionFailureAtResponse dưới dạng phản hồi cho các 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:
HTTP/1.1 502 Bad Gateway
Ngoài ra, bạn có thể thấy một 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:
- Mã hoá được chỉ định trong tiêu đề phản hồi HTTP (từ máy chủ phụ trợ/máy chủ đích)
Content-Encodinglà hợp lệ và được Apigee Edge hỗ trợ, - Định dạng trọng tải do máy chủ phụ trợ/máy chủ đích gửi dưới dạng một phần của 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 giải mã được tải trọng bằng cách sử dụng phương thức mã hoá đã chỉ định vì định dạng của tải trọng không giống với định dạng của phương thức mã hoá được chỉ định trong tiêu đề Content-Encoding.
Sau đây là một số ví dụ về các giá trị Content-Encoding được hỗ trợ và cách Apigee Edge mong đợi biểu thị tải trọng trong những trường hợp đó:
| Trường hợp | Mã hoá nội dung | Biểu thị tải trọng |
|---|---|---|
| Mã hoá đơn | gzip | Định dạng |
| Mã hoá đơn | deflate | Định dạng này sử dụng cấu trúc |
| Nhiều phương thức mã hoá | Nhiều phương thức mã hoá Ví dụ: trong trường hợp mã hoá được thực hiện hai lần, mã này có thể là:
|
Nhiều phương thức mã hoá được áp dụng cho tải trọng theo thứ tự đã cho khi tải trọng xuất hiện trong tiêu đề. |
Sau đây là những 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ủ phụ trợ/máy chủ đích 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 Public Cloud và Private Cloud |
Các bước chẩn đoán thường gặp
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ò phù 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 nhậ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.DecompressionFailureAtResponsenhư minh hoạ bên dưới:
Thông tin về mã lỗi
messaging.adaptors.http.flow.DecompressionFailureAtResponsesẽ xuất hiện 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 có lỗi
502.
- Trong cửa sổ Nhật ký, hãy lưu ý những thông tin 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 mã hoá được hỗ trợ được chỉ định trong tiêu đề phản hồiContent-Encodingcủa máy chủ phụ trợ.
Công cụ theo dõi
Cách chẩn đoán lỗi bằng công cụ Trace (Theo dõi):
- Bật phiên theo dõi và một trong hai lựa chọn sau:
- Chờ lỗi
502 Bad Gatewayxả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
502 Bad Gateway.
- Chờ lỗi
Đảm bảo bạn đã bật chế độ Show all FlowInfos (Hiện tất cả FlowInfo):
- Chọn một trong các phản hồi không thành công và kiểm tra dấu vết.
- Điều hướng qua các giai đoạn khác nhau của dấu vết và xác định vị trí xảy ra lỗi.
Thông thường, bạn sẽ thấy lỗi trong một luồng ngay sau giai đoạn Response Received from target server (Đã nhận được phản hồi từ máy chủ đích) như minh hoạ dưới đây:
-
Lưu ý các giá trị của thuộc tính trong dấu vết:
- Content-Encoding:
gzip - Nội dung phản hồi:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Content-Encoding:
Chuyển đến giai đoạn lỗi ngay sau giai đoạn Response Received from target server (Đã nhận được phản hồi từ máy chủ đích):
Lưu ý các thuộc tính:
- error:
Decompression failure at response - error.class:
com.apigee.errors.http.server.BadGateway error.cause:
Not in GZIP formaterror.cause cho biết 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 ở định dạng GZIP như được chỉ định trong tiêu đề
Content-Encoding(xác định ở bước trướ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.
Xin lưu ý rằng phản hồi từ máy chủ đích/phụ trợ là
200trong trường hợp này; tuy nhiên, ứng dụng khách sẽ nhận được phản hồi502vì lỗi này do Apigee Edge trả về.- error:
Chuyển đến giai đoạn Response Sent to Client (Phản hồi được gửi đến máy khách) trong dấu vết rồi nhấp vào giai đoạn đó.
Lưu ý những thông tin sau 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 (Dữ liệu Analytics được ghi lại) trong dấu vết và nhấp vào giai đoạn đó.
- Di chuyển xuống phần Phase Details (Thông tin chi tiết về giai đoạn), Error Headers (Tiêu đề lỗi) và xác định các giá trị của X-Apigee-fault-code và X-Apigee-fault-source như minh hoạ bên dưới:
- Bạn sẽ thấy các giá trị của X-Apigee-fault-code và X-Apigee-fault-source dưới dạng
messaging.adaptors.http.flow.DecompressionFailureAtResponsevàtarget, 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 chỉ định trong tiêu đềContent-Encoding.Tiêu đề phản hồi Giá trị X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-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, 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_logVị trí: ORG, ENV và PORT# được thay thế bằng các giá trị thực tế.
- Tìm kiếm để xem có lỗi
502nà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 xem có phản hồi nào vẫn gặp lỗi502hay không. Nếu bạn tìm thấy bất kỳ lỗi
502nào có X-Apigee-fault-code khớp với giá trị củamessaging.adaptors.http.flow.DecompressionFailureAtResponse, thì hãy xác định giá trị của X-Apigee-fault-source.Ví dụ về lỗi 502 trong nhật ký truy cập NGINX:
Mục nhập mẫu ở trên trong nhật ký truy cập NGINX có các giá trị sau cho X-Apigee-fault-code và X-Apigee-fault-source:
Tiêu đề phản hồi Giá trị X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
Nguyên nhân: Định dạng tải trọng 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 một mã hoá hợp lệ và
được hỗ trợ. Do đó, đị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 có sự 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 quan sát được bằng cách sử dụ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ư được giải thích trong phần Các bước chẩn đoán thường gặp.
- Nếu Mã lỗi là
messaging.adaptors.http.flow.DecompressionFailureAtResponsevà Nguồn lỗi có giá trịtarget, thì điều này cho biết rằng định dạng của tải trọng phản hồi do máy chủ phụ trợ/máy chủ đích gửi không khớp với mã hoá được hỗ trợ được chỉ định trong tiêu đề phản hồiContent-Encoding. Bạn có thể xác định sự không khớp trong phản hồi HTTP bằng một trong các phương thức sau:
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 truy cập vào thông báo lỗi hoàn chỉnh nhận được từ Apigee Edge, hãy 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 này hiển thị
"Decompression failure at response", tức là phản hồi không thể giải nén bằng phương thức mã hoá được chỉ định trong tiêu đềContent-Encoding.
Trace
Cách xác thực bằng Trace:
- Xác định Content-Type và error.cause bằng cách sử dụng Trace như được giải thích trong phần Các bước chẩn đoán thường gặp.
Các giá trị trong dấu vết mẫu như sau:
- Content-Encoding:
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 chỉ ra bởi error.cause). Do đó, Apigee Edge sẽ phản hồi bằng
502 Bad Gatewayvà mã lỗimessaging.adaptors.http.flow.DecompressionFailureAtResponse.- Content-Encoding:
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 ứng dụng máy chủ đích/phụ trợ, hãy thực hiện các bước sau:
- Nếu bạn là người dùng Đám mây công khai/Đám mây riêng tư, hãy gửi yêu cầu trực tiếp đến máy chủ phụ trợ từ chính máy chủ phụ trợ hoặc bất kỳ máy nào khác 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 máy chủ phụ trợ từ một trong các Trình xử lý thông báo.
- Kiểm tra phản hồi do máy chủ phụ trợ gửi và xác định giá trị được truyền trong 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-Encodingnằm trong danh sách mã hoá được hỗ trợ nhưng định dạng của tải trọng phản hồi không khớp với mã hoá được chỉ định trong tiêu đềContent-Encoding, thì đó là nguyên nhân gây ra vấn đề.Ví dụ:
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. Đây là một mã hoá được hỗ trợ trong Apigee Edge. Tuy nhiên,response_payload.zipđược gửi dưới dạng tệp zip. Do đó, phản hồi này không thành công do gặp lỗi502 Bad Gatewayvới mã lỗi:messaging.adaptors.http.flow.DecompressionFailureAtResponse.
Nhật ký Trình xử lý tin nhắn
Cách xác thực bằng nhật ký Message Processor:
Nếu là người dùng Đám mây riêng, bạn có thể sử dụng nhật ký Trình xử lý thông báo để xác định thông tin chính về lỗi HTTP
502.Kiểm tra nhật ký Message Processor:
/opt/apigee/var/log/edge-message-processor/logs/system.logTìm kiếm để xem có lỗi
502nào xảy ra trong một khoảng thời gian cụ thể (nếu vấn đề xảy ra trong quá khứ) hay có phản hồi nào vẫn gặp lỗi502hay không. 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 trong system.log tương tự như sau:
Tình huống 1
Trường hợp 1: Khi phản hồi 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 formatoccurred 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 formattrong thông báo lỗi ở trên cho biết tải trọng phản hồi không được gửi ở định dạng GZIP mặc dùContent-Encodingđược chỉ định là gzip. Do đó, Apigee Edge sẽ gửi ngoại lệ và trả về mã trạng thái502kèm theo mã lỗimessaging.adaptors.http.flow.DecompressionFailureAtResponsecho các ứng dụng khách.Tình huống 2
Tình huống 2: Khi phản hồi 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 checkCác dòng
java.util.zip.ZipException: incorrect header checkvàCaused by: java.util.zip.DataFormatException: incorrect header checktrong thông báo lỗi ở trên cho biết tải trọng phản hồi không được gửi ở định dạng deflate và không khớp với phương thức mã hoá được chỉ định trong tiêu đềContent-Encodingcủa deflate. Do đó, Apigee Edge sẽ gửi ngoại lệ và trả về mã trạng thái502với mã lỗimessaging.adaptors.http.flow.DecompressionFailureAtResponsecho các ứng dụng khách.
-
Độ phân giải
- Nếu không cần tải trọng phản hồi được nén trong quy trình proxy API trong Apigee Edge và trong máy chủ phụ trợ, thì đừ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 những nội dung sau:
- Bất kỳ
mã hoá được hỗ trợ nào làm giá trị cho tiêu đề
Content-Encodingtrong 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 định dạng mã hoá được chỉ định trong tiêu đề
Content-Encoding
- Bất kỳ
mã hoá được hỗ trợ nào 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 đề này bằng cách gửi tiêu đề phản hồi dưới dạngContent-Encoding: gzipvà tải trọng phản hồi ở định dạnggzip: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 với mã lỗi messaging.adaptors.http.flow.DecompressionFailureAtResponse theo các quy cách RFC sau:
| Thông số kỹ thuật |
|---|
| RFC 7231, phần 6.5.1 |
| RFC 7231, phần 3.1.2.2 |
Nếu bạn vẫn cần được Nhóm hỗ trợ Apigee trợ giúp, hãy xem phần Bạn 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, rồi liên hệ với Nhóm hỗ trợ Apigee Edge:
Nếu bạn là người dùng Đám mây công cộng, hãy cung cấp những thông tin sau:
- Tên tổ chức
- Tên môi trường
- Tên API Proxy
- Lệnh
curlhoàn tất được dùng để tái tạo 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, hãy cung cấp những thông tin sau:
- Thông báo lỗi hoàn chỉnh được ghi nhận cho các phản hồi không thành công
- Tên môi trường
- Gói API Proxy
- 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_logTrong đó: ORG, ENV và PORT# được thay thế bằng các giá trị thực tế.
- Nhật ký hệ thống của Trình xử lý tin nhắn
/opt/apigee/var/log/edge-message-processor/logs/system.log