502 Bad Gateway - DuplicateHeader

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 protocol.http.DuplicateHeader làm phản hồi cho lệnh gọi API.

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":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Nguyên nhân có thể xảy ra

Lỗi này xảy ra nếu một tiêu đề HTTP cụ thể không được phép có dữ liệu trùng lặp trong Apigee Edge, xuất hiện nhiều lần với các giá trị giống nhau hoặc khác nhau, như một phần của phản hồi HTTP được gửi bởi máy chủ phụ trợ với Apigee Edge.

Theo RFC 7230, mục 3.2.2: Trường thứ tự, người gửi KHÔNG ĐƯỢC tạo nhiều tiêu đề các trường có cùng tên trường trong một thông báo trừ khi toàn bộ giá trị trường đó trường tiêu đề được định nghĩa là danh sách được phân tách bằng dấu phẩy, [ví dụ: #(values)] hoặc trường tiêu đề là ngoại lệ phổ biến. Nếu Apigee Edge phát hiện thấy cùng một tiêu đề cụ thể, thì ứng dụng không được phép có trùng lặp, được gửi nhiều lần trong phản hồi HTTP được gửi bởi máy chủ đích/máy chủ phụ trợ, sau đó ứng dụng sẽ phản hồi bằng 502 Bad Gateway và mã lỗi protocol.http.DuplicateHeader

Dưới đâ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
Trùng lặp tiêu đề trong câu trả lời Phản hồi của máy chủ phụ trợ chứa các tiêu đề trùng lặp. 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:

  1. Đă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.
  2. Chuyển sang tổ chức mà bạn muốn điều tra vấn đề này.

  3. Chuyển đến thẻ Analyze (Phân tích) > Giám sát API > Điều tra.
  4. Chọn khung thời gian cụ thể mà bạn phát hiện thấy lỗi.
  5. Đảm bảo rằng bộ lọc Proxy được đặt thành Tất cả.
  6. Vẽ Mã lỗi theo Thời gian.
  7. Chọn một ô có mã lỗi protocol.http.DuplicateHeader như hình bên dưới:

    (xem hình ảnh lớn hơn)

  8. Thông tin về mã lỗi protocol.http.DuplicateHeader được hiển thị như sau:

    (xem hình ảnh lớn hơn)

  9. Đảm bảo Mã trạng thái502 như trong ví dụ trên.
  10. Nhấp vào Xem nhật ký và mở rộng hàng của yêu cầu không thành công.
  11. Từ cửa sổ 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: protocol.http.DuplicateHeader.
  12. Nguồn lỗitarget, cho biết rằng phản hồi của máy chủ phụ trợ chứa 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ụ Theo dõi:

  1. Bật phiên theo dõi
    1. Chờ lỗi 502 Bad Gateway xảy ra hoặc
    2. 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 lỗi
  2. Đảm bảo bạn đã bật chế độ Show all Flow Infos (Hiện tất cả thông tin về quy trình):

  3. 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.
  4. Di chuyển qua các giai đoạn của quá trình theo dõi và xác định nơi xảy ra lỗi.
  5. Thông thường, bạn sẽ thấy lỗi này trong một luồng sau khi Yêu cầu được gửi đến mục tiêu máy chủ như minh hoạ dưới đây:

    (xem hình ảnh lớn hơn)

  6. 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 là Duplicate Header "Expires". Từ lỗi do Apigee đưa ra sau khi yêu cầu được gửi đến máy chủ phụ trợ. Điều này cho biết rằng máy chủ phụ trợ đã gửi tiêu đề Expires nhiều lần.

  7. Chuyển đến Giai đoạn AX (Đã ghi dữ liệu Analytics) trong dấu vết và nhấp vào đó.
  8. Di chuyển xuống phần Chi tiết giai đoạn – Tiêu đề phản hồi rồi xác định của X-Apigee-fault-codeX-Apigee-fault-source như sau:

    (xem hình ảnh lớn hơn)

  9. Bạn sẽ thấy các giá trị của X-Apigee-fault-codeX-Apigee-fault-source dưới dạng protocol.http.DuplicateHeadertarget, cho biết rằng lỗi này là do máy chủ phụ trợ đã chuyển các tiêu đề trùng lặp cho tiêu đề phản hồi Expires.
    Tiêu đề phản hồi Giá trị
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. Kiểm tra xem bạn có đang dùng xâu chuỗi proxy; tức là nếu máy chủ mục tiêu hoặc điểm cuối mục tiêu gọi một proxy khác trong Apigee.

    1. Để xác định điều này, hãy quay lại giai đoạn máy chủ Đã gửi yêu cầu đến mục tiêu. Nhấp vào Hiển thị cuộn tròn.

    2. Cửa sổ Curl for Yêu cầu được gửi tới máy chủ mục tiêu sẽ mở ra để từ đó bạn có thể xác định bí danh máy chủ lưu trữ của máy chủ mục tiêu.

    3. Nếu bí danh máy chủ lưu trữ của máy chủ mục tiêu đang trỏ tới bí danh máy chủ lưu trữ ảo, thì đó là proxy tạo chuỗi. Trong trường hợp này, bạn cần phải lặp lại tất cả các bước trên cho proxy theo chuỗi cho đến khi bạn sẽ xác định nguyên nhân thực sự gây ra lỗi 502 Bad Gateway.
    4. Nếu bí danh máy chủ lưu trữ của máy chủ mục tiêu trỏ đến máy chủ phụ trợ của bạn, thì điều đó cho biết rằng máy chủ phụ trợ của bạn đang gửi các tiêu đề trùng lặp để phản hồi cho Apigee.

NGINX

Cách chẩn đoán lỗi bằng nhật ký truy cập NGINX:

  1. 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.
  2. Kiểm tra nhật ký truy cập NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Vị trí: ORG, ENVPORT# được thay thế bằng giá trị thực tế.

  3. 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ỳ yêu cầu nào vẫn không thành công với 502.
  4. Nếu bạn tìm thấy bất kỳ lỗi 502 nào với mã X-Apigee-fault-code khớp với giá trị của protocol.http.DuplicateHeader, 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-codeX-Apigee-fault-source:

    Tiêu đề phản hồi Giá trị
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target

Nguyên nhân: Tiêu đề trùng lặp trong phản hồi

Chẩn đoán

  1. Xác định Mã lỗiNguồn lỗi cho lỗi phát hiện được bằng API Nhật ký giám sát hoặc nhật ký truy cập NGINX như giải thích trong Các bước chẩn đoán phổ biến.
  2. Nếu Nguồn lỗi có giá trị target, thì đây cho biết rằng phản hồi do máy chủ đích gửi chứa các tiêu đề trùng lặp.
  3. 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 pháp sau:

    Thông báo lỗi

    Sử dụng thông báo lỗi:

    1. Nếu bạn có thể xem thông báo lỗi đầy đủ mà Apigee Edge gửi đến, hãy tham khảo vào faultstring. faultstring chứa tên tiêu đề đã được gửi nhiều lần.

      Thông báo lỗi mẫu:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. Trong thông báo lỗi ở trên, bạn có thể thấy rằng tiêu đề Expires đã được gửi nhiều lần như nhìn thấy trong faultstring.

    Yêu cầu thực tế

    Sử dụng yêu cầu thực tế:

    1. 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ủ mục tiêu, hãy nhận lệnh curl tương ứng từ Sử dụng công cụ Theo dõi bước 10.a và bước 10.b.
    2. Nếu bạn có quyền truy cập vào yêu cầu thực tế được gửi tới ứng dụng máy chủ đích, thì hãy thực hiện các bước sau:

      1. Gọi đến máy chủ đích.

        Yêu cầu mẫu cho máy chủ mục tiêu được sử 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
        
      2. Xác minh danh sách các 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 sử 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 mẫu ở trên, tiêu đề Expires được gửi nhiều hơn nhiều lần. Do đó, yêu cầu này không thành công với 502 Bad Gateway và mã lỗi: protocol.http.DuplicateHeader.

      3. Nếu tiêu đề có tên xuất hiện trong faultstring xuấ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 . 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 vấn đề trùng lặp

Phương án 1 [Lựa chọn nên dùng] Khắc phục máy chủ phụ trợ để không thêm các tiêu đề trùng lặp

  1. Phân tích lý do khiến máy chủ phụ trợ cụ thể gửi tiêu đề trùng lặp Expires và xác minh xem các proxy API có chấp nhận điều đó hay không. Ngang bằng hầu hết các trường hợp, điều này sẽ không như mong muốn theo thông số kỹ thuật HTTP RFC7230.
  2. Nếu bạn không mong muốn, 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 có cùng giá trị. Đây không phải là điều đáng mong muố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ủ mục tiêu chỉ truyền tiêu đề Expires một lần.
  3. Nếu cần và bạn muốn cho phép 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 thuộc tính CwC

Apigee cung cấp tài sản CwC HTTPHeader.<HeaderName> cho phép các ứng dụng khách và nhắm mục tiêu để 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ư để cho phép trùng lặp và nhiều giá trị cho tiêu đề Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Nếu là người dùng Đám mây riêng tư, bạn có thể thiết lập tài sản này để ngăn ứng dụng Apigee Cạnh khỏi việc tăng lỗi 502 Bad Gateway, ngay cả khi yêu cầu có chứa các tiêu đề trùng lặp bằng cách sử dụng Hướng dẫn cách định cấu hình Bộ xử lý thư để sử dụng tiêu đề trùng lặp.
  2. Nếu bạn là người dùng Cloud Public, hãy liên hệ với Bộ phận hỗ trợ Apigee Edge để định cấu hình dịch vụ này cho tổ chức của mình.

Thông số kỹ thuật

Apigee phản hồi bằng phản hồi lỗi 502 Bad Gateway vì nó dự kiến rằng máy chủ phụ trợ sẽ hoạt động theo các thông số kỹ thuật RFC sau đây:

Thông số kỹ thuật
RFC 7230, mục 3.2.2: Thứ tự trường
RFC 7230, mục 3.2: Trường tiêu đề

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ỗi 502
  • 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 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 yêu cầu không thực hiện được
  • 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_log

    Vị trí: ORG, ENVPORT# đượ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