Lỗi máy chủ nội bộ 500 - EmptyPath

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 500 Internal Server Error kèm theo mã lỗi protocol.http.EmptyPath 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 500 Internal Server Error

Ngoài ra, bạn có thể nhận thấy thông báo lỗi sau:

{
   "fault":{
      "faultstring":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

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

Lỗi này xảy ra nếu URL yêu cầu của máy chủ phụ trợ, được biểu thị bằng biến luồng target.url chứa một đường dẫn trống.

Theo thông số kỹ thuật RFC 3986, mục 3: Thành phần cú pháp RFC 3986, mục 3.3: Đường dẫn:

  1. Cú pháp URI có các thành phần sau:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. Thành phần pathbắt buộc và PHẢI luôn có dấu gạch chéo lên (/), ngay cả khi không có ký tự nào khác trong đường dẫn.

Do đó, nếu URL yêu cầu của máy chủ phụ trợ không có thuộc tính path tức là không có dấu gạch chéo lên (/), như vậy là Apigee Edge phản hồi bằng 500 Internal Server Error và mã lỗi protocol.http.EmptyPath.

Ví dụ: Nếu target.url có giá trị https://www.mocktarget.apigee.net, thì lỗi này sẽ xảy ra khi path thành phần bị trống hoặc bị thiếu.

Nguyên nhân Mô tả Hướng dẫn khắc phục sự cố áp dụng cho
URL máy chủ phụ trợ (target.url) có đường dẫn trống URL máy chủ phụ trợ được biểu thị bằng biến luồng target.url có một đường dẫn trống. 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

Quy trình 1: Sử dụng tính năng 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. Vẽ Mã lỗi theo Thời gian.

  6. Chọn một ô có mã lỗi protocol.http.EmptyPath như hình bên dưới:

  7. Thông tin về mã lỗi protocol.http.EmptyPath được hiển thị dưới dạng được hiển thị bên dưới:

  8. Nhấp vào Xem nhật ký để mở rộng hàng chứa yêu cầu không thành công.

  9. 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: 500
    • Nguồn lỗi: target
    • Mã lỗi: protocol.http.EmptyPath
  10. Nếu Nguồn lỗitargetMã lỗiprotocol.http.EmptyPath, thì điều đó cho biết rằng URL máy chủ phụ trợ có chứa đường dẫn trống.

Trace

Quy trình 2: Sử dụng 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 phiên theo dõi
    • Chờ lỗi 500 Internal Server Error xảy ra, hoặc
    • Nếu bạn có thể tái hiện vấn đề, hãy thực hiện lệnh gọi API để tái hiện vấn đề 500 Internal Server Error
  2. Đảm bảo bạn đã bật chế độ Show all FlowInfos (Hiện tất cả FlowInfos):

  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 của quá trình theo dõi và xác định nơi xảy ra lỗi.
  5. Bạn thường sẽ thấy lỗi này trong một quy trình sau khi Luồng yêu cầu mục tiêu bắt đầu giai đoạn như sau:

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

    lỗi: Không được để trống đường dẫn yêu cầu

    Vì lỗi này là do Apigee Edge đưa ra sau giai đoạn Bắt đầu luồng yêu cầu mục tiêu, nó cho biết path trong URL máy chủ phụ trợ trống. Điều này sẽ có nhiều khả năng xảy ra nhất nếu biến luồng target.url (đại diện cho URL của phụ trợ) có thể đã được cập nhật bằng một đường dẫn trống thông qua một trong các chính sách trong luồng yêu cầu.

  7. Kiểm tra phần Biến được đọc và gán trong mỗi luồng ngược từ điểm lỗi khi chuyển sang giai đoạn Bắt đầu Luồng yêu cầu mục tiêu.
  8. Xác định chính sách cập nhật biến luồng target.url .

    Dấu vết mẫu cho thấy chính sách JavaScript đã cập nhật biến luồng target.url:

    Trong dấu vết mẫu ở trên, hãy lưu ý giá trị của biến luồng target.url được cập nhật trong chính sách JavaScript có tên là SetTargetURL sau:

    target.url : https://mocktarget.apigee.net
    
  9. Xin lưu ý rằng target.url có các thành phần sau:
    • lược đồ: https://mocktarget.apigee.net
    • path: trống
  10. Do đó, bạn gặp lỗi Request path cannot be empty.
  11. Chuyển đến Giai đoạn AX (Đã ghi dữ liệu Analytics) trong dấu vết và nhấp vào đó.
  12. Cuộn xuống phần Chi tiết giai đoạnTiêu đề lỗi rồi xác định của X-Apigee-fault-codeX-Apigee-fault-source như sau:

  13. Bạn sẽ thấy các giá trị của X-Apigee-fault-codeX-Apigee-fault-sourceprotocol.http.EmptyPathtarget tương ứng, cho thấy rằng lỗi này xảy ra vì URL máy chủ phụ trợ có đường dẫn trống.
    Tiêu đề phản hồi Giá trị
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

NGINX

Quy trình 3: Sử dụng nhật ký truy cập 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ề HTTP 500 Internal Server Error.
  2. Kiểm tra nhật ký truy cập NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. Tìm kiếm xem có lỗi 500 nào với mã lỗi hay không protocol.http.EmptyPath trong một khoảng thời gian cụ thể (nếu sự cố xảy ra trong trước đây) hoặc nếu có bất kỳ yêu cầu nào vẫn không thành công với 500.
  4. Nếu bạn tìm thấy lỗi 500 khi so khớp X-Apigee-fault-code giá trị của protocol.http.EmptyPath, sau đó xác định giá trị của X-Apigee-fault-source.

    Lỗi 500 mẫu trong nhật ký truy cập NGINX:

    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 đề Giá trị
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

    Lưu ý rằng các giá trị của X-Apigee-fault-codeX-Apigee-fault-sourceprotocol.http.EmptyPathtarget tương ứng, cho thấy rằng lỗi này xảy ra vì URL máy chủ phụ trợ có đường dẫn trống.

Nguyên nhân: URL máy chủ phụ trợ (target.url) có đường dẫn trống

Chẩn đoán

  1. Xác định Mã lỗiNguồn lỗi cho 500 Internal Server Error bằng nhật ký Giám sát API, Công cụ theo dõi hoặc NGINX như giải thích trong Các bước chẩn đoán thường gặp.
  2. Nếu Mã lỗiprotocol.http.EmptyPathNguồn lỗi có giá trị target, thì mã này cho biết rằng URL máy chủ phụ trợ có phần tử trống path.
  3. URL máy chủ phụ trợ được biểu thị bằng biến luồng target.url trong Apigee Cạnh. Lỗi này thường xảy ra nếu bạn cố cập nhật URL máy chủ phụ trợ, tức là target.url một cách linh động bằng cách sử dụng bất kỳ chính sách nào (trong Luồng proxy/luồng dùng chung) trong luồng yêu cầu Mục tiêu, sao cho luồng này có đường dẫn trống.

  4. Xác định xem biến luồng target.url có thực sự có đường dẫn trống và nguồn cho giá trị của nó bằng cách làm theo một trong các bước sau:

    Trace

    Sử dụng công cụ Theo dõi

    Nếu bạn đã thu thập được dấu vết cho lỗi này, hãy làm theo các bước như được giải thích trong Sử dụng Công cụ theo dõi và:

    1. Xác minh xem target.url có đường dẫn trống hay không.
    2. Nếu có, hãy tìm hiểu chính sách nào đã sửa đổi hoặc cập nhật giá trị của target.url để chứa đường dẫn trống.

      Dấu vết mẫu cho thấy chính sách JavaScript đã cập nhật biến luồng target.url:

    3. Trong dấu vết mẫu ở trên, hãy lưu ý rằng chính sách JavaScript đã sửa đổi hoặc đã cập nhật giá trị của target.url để chứa một đường dẫn trống.
    4. Xin lưu ý rằng target.url có các thành phần sau:
      • lược đồ: https://mocktarget.apigee.net
      • path: trống

    Nhật ký

    Sử dụng nhật ký trong máy chủ nhật ký

    1. Nếu bạn không có dấu vết cho lỗi này (sự cố không liên tục), hãy kiểm tra để kiểm tra xem bạn đã ghi lại thông tin về giá trị của biến luồng hay chưa target.url, sử dụng các chính sách như MessageLogging hoặc chú thích dịch vụ đến máy chủ nhật ký của bạn.
    2. Nếu bạn có nhật ký, hãy xem lại nhật ký và:
      1. Xác minh xem target.url có đường dẫn trống hay không và
      2. Xem liệu bạn có thể xác định chính sách đã sửa đổi hay không target.url có chứa một đường dẫn trống

    Proxy API

    Xem xét proxy API không thành công

    Nếu bạn không có dấu vết hoặc nhật ký cho lỗi này, hãy xem lại API không đạt proxy để xác định nội dung đã sửa đổi hoặc cập nhật biến luồng target.url có chứa đường dẫn không hợp lệ. Kiểm tra những điều sau:

    • Chính sách trong proxy API
    • Mọi luồng được chia sẻ được gọi từ proxy
  5. Kiểm tra chính sách cụ thể có chức năng sửa đổi hoặc sửa đổi chính sách (ví dụ: AttributionMessage hoặc JavaScript) cập nhật cẩn thận biến luồng target.url và xác định nguyên nhân cập nhật target.url có một đường dẫn trống.

    Dưới đây là một vài chính sách mẫu cập nhật biến luồng target.url không chính xác để chứa đường dẫn trống dẫn đến lỗi này.

    Mẫu số 1

    Mẫu số 1: Chính sách JavaScript cập nhật biến target.url

    var url = "https://mocktarget.apigee.net"
    context.setVariable("target.url", url);
    

    Trong mẫu trên, lưu ý rằng biến luồng target.url đã được cập nhật với giá trị https://mocktarget.apigee.net có trong một biến khác url.

    Xin lưu ý rằng target.url có các thành phần sau:

    • lược đồ: https://mocktarget.apigee.net
    • path: trống

    Vì đường dẫn trống nên Apigee Edge trả về 500 Internal Server Error với mã lỗi protocol.http.EmptyPath.

    Mẫu số 2

    Mẫu 2: Chính sách JavaScript cập nhật biến target.url

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);

    Trong mẫu trên, lưu ý rằng biến luồng target.url được cập nhật bằng nối giá trị https://mocktarget.apigee.net có trong một biến url giá trị của một biến khác path, có giá trị được truy xuất từ request.header.Path.

    Nếu có quyền truy cập vào yêu cầu hoặc dấu vết thực tế, bạn có thể xác minh giá trị thực tế được truyền đến request.header.Path.

    Yêu cầu mẫu của người dùng:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
    

    Trong ví dụ này, đường dẫn tiêu đề không được gửi trong yêu cầu. Do đó, giá trị của đường dẫn biến trong chính sách JavaScript là null.

    Do đó:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + null
    • target.url = https://mocktarget.apigee.netnull

    Xin lưu ý rằng target.url có các thành phần sau:

    • lược đồ: https://mocktarget.apigee.netnull
    • path: trống

    Mẫu số 3

    Mẫu số 3: Chính sách AttributionMessage đang cập nhật biến target.url thông qua một biến khác

    <AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    Xin lưu ý rằng target.url có các thành phần sau:

    • lược đồ: https://mocktarget.apigee.net
    • path: trống

    Trong tất cả các ví dụ trên, đường dẫn trong URL máy chủ phụ trợ, tức là target.url đang trống nên Apigee Edge quay lại 500 Internal Server Error với mã lỗi protocol.http.EmptyPath.

Độ phân giải

Theo thông số kỹ thuật RFC 3986, mục 2: Thành phần cú pháp, thành phần pathbắt buộc và phải luôn có dấu gạch chéo lên (/), ngay cả khi không có dấu gạch chéo các ký tự khác như một phần của path. Thực hiện các bước sau để khắc phục vấn đề này:

  1. Đảm bảo rằng URL máy chủ phụ trợ được biểu thị bằng biến luồng target.url luôn có đường dẫn không trống.
    1. Trong một số trường hợp, bạn có thể không có tên tài nguyên trong đường dẫn, hãy đảm bảo rằng đường dẫn ít nhất có dấu gạch chéo lên (/).
    2. Trường hợp bạn sử dụng bất kỳ biến nào khác để xác định giá trị của biến luồng target.url, sau đó đảm bảo rằng các biến khác không có đường dẫn trống.
    3. Nếu bạn thực hiện bất kỳ thao tác chuỗi nào để xác định giá trị của biến luồng target.url, sau đó đảm bảo rằng kết quả của chuỗi không có đường dẫn trống.
  2. Trong các mẫu được thảo luận trong bài viết Chẩn đoán, bạn có thể khắc phục vấn đề này theo được giải thích bên dưới:

    Mẫu số 1

    Mẫu số 1: Chính sách JavaScript cập nhật biến target.url

    Thêm dấu gạch chéo lên (/) vào biến url để khắc phục vấn đề này vấn đề như sau:

    var url = "https://mocktarget.apigee.net/"
    context.setVariable("target.url", url);
    

    Mẫu số 2

    Mẫu 2: Chính sách JavaScript cập nhật biến target.url

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    Đảm bảo rằng bạn truyền một đường dẫn hợp lệ, ví dụ: /iloveapis như một phần của tiêu đề của yêu cầu Path để khắc phục vấn đề này như dưới đây:

    Yêu cầu mẫu:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
    

    Mẫu số 3

    Mẫu số 3: Chính sách AssignmentsMessage cập nhật biến target.url thông qua một biến khác

    Thêm một đường dẫn hợp lệ trong phần tử <Value> của chính sách AllowedMessage. Cho Ví dụ: bạn có thể đặt /json làm đường dẫn cho API MockTarget. Tức là hãy sửa đổi phần tử <Value> thành https://mocktarget.apigee.net/json như minh hoạ dưới đây:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net/json</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

Thông số kỹ thuật

Apigee Edge dự kiến rằng URL máy chủ phụ trợ không có đường dẫn trống theo như các thông số kỹ thuật sau:

Thông số kỹ thuật
RFC 3986, mục 3: Thành phần cú pháp
RFC 3986, mục 3.3: Đường dẫn

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

Nếu sự cố vẫn tiếp diễn ngay cả sau khi đã làm theo các hướng dẫn trên, hãy thu thập những thông tin sau thông tin chẩn đoán 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 tạo 500 Internal Server Error với mã lỗi protocol.http.EmptyPath
  • 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 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

    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

Tài liệu tham khảo

Biến luồng – mục tiêu