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 protocol.http.DuplicateHeader làm 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":"Duplicate Header \"Expires\"",
"detail":{
"errorcode":"protocol.http.DuplicateHeader"
}
}
}Nguyên nhân có thể dẫn đến vấn đề này
Lỗi này xảy ra nếu một tiêu đề HTTP cụ thể không được phép có bản sao trong Apigee Edge, xuất hiện nhiều lần với cùng một hoặc các giá trị khác nhau, trong phản hồi HTTP do máy chủ phụ trợ gửi đến Apigee Edge.
Theo
RFC 7230, mục 3.2.2: Field Order, người gửi KHÔNG ĐƯỢC tạo nhiều trường tiêu đề có cùng tên trường trong một thông báo, trừ phi toàn bộ giá trị trường cho trường tiêu đề đó được xác định là một danh sách được phân tách bằng dấu phẩy, [tức là #(values)] hoặc trường tiêu đề là một ngoại lệ nổi tiếng. Nếu Apigee Edge phát hiện thấy một tiêu đề cụ thể (không được phép có bản sao) được gửi nhiều lần trong phản hồi HTTP do máy chủ đích/phụ trợ gửi, thì Apigee Edge sẽ phản hồi bằng 502 Bad Gateway và mã lỗi protocol.http.DuplicateHeader
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 |
|---|---|---|
| Tiêu đề trùng lặp trong phản hồi | Phản hồi từ máy chủ phụ trợ chứa các tiêu đề trùng lặp. | 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
protocol.http.DuplicateHeadernhư minh hoạ bên dưới:
Thông tin về mã lỗi
protocol.http.DuplicateHeadersẽ xuất hiện như hình dưới đây:
- Đảm bảo Mã trạng thái là
502như trong ví dụ trên. - Nhấp vào Xem nhật ký rồi mở rộng hàng của yêu cầu không thực hiện được.
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:
protocol.http.DuplicateHeader.
- Mã trạng thái:
- Nguồn lỗi là
target, cho biết rằng phản hồi từ máy chủ phụ trợ có các tiêu đề trùng lặp.
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
- Chờ lỗi
502 Bad Gatewayxảy ra hoặc - Nếu bạn có thể tái tạo vấn đề, hãy thực hiện lệnh gọi API và tái tạo lỗi
502 Bad Gateway
- Chờ lỗi
Đảm bảo bạn đã bật chế độ Show all Flow Infos (Hiện tất cả thông tin về luồng):

- Chọn một trong các yêu cầu không thực hiện được 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.
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 được gửi đến máy chủ đích như minh hoạ bên dưới:

Lưu ý giá trị của lỗi trong dấu vết.
Dấu vết mẫu ở trên cho thấy lỗi là
Duplicate Header "Expires". Vì lỗi này do Apigee đưa ra sau khi yêu cầu được gửi đến máy chủ phụ trợ, nên lỗi này cho biết máy chủ phụ trợ đã gửi tiêu đềExpiresnhiều lần.- Chuyển đến Giai đoạn AX (Dữ liệu Analytics được ghi lại) trong dấu vết rồi nhấp vào giai đoạn đó.
Di chuyển xuống phần Phase Details - Response Headers (Chi tiết giai đoạn – Tiêu đề phản hồi) và xác định các giá trị của X-Apigee-fault-code (Mã lỗi X-Apigee) và X-Apigee-fault-source (Nguồn lỗi X-Apigee) 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 là
protocol.http.DuplicateHeadervàtarget, cho biết lỗi này xảy ra do máy chủ phụ trợ đã truyền các tiêu đề trùng lặp cho tiêu đề phản hồiExpires.Tiêu đề phản hồi Giá trị X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source target Kiểm tra xem bạn có đang sử dụng chuỗi proxy hay không; tức là liệu máy chủ đích hoặc điểm cuối đích có đang gọi một proxy khác trong Apigee hay không.
Để xác định điều này, hãy quay lại giai đoạn Yêu cầu được gửi đến máy chủ mục tiêu. Nhấp vào Show Curl (Hiện Curl).
Cửa sổ Curl for Request Sent to Target Server (Curl cho yêu cầu được gửi đến máy chủ đích) sẽ mở ra. Từ đó, bạn có thể xác định bí danh máy chủ đích.
- Nếu bí danh máy chủ đích đang trỏ đến một bí danh máy chủ ảo, thì đó là chuỗi proxy. Trong trường hợp này, bạn cần lặp lại tất cả các bước trên cho proxy được liên kết cho đến khi xác định được nguyên nhân thực sự gây ra lỗi
502 Bad Gateway. - Nếu bí danh máy chủ đích trỏ đến máy chủ phụ trợ của bạn, thì điều đó có nghĩa là máy chủ phụ trợ của bạn đang gửi các tiêu đề trùng lặp trong phản hồi đến Apigee.
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_logTrong đó: ORG, ENV và PORT# được thay bằng các giá trị thực tế.
- Tìm kiếm để xem có lỗi
502nào xảy ra 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ó yêu cầu nào vẫn không thành công với502hay không. Nếu bạn tìm thấy bất kỳ lỗi
502nào có X-Apigee-fault-code trùng khớp với giá trị củaprotocol.http.DuplicateHeader, 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 protocol.http.DuplicateHeaderX-Apigee-fault-source target
Nguyên nhân: Tiêu đề trùng lặp trong phản hồi
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 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 Nguồn lỗi có giá trị
target, thì tức là phản hồi do máy chủ đích gửi có chứa các tiêu đề trùng lặp. Bạn có thể xác định tiêu đề thực tế được gửi nhiều lần trong phản hồi bằng một trong các phương thức sau:
Thông báo lỗi
Sử dụ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.faultstringchứa tên tiêu đề đã được gửi nhiều lần.Thông báo lỗi mẫu:
"faultstring":"Duplicate Header \"Expires\""
- Trong thông báo lỗi ở trên, bạn có thể thấy tiêu đề
Expiresđược gửi nhiều lần như trongfaultstring.
Yêu cầu thực tế
Sử dụ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ế được gửi đến máy chủ đích, hãy lấy lệnh
curltương ứng từ bước 10.a và bước 10.b trong phần Sử dụng công cụ Theo dõi. 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, hãy thực hiện các bước sau:
Gọi đến máy chủ đích.
Yêu cầu mẫu cho máy chủ đích được dùng trong ví dụ này:
curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
Xác minh danh sách tiêu đề xuất hiện trong phản hồi.
Phản hồi mẫu từ máy chủ mục tiêu được dùng trong ví dụ này:
* ...Trimmed... > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2 > Host: BACKEND_SERVER_HOST > User-Agent: curl/7.64.1 > Accept: */* > * Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 200 < date: Fri, 02 Jul 2021 05:29:07 GMT < content-type: application/json < content-length: 166 < server: gunicorn/19.9.0 < Expires: Mon, 21 June 2021 07:28:00 GMT < Expires: Mon, 21 June 2021 07:28:00 GMT < access-control-allow-origin: * < access-control-allow-credentials: true < ----<Response BODY>------ * Connection #0 to host httpbin.org left intact * Closing connection 0
Trong yêu cầu ví dụ ở trên, tiêu đề
Expiresđược gửi nhiều lần. Do đó, yêu cầu này không thành công với lỗi502 Bad Gatewayvà mã lỗi:protocol.http.DuplicateHeader.Nếu tiêu đề có tên xuất hiện trong
faultstringxuất hiện nhiều lần trong phản hồi của máy chủ phụ trợ, thì đó là nguyên nhân gây ra lỗi này. Trong trường hợp trên, tiêu đềExpiresđược gửi nhiều lần.
Độ phân giải
Khắc phục tình trạng trùng lặp
Cách 1 [Cách được đề xuất] Sửa máy chủ phụ trợ để không bao gồm các tiêu đề trùng lặp
- Phân tích lý do khiến máy chủ phụ trợ cụ thể gửi tiêu đề trùng lặp
Expiresvà xác minh xem các proxy API có chấp nhận tiêu đề đó hay không. Trong hầu hết các trường hợp, điều này sẽ không mong muốn theo quy cách HTTP RFC7230. - Nếu không mong muốn điều này, hãy sửa đổi ứng dụng máy chủ đích để không gửi các tiêu đề trùng lặp.
Trong ví dụ được thảo luận ở trên, bạn nhận thấy tiêu đề
Expiresđược gửi hai lần với cùng một giá trị, điều này là không nên. Bạn có thể khắc phục vấn đề này bằng cách đảm bảo rằng máy chủ đích chỉ truyền tiêu đềExpiresmột lần. - Nếu bạn muốn cho phép các tiêu đề trùng lặp, hãy chuyển đến Lựa chọn 2: Sử dụng thuộc tính CwC.
CwC
Lựa chọn 2: Sử dụng tài sản CwC
Apigee cung cấp một thuộc tính CwC HTTPHeader.<HeaderName> ,cho phép các ứng dụng và máy chủ đích gửi tiêu đề trùng lặp đến các proxy API trong Apigee Edge.
| Tài sản CwC | Giá trị |
|---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
Ví dụ: bạn có thể đặt thuộc tính sau trên Trình xử lý thông báo để cho phép các giá trị trùng lặp và nhiều giá trị cho tiêu đề Expires.
HTTPHeader.Expires=allowDuplicates, multiValued
- Nếu là người dùng Đám mây riêng, bạn có thể định cấu hình thuộc tính để ngăn Apigee Edge phát sinh lỗi
502 Bad Gateway, ngay cả khi yêu cầu chứa các tiêu đề trùng lặp bằng cách sử dụng hướng dẫn Định cấu hình Trình xử lý thông báo để sử dụng các tiêu đề trùng lặp. - Nếu bạn là người dùng Đám mây công khai, hãy liên hệ với Nhóm hỗ trợ Apigee Edge để định cấu hình thuộc tính này cho tổ chức của bạn.
Thông số kỹ thuật
Apigee phản hồi bằng phản hồi lỗi 502 Bad Gateway vì Apigee dự kiến máy chủ phụ trợ sẽ hoạt động theo các quy cách RFC sau:
| Thông số kỹ thuật |
|---|
| RFC 7230, phần 3.2.2: Thứ tự trường |
| RFC 7230, phần 3.2: Trường tiêu đề |
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 yêu cầu 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 yêu cầu không thành công
- Tên môi trường
- Gói proxy API
- Tệp theo dõi cho các yêu cầu 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 bằng các giá trị thực tế.
- Nhật ký hệ thống của Trình xử lý thông báo
/opt/apigee/var/log/edge-message-processor/logs/system.log