502 Bad Gateway - TooBigLine

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.TooBigLine 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 thông báo lỗi sau:

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

Các nguyên nhân có thể

Lỗi này xảy ra nếu kích thước Response-Line do máy chủ đích/phụ trợ gửi đến Apigee Edge trong phản hồi HTTP lớn hơn giới hạn tối đa trong Apigee Edge.

Trước khi xem xét các nguyên nhân có thể gây ra lỗi này, hãy tìm hiểu ý nghĩa của Response-Line và cách kiểm tra kích thước của Response-Line.

Tìm hiểu về Response-Line

Một phản hồi HTTP thông thường bao gồm 3 phần:

  1. Status-Line (Được gọi là Response-Line trong Apigee)
  2. ( Tập hợp tiêu đề HTTP)
  3. [ Nội dung ]

Dòng phản hồi bao gồm 3 phần: phiên bản giao thức, theo sau là mã trạng thái bằng sốcụm từ văn bản được liên kết như minh hoạ dưới đây:

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

Khi ứng dụng máy chủ đích/phụ trợ gửi một phản hồi HTTP, dòng đầu tiên được gửi sẽ đại diện cho Response-Line như mô tả ở trên. Tiếp theo là các tiêu đề và nội dung/tải trọng phản hồi.Ảnh chụp màn hình mẫu sau đây cho thấy một yêu cầu curl điển hình, phần Request (Yêu cầu) và phần Response (Phản hồi) (cùng với Response-Line).

Tìm hiểu về kích thước của Response-Line

  1. Trong mẫu được thảo luận ở trên, dòng start (dòng đầu tiên) trong phản hồi còn được gọi là Response-Line như sau:

    HTTP/1.1 200 OK

    Response-Line này có kích thước là ~15 bytes vì chứa 15 ASCII characters. Vì nằm trong giới hạn cho phép trong Apigee Edge, nên phản hồi sẽ được gửi lại cho ứng dụng mà không có lỗi nào của Apigee Edge.

  2. Tương tự, nếu bạn xem faultstring trong Thông báo lỗi xuất hiện ở trên, thì thông báo này có chứa "response line size exceeding 2,048". Điều này cho biết Response-Line trong phản hồi HTTP do máy chủ đích/phụ trợ gửi đã vượt quá 2.048 byte.

Tìm hiểu về Response-Line lớn

Theo định nghĩa về Status-Line (được gọi là Response-Line ở đây) và các yêu cầu cũng như phản hồi HTTP thông thường, kích thước sẽ nhỏ hơn nhiều so với giới hạn mặc định đã xác định là 2 K trong Apigee Edge, vì vậy, chúng ta có thể không đạt đến giới hạn này. Tuy nhiên, dưới đây là một số trường hợp có thể xảy ra khiến bạn vượt quá giới hạn này:

  1. Máy chủ đích/phụ trợ không phải là hệ thống HTTP. Có thể máy chủ đang phản hồi bằng một phản hồi không phải HTTP.
  2. Máy chủ đích/phụ trợ gặp vấn đề và gửi một Response-Line dài trong phản hồi HTTP.

Đọc thêm về vấn đề này trong phần Nhận lỗi protocol.http.TooBigLine, "response line size exceeding 2,048.

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
Kích thước Dòng phản hồi lớn hơn giới hạn cho phép Kích thước của Response-Line do máy chủ đích/phụ trợ gửi dưới dạng một phần của phản hồi HTTP đến Apigee Edge lớn hơn giới hạn cho phép trong Apigee Edge 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:

  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ò phù 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 nhận thấy lỗi.
  5. Bạn có thể chọn bộ lọc Proxy để thu hẹp phạm vi mã lỗi.
  6. Vẽ Mã lỗi theo Thời gian.
  7. Chọn một ô có mã lỗi protocol.http.TooBigLine như minh hoạ bên dưới:

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

  8. Bạn sẽ thấy thông tin về mã lỗi protocol.http.TooBigLine như minh hoạ dưới đây:

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

  9. 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.

  10. 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.TooBigLine.
  11. Nếu Nguồn lỗi có giá trị targetMã lỗi có giá trị protocol.http.TooBigLine, thì điều đó cho biết rằng phản hồi HTTP từ máy chủ đích/ phụ trợ có kích thước Dòng phản hồi lớn hơn giới hạn tối đa được phép trong Apigee Edge.

Công cụ theo dõi

  1. Bật phiên theo dõi và một trong hai lựa chọn sau:
    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 hiện lỗi 502 Bad Gateway.
  2. 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.
  3. Đ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.
  4. Thông thường, bạn sẽ thấy lỗi trong flowinfo Error (Lỗi) ngay sau giai đoạn Request sent to target server (Yêu cầu được gửi đến máy chủ đích) như minh hoạ bên dưới:

    Ghi lại các giá trị của lỗi trong dấu vết:

    • error: response line exceeding 2,048
    • error.class: com.apigee.errors.http.server.BadGateway

    Điều này cho biết Apigee Edge (thành phần Trình xử lý thông báo) sẽ gửi lỗi ngay khi nhận được phản hồi từ máy chủ phụ trợ do kích thước Response-Line vượt quá giới hạn cho phép.

  5. Bạn sẽ thấy thông báo lỗi được gửi đến máy khách trong giai đoạn Phản hồi được gửi đến máy khách như minh hoạ dưới đây:

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

  6. Lưu ý các giá trị của lỗi trong dấu vết:
    • Lỗi: 502 Bad Gateway.
    • Nội dung lỗi: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. Bạn cũng có thể chuyển đến giai đoạn AX (Đã ghi lại dữ liệu phân tích) trong dấu vết và nhấp vào giai đoạn đó để xem thông tin chi tiết về lỗi.

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

    Lưu ý giá trị của những mục sau:

    Tiêu đề của yêu cầu Giá trị
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    Nội dung lỗi : Phần nội dung {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

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, 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 các giá trị thực tế.

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

    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-codeX-Apigee-fault-source:

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

Nguyên nhân: Kích thước Response-Line lớn hơn giới hạn cho phép

Chẩn đoán

  1. Xác định Mã lỗiNguồn lỗi cho lỗi quan sát được bằng cách sử dụng API Monitoring, Trace tool 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.
  2. Nếu Nguồn lỗi có giá trị target, thì điều này cho biết kích thước Response-Line do ứng dụng máy chủ đích/phụ trợ gửi đến Apigee lớn hơn giới hạn cho phép trong Apigee Edge.
  3. Bạn có thể xác thực rằng kích thước Response-Line đã vượt quá giới hạn cho phép là 2 KB 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":"response line size exceeding 2,048"

    faultstring ở trên cho biết kích thước Response-Line đã vượt quá giới hạn cho phép là 2 KB.

    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:

    1. Xác minh kích thước của Response-Line
    2. Nếu bạn nhận thấy kích thước của URI lớn hơn giới hạn cho phép trong Apigee Edge, thì đó là nguyên nhân gây ra vấn đề.

      Phản hồi mẫu từ máy chủ đích/phụ trợ:

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0

      Trong trường hợp trên, Response-Line HTTP/1.1 200 1111…<trimmed>...11111111 lớn hơn 2 KB, tức là chứa nhiều hơn 2 K ký tự ASCII.

      Nếu đang sử dụng một ứng dụng khác, bạn có thể xem xét nhật ký ứng dụng và cố gắng tìm ra kích thước của Response-Line đang được gửi đến Apigee Edge.

    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ý Message Processor để xác thực xem kích thước Response-Line có vượt quá giới hạn cho phép trong Apigee Edge hay không.

    1. Xác định mã nhận dạng thông báo của yêu cầu không thành công 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.
    2. Tìm mã nhận dạng thư trong nhật ký của Trình xử lý thư:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. Bạn sẽ thấy các dòng từ system.log tương tự như sau:

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)

      Văn bản message = response line size exceeding 2,048 trong thông báo lỗi ở trên cho biết kích thước Response-Line lớn hơn 2 KB. Do đó, Apigee Edge sẽ gửi ngoại lệ và trả về mã trạng thái 502 với mã lỗi protocol.http.TooBigline cho các ứng dụng khách.

Độ phân giải

Kích thước cố định

Lựa chọn 1 [Đề xuất]: Sửa ứng dụng máy chủ đích/phụ trợ để không gửi Response-Lines có kích thước lớn hơn giới hạn cho phép

  1. Phân tích lý do khiến ứng dụng khách cụ thể gửi một Response-Line có kích thước lớn hơn giới hạn cho phép như được xác định trong Limits (Giới hạn).
  2. Nếu không mong muốn, hãy sửa đổi ứng dụng máy chủ đích/phụ trợ để ứng dụng đó gửi một Response-Line có kích thước nhỏ hơn giới hạn cho phép.
  3. Nếu bạn muốn gửi một Response-Line có kích thước lớn hơn hạn mức cho phép, hãy chuyển sang các lựa chọn tiếp theo.

CwC

Cách 2: Sử dụng thuộc tính CwC để tăng giới hạn Response-Line

Apigee cung cấp một thuộc tính CwC cho phép tăng giới hạn kích thước Response-Line. Để biết thông tin chi tiết, hãy xem phần Đặt giới hạn Response-Line trên Message Processor.

Giới hạn

Apigee dự kiến ứng dụng khách và máy chủ phụ trợ sẽ không gửi Request/Response-Lines có kích thước lớn hơn giới hạn cho phép như được ghi lại cho Request/Response Line Limit (Giới hạn dòng yêu cầu/phản hồi) trong Apigee Edge Limits (Giới hạn Apigee Edge).

  1. Nếu bạn là người dùng Đám mây công cộng, thì giới hạn tối đa cho kích thước Dòng yêu cầu và Dòng phản hồi là theo tài liệu về kích thước Dòng yêu cầu/phản hồi trong Giới hạn của Apigee Edge.
  2. Nếu là người dùng Đám mây riêng tư, thì bạn có thể đã sửa đổi giới hạn tối đa mặc định cho kích thước Dòng yêu cầu và phản hồi (mặc dù đây không phải là cách nên làm). Bạn có thể xác định giới hạn kích thước tối đa của Response-Line bằng cách làm theo hướng dẫn trong phần Cách kiểm tra giới hạn hiện tại.

Cách kiểm tra hạn mức hiện tại

Phần này giải thích cách xác minh rằng thuộc tính HTTPResponse.line.limit đã được cập nhật bằng một giá trị mới trên Message Processors.

  1. Trên máy Message Processor, hãy tìm thuộc tính HTTPResponse.line.limit trong thư mục /opt/apigee/edge-message-processor/conf và kiểm tra để xem giá trị nào đã được đặt như minh hoạ bên dưới:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. Sau đây là kết quả mẫu của lệnh trên:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
  3. Trong ví dụ về đầu ra ở trên, hãy lưu ý rằng thuộc tính HTTPResponse.line.limit đã được đặt với giá trị 2k trong http.properties.

    Điều này cho biết giới hạn kích thước Response-Line được định cấu hình trong Apigee cho Private Cloud là 2 KB.

Nếu bạn vẫn cần được Nhóm hỗ trợ Apigee trợ giúp, hãy truy cập vào phần Thông tin chẩn đoán bắt buộc phải thu thập.

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 curl hoàn chỉnh 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, 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 tổ chức
  • Tên môi trường
  • Gói API Proxy
  • Tệp theo dõi cho các yêu cầu API không thành công
  • Lệnh curl hoàn tất được dùng để tái tạo lỗi 502
  • 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 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