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 sẽ 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 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ể 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 máy chủ đích/phụ trợ gửi tới Apigee Edge trong phản hồi HTTP lớn hơn giới hạn tối đa cho phép trong Apigee Edge.

Trước khi chúng tôi 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 Dòng phản hồi và cách kiểm tra kích thước của dòng đó.

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

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

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

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

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

Khi ứng dụng máy chủ đích/phụ trợ gửi phản hồi HTTP, dòng đầu tiên được gửi đại diện cho Dòng phản hồi như mô tả ở trên. Tiếp theo là tiêu đề và nội dung/trọng tải 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 thông thường, phần Request (Yêu cầu) và phần Response (Phản hồi) (cùng với Dòng phản hồi).

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

  1. Trong mẫu được thảo luận ở trên, dòng bắt đầu (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
    

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

  2. Tương tự như vậy, nếu bạn xem faultstring trong Thông báo lỗi hiển thị ở trên, bạn có thể thấy "response line size exceeding 2,048". Mã này cho biết Dòng phản hồi 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ề Dòng phản hồi lớn

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

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

Hãy đọc thêm về vấn đề này trong phần Phát hiện giao thức lỗi.http.TooBigLine, "kích thước dòng phản hồi vượt quá 2.048.

Dưới đây là một số nguyên nhân có thể gây ra lỗi:

Nguyên nhân Nội dung 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 trong phản hồi HTTP tới Apigee Edge lớn hơn giới hạn được cho phép trong Apigee Edge 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. Bạn có thể chọn bộ lọc Proxy để thu hẹp mã lỗi.
  6. Vẽ Mã lỗi dựa trên Thời gian.
  7. Chọn một ô có mã lỗi protocol.http.TooBigLine như minh hoạ dưới đây:

    ( 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ư sau:

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

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

  10. Trong cửa sổ Logs (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/ 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 cho phép trong Apigee Edge.

Công cụ theo dõi

  1. Bật tính năng theo dõi phiên 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 hiện 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 theo dõi và xác định vị trí xảy ra lỗi.
  4. Thường thì bạn sẽ thấy lỗi trong phần Error (Lỗi) flowinfo ngay 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:

    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

    Điều này cho thấy rằng Apigee Edge (thành phần Trình xử lý thư) gửi lỗi 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 đến ứng dụng trong giai đoạn Phản hồi được gửi tới ứng dụ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 (Dữ liệu phân tích được ghi lại) trong dấu vết và nhấp vào giai đoạn đó để xem 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ể 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 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

    Mục mẫu nêu trên từ nhật ký truy cập NGINX có các giá trị sau đây dành 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 quan sát được bằng công cụ Giám sát API, Công cụ theo dõi 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à kích thước Response-Line mà ứng dụng máy chủ đích/phụ trợ gửi tới Apigee lớn hơn giới hạn được cho 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 2 KB cho phép 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 đầy đủ nhận được từ Apigee Edge, hãy tham khảo faultstring.

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

    "faultstring":"response line size exceeding 2,048"
    

    faultstring ở trên cho biết kích thước Dòng phản hồi đã 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ủ mục tiêu/phụ trợ, hãy 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 nhận thấy kích thước của URI vượt quá giới hạn cho phép trong Apigee Edge, thì đó chính là nguyên nhân của 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, Dòng phản hồi HTTP/1.1 200 1111…<trimmed>...11111111 lớn hơn 2 KB, tức là chứa 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 lại nhật ký ứng dụng và cố gắng tìm ra kích thước của Response-Line được gửi đến Apigee Edge.

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

    Cách xác thực bằng nhật ký Trình xử lý thông báo:

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

    1. Xác định mã thông báo của yêu cầu không thành công bằ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ư giải thích trong phần Các bước chẩn đoán phổ biến.
    2. Tìm kiế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 đường trong system.log có dạng 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 Dòng phản hồi lớn hơn 2 KB. Do đó, Apigee Edge sẽ gửi trường hợp ngoại lệ này và trả về một mã trạng thái 502 có mã lỗi protocol.http.TooBigline cho các ứng dụng khách.

Độ phân giải

Cố định kích thước

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

Các giới hạn

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

  1. Nếu bạn là người dùng Cloud công khai, 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 sẽ được ghi trong tài liệu về Kích thước dòng yêu cầu/phản hồi trong phần Giới hạn của API Pixel.
  2. Nếu là người dùng Đám mây riêng tư , thì có thể bạn đã sửa đổi giới hạn tối đa mặc định về kích thước Dòng yêu cầu và dòng phản hồi (mặc dù bạn không nên áp dụng phương pháp này). 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 bài viết 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 với một giá trị mới trên Bộ xử lý thông báo.

  1. Trên máy xử lý thư, hãy tìm thuộc tính HTTPResponse.line.limit trong thư mục /opt/apigee/edge-message-processor/conf rồi kiểm tra xem bạn đã thiết lập giá trị nào như đoạn mã 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ả ví dụ ở trên, hãy lưu ý rằng thuộc tính HTTPResponse.line.limit đã được thiết lập bằng giá trị 2k trong http.properties.

    Mã này cho biết giới hạn đối với kích thước Dòng phản hồi được định cấu hình trong Apigee dành cho đám mây riêng tư là 2 KB.

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