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 sẽ 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 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 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ể xảy ra

Lỗi này xảy ra khi một tiêu đề HTTP cụ thể không được phép 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, trong phản hồi HTTP do máy chủ phụ trợ gửi tới Apigee Edge.

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

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

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

  3. Chuyển đến trang Phân tích > Giám sát API > Điều tra.
  4. Chọn khung thời gian cụ thể mà bạn quan sát 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 dựa trên Thời gian.
  7. Chọn một ô có mã lỗi protocol.http.DuplicateHeader như minh hoạ dưới đây:

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

  8. Thông tin về mã lỗi protocol.http.DuplicateHeader hiện như sau:

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

  9. Đảm bảo rằng Mã trạng thái502 như minh hoạ trong ví dụ trên.
  10. 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.
  11. 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: 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 từ 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 tính năng 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 tạo vấn đề, hãy thực hiện lệnh gọi API và tái hiện lỗi 502 Bad Gateway
  2. Nhớ bật tuỳ chọn Hiển thị tất cả thông tin luồng:

  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 trong quá trình theo dõi và xác định vị trí xảy ra lỗi.
  5. Bạn thường sẽ thấy lỗi này trong quy trình sau giai đoạn Request sent to target server (Yêu cầu gửi đến máy chủ mục tiêu) 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". Vì lỗi được Apigee báo cáo sau khi yêu cầu được gửi đến máy chủ phụ trợ, nên lỗi 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 (Dữ liệu phân tích được ghi lại) trong dấu vết rồi nhấp vào đó.
  8. Di chuyển xuống mục Giai đoạn chi tiết – Tiêu đề phản hồi rồi xác định giá trị 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. Điều này cho biết lỗi này xảy ra 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 sử dụng chuỗi proxy hay không; tức là máy chủ mục tiêu hoặc điểm cuối đích có đang gọi một proxy khác trong Apigee hay không.

    1. Để xác định điều này, hãy quay lại giai đoạn Yêu cầu gửi đến máy chủ đích. Nhấp vào Show Curl (Hiện đường cuộn).

    2. Cửa sổ Curl for Request Sent to Target Server (Curl for Request gửi tới máy chủ mục tiêu) sẽ mở ra và từ đó bạn có thể xác định bí danh của máy chủ lưu trữ đích.

    3. Nếu bí danh của máy chủ đích của máy chủ đích đang trỏ đến một bí danh của 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 theo chuỗi cho đến khi xác định được nguyên nhân thực sự gây ra lỗi 502 Bad Gateway.
    4. Nếu bí danh của máy chủ lưu trữ đích trỏ đến máy chủ phụ trợ của bạn, thì tức là máy chủ phụ trợ của bạn đang gửi các tiêu đề trùng lặp để phản hồi 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ể 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

    Trong đó: 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 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ới 502 hay không.
  4. Nếu bạn tìm thấy bất kỳ lỗi 502 nào trong đó X-Apigee-fault-code khớp với giá trị của X-Apigee-fault-code , thì hãy xác định giá trị của X-Apigee-fault-code

    Ví dụ về lỗi 502 trong nhật ký truy cập NGINX:

    Mục mẫu ở trên từ nhật ký NGINX Access 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 quan sát được bằng tính năng Giám sát API 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 thường gặp.
  2. 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 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 thức sau:

    Thông báo lỗi

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

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

      Mẫu thông báo lỗi:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. 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ư 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 lấy lệnh curl tương ứng trong bước 10.a và bước 10.b trong phần Sử dụng công cụ theo dõi.
    2. 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ủ mục tiêu, hãy thực hiện các bước sau:

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

        Yêu cầu mẫu cho máy chủ đích đượ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 tiêu đề nhìn thấy trong phản hồi.

        Phản hồi mẫu từ máy chủ đích đượ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 sẽ không thành công với lỗ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ì đó chính 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 vấn đề trùng lặp

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

  1. Hãy phân tích lý do khiến máy chủ phụ trợ cụ thể gửi Expires tiêu đề trùng lặp và xác minh xem liệu các proxy API có chấp nhận điều đó hay không. Trong hầu hết trường hợp, mã này không như mong muốn theo thông số kỹ thuật HTTP RFC7230.
  2. Nếu điều này là không mong muốn, hãy sửa đổi ứng dụng máy chủ đích của bạn để không gửi tiêu đề trùng lặp. Trong ví dụ thảo luận ở trên, bạn có thể thấy rằng tiêu đề Expires được gửi hai lần với cùng một giá trị. Đây là điều khô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 điều này là mong muốn và 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

Cách 2 Sử dụng tài sản CwC

Apigee cung cấp một thuộc tính CwC HTTPHeader.<HeaderName>. Thuộc tính này cho phép các ứng dụng khách và máy chủ đích gửi các 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 Bộ 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ể định cấu hình thuộc tính này để ngăn quá trình 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 xem hướng dẫn cách Định cấu hình Trình xử lý tin nhắn để dùng tiêu đề trùng lặp.
  2. Nếu bạn là người dùng Cloud công khai, hãy liên hệ với Nhóm hỗ trợ Apigee để đị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 lỗi 502 Bad Gateway vì dự kiến 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: Đơn đặt hàng thực tế
RFC 7230, mục 3.2: Trường tiêu đề

Nếu bạn vẫn cần Nhóm hỗ trợ Apigee hỗ trợ, hãy truy cập vào 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 rồi liên hệ với Bộ phận hỗ trợ 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 tạo 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 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 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

    Trong đó: ORG, ENVPORT# đượ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