500 Lỗi máy chủ nội bộ – Đã bật tính năng phát trực tuyến

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 phản hồi HTTP 500 kèm theo thông báo Lỗi máy chủ nội bộ cho các lệnh gọi API.

Thông báo lỗi

Các ứng dụng khách có thể nhận được phản hồi lỗi như minh hoạ dưới đây:

HTTP/1.1 500 Internal Server Error

Sau đó, bạn có thể thấy một thông báo lỗi như sau:

{
   "fault":{
      "faultstring":"Expecting } at line 1"
      "detail":{
         "errorcode":"Internal Server Error"
      }
   }
}

OR

{
   "fault":{
      "faultstring":"Expecting ] at line 1"
      "detail":{
         "errorcode":"Internal Server Error"
      }
   }
}

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

Lỗi 500 Internal Server Error có thể xảy ra do nhiều nguyên nhân. Sổ tay này tập trung vào Lỗi máy chủ nội bộ 500 xảy ra do truy cập vào tải trọng yêu cầu/phản hồi khi bật tính năng phát trực tuyến.

Nguyên nhân Nội dung mô tả Những người có thể thực hiện các bước khắc phục sự cố
Truy cập vào tải trọng khi bật tính năng phát trực tuyến Đã xảy ra lỗi do tải trọng yêu cầu/phản hồi được truy cập khi tính năng truyền phát trực tuyến được bật. Người dùng Edge Private Cloud và Public Cloud

Nguyên nhân: Truy cập vào tải trọng khi bật tính năng truyền phát trực tiếp

Chẩn đoán

Quy trình 1: Sử dụng Trace

  1. Bật phiên theo dõi và thực hiện lệnh gọi API để tái hiện vấn đề – 500 Lỗi máy chủ nội bộ.
  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 nhiều giai đoạn của dấu vết và xác định vị trí xảy ra lỗi.
  4. Lỗi này có thể xảy ra khi một chính sách đang phân tích cú pháp tải trọng yêu cầu/phản hồi.
  5. Dưới đây là ảnh chụp màn hình dấu vết mẫu cho thấy chính sách JSONThreatProtection không thành công với lỗi "Expecting } at line 1" (Đang chờ "}" ở dòng 1):

    alt_text

    Hãy ghi lại những thông tin sau đây trong đầu ra dấu vết, như trong ảnh chụp màn hình ở trên:

    Chính sách không thành công: JSONThreatProtection

    Luồng: Yêu cầu proxy

  6. Kiểm tra định nghĩa chính sách không thành công và kiểm tra tải trọng đang được phân tích cú pháp.

    Trong ví dụ về tình huống này, hãy kiểm tra chính sách JSONThreatProtection có tên là JSON-Threat-Protection (Bảo vệ khỏi mối đe doạ JSON) không thành công và kiểm tra phần tử <Source>.

    <JSONThreatProtection async="false" continueOnError="false" enabled="true" name="JSON-Threat-Protection">
       <DisplayName>JSON Threat Protection</DisplayName>
       <ArrayElementCount>20</ArrayElementCount>
       <ContainerDepth>10</ContainerDepth>
       <ObjectEntryCount>15</ObjectEntryCount>
       <ObjectEntryNameLength>50</ObjectEntryNameLength>
       <Source>request</Source>
       <StringValueLength>1000</StringValueLength>
    </JSONThreatProtection>

    Lưu ý rằng phần tử <Source> trỏ đến request.Điều này có nghĩa là lỗi xảy ra trong khi phân tích cú pháp tải trọng yêu cầu.

  7. Xác định loại tải trọng đang được phân tích cú pháp bằng cách kiểm tra yêu cầu API.
  8. Bạn có thể kiểm tra nội dung của tải trọng yêu cầu và tiêu đề Content-Type trong yêu cầu API. Trong ví dụ sau đây về lệnh curl, một tải trọng JSON sẽ được dùng.

    curl -i https://VIRTUAL_HOST_ALIAS/BASEPATH -H "Content-Type: application/json" \
    -X POST -d @request-payload.json

    Bạn cũng có thể kiểm tra chính sách không thành công và xác định loại tải trọng đang được phân tích cú pháp. Trong ví dụ về tình huống ở trên, chính sách JSON-Threat-Protection đang gặp lỗi. Điều này cho biết tải trọng phải ở định dạng JSON.

  9. Xác thực xem tải trọng có đúng định dạng hay không. Nếu tải trọng không hợp lệ, thì bạn có thể gặp lỗi này.

  10. Nếu tải trọng hợp lệ nhưng bạn vẫn gặp phải các lỗi như được liệt kê trong phần Thông báo lỗi, thì nguyên nhân gây ra những lỗi này là do tải trọng đang được truy cập khi tính năng phát trực tuyến được bật.

    Tuỳ thuộc vào tải trọng mà chính sách đang phân tích cú pháp (như được xác định ở bước 6), hãy kiểm tra nội dung tải trọng trong công cụ Theo dõi ở giai đoạn thích hợp.

    Trong ví dụ này, tải trọng yêu cầu đang được phân tích cú pháp, vì vậy, hãy kiểm tra giai đoạn "Đã nhận được yêu cầu từ máy khách" trong dấu vết và kiểm tra Nội dung yêu cầu.

    alt_text

    Nếu Nội dung yêu cầu trống như trong ảnh chụp màn hình ở trên, mặc dù bạn đã gửi một tải trọng hợp lệ, thì điều đó cho thấy nguyên nhân có thể gây ra vấn đề này là bạn đã bật tính năng phát trực tuyến yêu cầu.

    Điều này là do khi tính năng truyền phát trực tiếp được bật, tải trọng yêu cầu sẽ không xuất hiện trên dấu vết.

    Tương tự, nếu tải trọng phản hồi đang được phân tích cú pháp khi xảy ra lỗi, hãy kiểm tra nội dung phản hồi trong giai đoạn "Phản hồi nhận được từ máy chủ đích".

  11. Tiếp theo, hãy kiểm tra các định nghĩa về Proxy và Điểm cuối mục tiêu, tuỳ thuộc vào vị trí sử dụng chính sách không thành công trong quy trình API Proxy. Kiểm tra xem bạn đã bật tính năng phát trực tuyến hay chưa.

    Trong tình huống ví dụ, chính sách không thành công đã được thực thi trong luồng Yêu cầu của proxy (như được xác định ở bước 5 ở trên); do đó, hãy kiểm tra Proxy Endpoint:

    <ProxyEndpoint name="default">
    ...
      <HTTPProxyConnection>
        <BasePath>/v1/weather</BasePath>
        <VirtualHost>secure</VirtualHost>
        <Properties>
          <Property name="response.streaming.enabled">true</Property>
          <Property name="request.streaming.enabled">true</Property>
        </Properties>
      </HTTPProxyConnection>
    </ProxyEndpoint>

    Như trong ví dụ ở trên, tính năng phát trực tuyến theo yêu cầu đã được bật như được chỉ ra bởi thuộc tính "request.streaming.enabled" được đặt thành true.

    Do đó, nguyên nhân gây ra lỗi là do bạn sử dụng chính sách JSONThreatProtection trong API Proxy truy cập vào tải trọng yêu cầu khi bật tính năng truyền phát trực tiếp. Điều này gây ra lỗi vì nó kích hoạt quá trình lưu vào bộ nhớ đệm trong API Proxy và làm mất mục đích sử dụng tính năng truyền phát trực tiếp trong Apigee Edge.

    Bạn có thể không thấy lỗi này với các tải trọng nhỏ hơn, nhưng khi sử dụng các tải trọng lớn hơn, bạn có thể thấy những lỗi này.

  12. Bạn có thể xác minh rằng lỗi 500 là do chính sách gây ra bằng cách kiểm tra giá trị của "X-Apigee-fault-source" trong Giai đoạn "AX" (Dữ liệu phân tích được ghi lại) trong dấu vết bằng cách sử dụng các bước được cung cấp bên dưới:
    1. Nhấp vào giai đoạn "AX" (Đã ghi lại dữ liệu phân tích)" như trong ảnh chụp màn hình bên dưới:

      alt_text

    2. Di chuyển xuống phần Chi tiết giai đoạn đến phần "Tiêu đề lỗi" và xác định các giá trị của "X-Apigee-fault-code", "X-Apigee-fault-source" và "X-Apigee-fault-policy" như minh hoạ dưới đây:

      alt_text

    3. Nếu giá trị của "X-Apigee-fault-source" là "policy" như trong hình trên, thì điều đó có nghĩa là lỗi xảy ra do chính sách truy cập vào tải trọng khi tính năng phát trực tuyến được bật.

Độ phân giải

Truy cập vào tải trọng khi bật tính năng truyền phát trực tiếp là một mẫu chống lại như được giải thích trong Mẫu chống lại: Truy cập vào tải trọng yêu cầu/phản hồi khi bật tính năng truyền phát trực tiếp.

  1. Nếu muốn xử lý tải trọng, bạn cần vô hiệu hoá tính năng truyền phát trực tiếp trong Proxy/Target Endpoint bằng cách xoá các thuộc tính "request.streaming.enabled" and "response.streaming.enabled" như minh hoạ trong ví dụ về ProxyEndpoint dưới đây:
    <ProxyEndpoint name="default">
    ...
      <HTTPProxyConnection>
        <BasePath>/v1/weather</BasePath>
        <VirtualHost>secure</VirtualHost>
      </HTTPProxyConnection>
    </ProxyEndpoint>

    HOẶC

  2. Nếu muốn sử dụng tính năng truyền phát trực tiếp cho(các) API Proxy, thì bạn không được sử dụng bất kỳ chính sách nào trong API Proxy truy cập vào tải trọng yêu cầu/phản hồi.

Lưu ý:

  • Trong hướng dẫn này, chính sách JSONThreatProtection được dùng để xử lý tải trọng yêu cầu khi tính năng phát trực tuyến được bật trong tình huống ví dụ. Điều này dẫn đến Lỗi máy chủ nội bộ 500 với nhiều lỗi khác nhau.
  • Bạn cũng có thể thấy những lỗi này với các chính sách như JSONToXML và XMLToJSON, xử lý các tải trọng yêu cầu hoặc phản hồi khi tính năng truyền phát trực tuyến được bật.
  • Bạn không nên sử dụng bất kỳ chính sách nào như vậy trong các proxy yêu cầu quyền truy cập vào tải trọng khi bật tính năng phát trực tuyến.
  • Làm như vậy là một mẫu chống, như được ghi lại trong Mẫu chống: Truy cập vào tải trọng yêu cầu/phản hồi khi bật tính năng truyền phát trực tiếp.

Chẩn đoán vấn đề bằng tính năng Giám sát API

Nếu bạn là người dùng Đám mây riêng, hãy bỏ qua quy trình này.

Tính năng Giám sát API giúp bạn nhanh chóng cô lập các khu vực có vấn đề để chẩn đoán lỗi, hiệu suất và các vấn đề về độ trễ cũng như nguồn của các vấn đề đó, chẳng hạn như ứng dụng của nhà phát triển, proxy API, mục tiêu phụ trợ hoặc nền tảng API.

Xem xét một tình huống mẫu minh hoạ cách khắc phục các vấn đề 5xx với API bằng tính năng Giám sát API. Ví dụ: bạn có thể muốn thiết lập một cảnh báo để nhận được thông báo khi số lượng Lỗi 500 vượt quá một ngưỡng cụ thể.

Nếu muốn nhận được thông báo khi phản hồi lỗi 500 được gửi từ chính sách, bạn cần thiết lập cảnh báo cho mã trạng thái 500 với nguồn lỗi là Proxy.

Phải thu thập thông tin chẩn đoán

Nếu vấn đề vẫn tiếp diễn ngay cả sau khi bạn làm theo hướng dẫn ở trên, vui lòng thu thập thông tin chẩn đoán sau đây. Liên hệ và chia sẻ thông tin này với Nhóm hỗ trợ Apigee.

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 Proxy API
  • Hoàn tất lệnh curl cùng với tải trọng yêu cầu (nếu có) để tái hiện lỗi 500
  • Tệp theo dõi chứa các yêu cầu gặp Lỗi máy chủ nội bộ 500
  • Nếu lỗi 500 hiện không xảy ra, hãy cung cấp khoảng thời gian kèm theo thông tin về múi giờ khi lỗi 500 xảy ra trong quá khứ.

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:

  • 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ổ chức, Tên môi trường và Tên proxy API mà bạn đang gặp lỗi 500
  • Gói API Proxy
  • Tải trọng được dùng trong yêu cầu (nếu có)
  • Tệp theo dõi chứa các yêu cầu gặp lỗi 500 Lỗi máy chủ nội bộ
  • Nhật ký truy cập NGINX (/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log)
  • Nhật ký của Trình xử lý tin nhắn (/opt/apigee/var/log/edge-message-processor/logs/system.log)
  • Khoảng thời gian có thông tin về múi giờ khi xảy ra lỗi 500.