502 Bad Gateway - TooBigLine

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.TooBigLine 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 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 giá trị máy chủ mục tiêu/phụ trợ đến Apigee Edge thuộc về phản hồi HTTP lớn hơn mức tối đa cho phép giới hạn 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 Dòng phản hồi và cách kiểm tra kích thước của nó.

Tìm hiểu về dòng phản hồi

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

  1. Dòng trạng thái (Được gọi là Dòng phản hồi trong Apigee)
  2. ( Bộ tiêu đề HTTP )
  3. [ Nội dung ]

Dòng phản hồi gồm ba phần: phiên bản giao thức, sau đó là số mã trạng tháicụm từ văn bản có liên quan như được trình bày dưới đây:

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

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

Tìm hiểu kích thước Dòng phản hồi

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

    HTTP/1.1 200 OK
    

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

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

Tìm hiểu về Dòng phản hồi lớn

Theo định nghĩa của Trạng thái (gọi là Response-Line tại đây) và các yêu cầu HTTP thông thường cũng như thì 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. nên chúng tôi không thể đạt đến giới hạn. Tuy nhiên, dưới đây là một số trường hợp mà bạn có thể vượt quá hạn mức này:

  1. Máy chủ đích/máy chủ phụ trợ không phải là một hệ thống HTTP. Có thể là phản hồi với giao thức không phải HTTP của bạn.
  2. Máy chủ mục tiêu/máy chủ phụ trợ gặp sự cố và gửi một Dòng phản hồi dài dưới dạng một phần của HTTP của bạn.

Đọc thêm về điều này trong Gặp lỗi Protocol.http.TooBigLine, "kích thước dòng phản hồi vượt quá 2.048.

Dưới đây là những nguyên nhân có thể gây ra lỗi:

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ủ mục tiêu/phụ trợ gửi trong Phản hồi HTTP đối với Apigee Edge lớn hơn Giới hạn được phép trong Apigee Edge 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. Bạn có thể chọn bộ lọc Proxy để thu hẹp mã lỗi.
  6. Vẽ Mã lỗi theo Thời gian.
  7. Chọn một ô có mã lỗi protocol.http.TooBigLine là được hiển thị 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ý và mở rộng hàng của yêu cầu không thành công.

  10. Từ cửa sổ Logs (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.TooBigLine.
  11. Nếu Nguồn lỗi có giá trị targetLỗi Mã có giá trị protocol.http.TooBigLine, sau đó điều đó cho biết rằng phản hồi HTTP từ máy chủ đích/ máy 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 trên Apigee Edge.

Công cụ theo dõi

  1. Bật phiên theo dõi và:
    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 lỗi 502 Bad Gateway.
  2. 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.
  3. Di chuyển qua các giai đoạn của quá trình theo dõi và xác định vị trí lỗi đã xảy ra.
  4. Thông thường, bạn sẽ thấy lỗi trong phần flowinfo Lỗi sau giai đoạn Gửi yêu cầu đến máy chủ mục tiêu như minh hoạ dưới đây:

    Lưu ý các giá trị của lỗi trong dấu vết:

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

    Mã này cho biết rằng Apigee Edge (thành phần Trình xử lý tin nhắn) sẽ gửi lỗi dưới dạng ngay khi nhận được phản hồi từ máy chủ phụ trợ do kích thước Dòng phản hồi 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 tới máy khách trong mục Phản hồi được gửi tới Giai đoạn khách hàng như sau:

    ( 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 dữ liệu Analytics) trong quy trình theo dõi rồi nhấp vào đó để xem thông tin chi tiết về lỗi.

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

    Hãy lưu ý giá trị của các tham số 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 : 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 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

    Trong đó: 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 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.TooBigLine, sau đó xác định giá trị của X-Apigee-fault-source.

    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.TooBigLine
    X-Apigee-fault-source target

Nguyên nhân: Kích thước dòng phản hồi 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 phát hiện được bằng API Công cụ giám sát, công cụ theo dõi hoặc nhật ký truy cập NGINX như 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 rằng Kích thước Dòng phản hồi mà ứng dụng máy chủ mục tiêu/phụ trợ gửi đến Apigee lớn hơn giới hạn được phép trong Apigee Edge.
  3. Bạn có thể xác thực rằng kích thước Dòng phản hồi đã vượt quá giới hạn cho phép 2 KB bằng cách sử dụng một 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ó thể xem thông báo lỗi đầy đủ 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 rằng kích thước Dòng phản hồi đã vượt quá mức cho phép tối đa 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 máy chủ đích/máy chủ phụ trợ ứng dụng, sau đó thực hiện các bước sau:

    1. Xác minh kích thước của Dòng phản hồi
    2. Nếu bạn thấy rằng kích thước của URI lớn hơn giới hạn được phép trong Apigee Edge, thì đó là nguyên nhân vấn đề.

      Phản hồi mẫu từ máy chủ đích/máy 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, Dòng phản hồi HTTP/1.1 200 1111…<trimmed>...11111111 lớn hơn 2 KB, tức là dòng này chứa hơn 2 K ký tự ASCII.

      Nếu bạn đang sử dụng một số ứng dụng khác, bạn có thể xem lại nhật ký ứng dụng và thử để biết quy mô của Đường dây phản hồi được gửi đến Apigee Edge.

    Nhật ký Trình xử lý thư

    Để xác thực bằng nhật ký Trình xử lý thư:

    Nếu là người dùng Đám mây riêng tư, bạn có thể sử dụng nhật ký của Trình xử lý thư để xác thực xem kích thước Dòng phản hồi có vượt quá kích thước Giới hạn được phép trong Apigee Edge.

    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 API Giám sát, công cụ Theo dõi, 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. Tìm mã nhận dạng thư trong nhật ký 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 phía trên thông báo lỗi cho biết kích thước Dòng phản hồi lớn hơn 2 KB. Do đó, Apigee Edge gửi trường hợp ngoại lệ và trả về mã trạng thái 502 có mã lỗi protocol.http.TooBigline cho ứng dụng khách.

Độ phân giải

Khắc phục kích thước

Lựa chọn 1 [Nên dùng]: Khắc phục việc ứng dụng máy chủ đích/phụ trợ không gửi được Dòng phản hồi 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 khách hàng cụ thể gửi Dòng phản hồi có kích thước lớn hơn giới hạn cho phép như được xác định trong Giới hạn.
  2. Nếu bạn không mong muốn, hãy sửa đổi ứng dụng máy chủ phụ trợ/mục tiêu để nó sẽ gửi một Dòng phản hồi có kích thước nhỏ hơn giới hạn cho phép.
  3. Nếu cần và bạn muốn gửi một Dòng phản hồi có kích thước lớn hơn giới hạn cho phép, hãy chuyển đến các lựa chọn tiếp theo.

CwC

Lựa chọn 2: Sử dụng thuộc tính CwC để tăng giới hạn Dòng phản hồi

Apigee cung cấp CwC cho phép tăng giới hạn kích thước Dòng phản hồi. Để biết thông tin chi tiết, hãy xem Đặt giới hạn Dòng phản hồi trên Trình xử lý tin nhắn.

Giới hạn

Apigee dự kiến rằng ứng dụng khách và máy chủ phụ trợ sẽ không gửi Yêu cầu/Dòng phản hồi có kích thước lớn hơn giới hạn cho phép như được ghi trong Giới hạn dòng yêu cầu/phản hồi trong Apigee EdgeGiới hạn.

  1. Nếu bạn là người dùng Cloud công khai, thì giới hạn tối đa đối với Yêu cầu và Kích thước Dòng phản hồi như được ghi trong tài liệu về kích thước Yêu cầu/Dòng phản hồi trong Các 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 mức tối đa mặc định cho kích thước Yêu cầu và Dòng phản hồi (mặc dù đây không phải là phương pháp nên dùng). Bạn có thể xác định giới hạn kích thước Dòng phản hồi tối đa bằng cách làm theo các hướng dẫn trong Cách kiểm tra hạn mức 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 thuộc tính HTTPResponse.line.limit có đã được cập nhật một giá trị mới trên Trình xử lý thư.

  1. Trên máy Xử lý thư, hãy tìm kiếm thuộc tính HTTPResponse.line.limit trong Thư mục /opt/apigee/edge-message-processor/conf và kiểm tra để hãy 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. Kết quả mẫu từ lệnh trên như sau:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
    
  3. Trong kết quả của ví dụ ở trên, hãy lưu ý rằng thuộc tính HTTPResponse.line.limit đã được thiết lập với giá trị 2k trong http.properties.

    Giá trị này cho biết giới hạn về quy mô Dòng phản hồi được thiết lập trong Apigee cho Riêng tư Đám mây có kích thước 2 KB.

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