500 ข้อผิดพลาดภายในเซิร์ฟเวอร์ - เปิดใช้งานสตรีมมิง

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่ เอกสารประกอบของ Apigee X
info

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะการตอบกลับ HTTP 500 พร้อม ข้อความ Internal Server Error สำหรับการเรียก API

ข้อความแสดงข้อผิดพลาด

แอปพลิเคชันไคลเอ็นต์อาจได้รับการตอบกลับแสดงข้อผิดพลาดดังที่แสดงด้านล่าง

HTTP/1.1 500 Internal Server Error

ซึ่งอาจตามด้วยข้อความแสดงข้อผิดพลาดที่คล้ายกับข้อความต่อไปนี้

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

OR

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

สาเหตุที่เป็นไปได้

ข้อผิดพลาด 500 Internal Server Error อาจเกิดขึ้นได้จากหลายสาเหตุ เพลย์บุ๊กนี้ จะเน้นที่ข้อผิดพลาด 500 Internal Server Error ที่เกิดจากการเข้าถึงเพย์โหลดคำขอ/การตอบกลับ เมื่อเปิดใช้การสตรีม

สาเหตุ คำอธิบาย ผู้ที่สามารถทำตามขั้นตอนการแก้ปัญหา
การเข้าถึงเพย์โหลดเมื่อ เปิดใช้การสตรีม เกิดข้อผิดพลาดเนื่องจากมีการเข้าถึงเพย์โหลดคำขอ/การตอบกลับเมื่อเปิดใช้การสตรีม ผู้ใช้ Edge Private และ Public Cloud

สาเหตุ: การเข้าถึงเพย์โหลดเมื่อเปิดใช้การสตรีม

การวินิจฉัย

ขั้นตอนที่ 1: ใช้ Trace

  1. เปิดใช้เซสชันการติดตาม และเรียก API เพื่อจำลองปัญหา - 500 Internal Server Error
  2. เลือกคำขอที่ล้มเหลวรายการใดรายการหนึ่ง แล้วตรวจสอบการติดตาม
  3. ดูขั้นตอนต่างๆ ของการติดตาม และค้นหาตำแหน่งที่เกิดความล้มเหลว
  4. ข้อผิดพลาดนี้อาจเกิดขึ้นขณะที่นโยบายกำลังแยกวิเคราะห์เพย์โหลดคำขอ/การตอบกลับ
  5. นี่คือภาพหน้าจอการติดตามตัวอย่างที่แสดงJSONThreatProtection นโยบาย ล้มเหลวโดยมีข้อผิดพลาด "Expecting } at line 1":

    alt_text

    จดบันทึกข้อมูลต่อไปนี้จากเอาต์พุตการติดตาม ดังที่แสดงในภาพหน้าจอ ด้านบน:

    นโยบายที่ล้มเหลว: JSONThreatProtection

    โฟลว์: คำขอพร็อกซี

  6. ตรวจสอบคำจำกัดความของนโยบายที่ล้มเหลว และตรวจสอบเพย์โหลดที่กำลังแยกวิเคราะห์

    ในสถานการณ์ตัวอย่าง ให้ตรวจสอบนโยบาย JSONThreatProtection ที่ชื่อ JSON-Threat-Protection ซึ่งล้มเหลว และตรวจสอบองค์ประกอบ <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>

    โปรดสังเกตว่าองค์ประกอบ <Source> ชี้ไปที่ request. ซึ่งหมายความว่า ข้อผิดพลาดเกิดขึ้นขณะแยกวิเคราะห์เพย์โหลดคำขอ

  7. กำหนดประเภทของเพย์โหลดที่กำลังแยกวิเคราะห์โดยตรวจสอบคำขอ API
  8. คุณสามารถตรวจสอบเนื้อหาของเพย์โหลดคำขอและ Content-Type ส่วนหัวใน คำขอ API ในคำสั่ง curl ตัวอย่างต่อไปนี้ มีการใช้เพย์โหลด JSON

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

    นอกจากนี้ คุณยังตรวจสอบนโยบายที่ล้มเหลวและกำหนดประเภทของเพย์โหลดที่กำลัง แยกวิเคราะห์ได้ด้วย ในสถานการณ์ตัวอย่างข้างต้น นโยบาย JSON-Threat-Protection ล้มเหลว ซึ่งบ่งชี้ว่าเพย์โหลดต้องอยู่ในรูปแบบ JSON

  9. ตรวจสอบว่าเพย์โหลดอยู่ในรูปแบบที่ถูกต้อง หากเพย์โหลดไม่ถูกต้อง คุณอาจได้รับข้อผิดพลาดนี้

  10. หากเพย์โหลดถูกต้อง แต่คุณยังคงได้รับข้อผิดพลาดตามที่ระบุไว้ในส่วน ข้อความแสดงข้อผิดพลาด สาเหตุของข้อผิดพลาดเหล่านี้ คือมีการเข้าถึงเพย์โหลดเมื่อเปิดใช้การสตรีม

    ตรวจสอบเนื้อหาเพย์โหลดในเครื่องมือ Trace ในระยะที่เหมาะสม ทั้งนี้ขึ้นอยู่กับเพย์โหลดที่นโยบายกำลังแยกวิเคราะห์ (ตามที่กำหนดไว้ในขั้นตอนที่ 6)

    ในสถานการณ์ตัวอย่าง ระบบกำลังแยกวิเคราะห์เพย์โหลดคำขอ ดังนั้นให้ตรวจสอบระยะ "Request Received from Client" ในการติดตาม และตรวจสอบ เนื้อหาคำขอ

    alt_text

    หากพบว่าเนื้อหาคำขอว่างเปล่าดังที่แสดงในภาพหน้าจอด้านบน แม้ว่า คุณจะส่งเพย์โหลดที่ถูกต้องแล้วก็ตาม แสดงว่า สาเหตุที่เป็นไปได้ของปัญหานี้คือ เปิดใช้การสตรีมคำขออยู่

    เนื่องจากเมื่อเปิดใช้การสตรีม เพย์โหลดคำขอจะไม่ปรากฏในการติดตาม

    ในทำนองเดียวกัน หากระบบกำลังแยกวิเคราะห์เพย์โหลดการตอบกลับเมื่อเกิดข้อผิดพลาด ให้ตรวจสอบเนื้อหาการตอบกลับในระยะ "Response received from target server"

  11. จากนั้น ให้ตรวจสอบคำจำกัดความของพร็อกซีและปลายทางเป้าหมาย ทั้งนี้ขึ้นอยู่กับตำแหน่งที่ใช้นโยบายที่ล้มเหลว ในโฟลว์พร็อกซี API ตรวจสอบว่าได้เปิดใช้การสตรีมแล้ว

    ในสถานการณ์ตัวอย่าง นโยบายที่ล้มเหลวถูกดำเนินการในโฟลว์คำขอพร็อกซี (ตามที่กำหนดไว้ในขั้นตอนที่ 5 ด้านบน) ดังนั้นให้ตรวจสอบปลายทางพร็อกซี

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

    ดังที่เห็นในตัวอย่างด้านบน มีการเปิดใช้การสตรีมคำขอตามที่ระบุโดย พร็อพเพอร์ตี้ "request.streaming.enabled" ที่ตั้งค่าเป็น "จริง"

    ดังนั้น สาเหตุของข้อผิดพลาดคือการใช้นโยบาย JSONThreatProtection ในพร็อกซี API ที่เข้าถึงเพย์โหลดคำขอเมื่อเปิดใช้การสตรีม ซึ่งทำให้เกิดข้อผิดพลาดเนื่องจากเป็นการทริกเกอร์การบัฟเฟอร์ในพร็อกซี API และทำให้การใช้การสตรีมใน Apigee Edge ไม่ได้ผล

    คุณอาจไม่เห็นข้อผิดพลาดนี้กับเพย์โหลดขนาดเล็ก แต่เมื่อใช้เพย์โหลดขนาดใหญ่ คุณ จะเห็นข้อผิดพลาดเหล่านี้

  12. คุณสามารถตรวจสอบว่าข้อผิดพลาด 500 เกิดจากนโยบายโดยตรวจสอบค่า ของ "X-Apigee-fault-source" ในระยะ "AX" (Analytics Data Recorded) ในการติดตามโดยใช้ขั้นตอนด้านล่าง:
    1. คลิกระยะ "AX" (Analytics Data Recorded) ดังที่แสดงในภาพหน้าจอด้านล่าง

      alt_text

    2. เลื่อนลงไปที่รายละเอียดระยะในส่วน "Error Headers" และ กำหนดค่าของ "X-Apigee-fault-code", "X-Apigee-fault-source" และ "X-Apigee-fault-policy" ดังที่แสดงด้านล่าง:

      alt_text

    3. หากค่าของ "X-Apigee-fault-source" คือ "policy" ดังที่แสดง ในรูปภาพด้านบน แสดงว่าข้อผิดพลาดเกิดจากนโยบายที่เข้าถึง เพย์โหลดเมื่อเปิดใช้การสตรีม

ความละเอียด

การเข้าถึงเพย์โหลดเมื่อเปิดใช้การสตรีมเป็นรูปแบบที่ไม่แนะนำ ดังที่อธิบายไว้ใน รูปแบบที่ไม่แนะนำ: เข้าถึงเพย์โหลดคำขอ/การตอบกลับเมื่อเปิดใช้การสตรีม

  1. หากต้องการประมวลผลเพย์โหลด คุณต้องปิดใช้การสตรีมในปลายทางพร็อกซี/เป้าหมาย โดยนำพร็อพเพอร์ตี้ "request.streaming.enabled" and "response.streaming.enabled" ออก ดังที่แสดงในตัวอย่าง ProxyEndpoint ด้านล่าง
    <ProxyEndpoint name="default">
    ...
      <HTTPProxyConnection>
        <BasePath>/v1/weather</BasePath>
        <VirtualHost>secure</VirtualHost>
      </HTTPProxyConnection>
    </ProxyEndpoint>

    หรือ

  2. หากต้องการใช้การสตรีมสำหรับพร็อกซี API ให้งดใช้นโยบายใดๆ ใน พร็อกซี API ที่เข้าถึงเพย์โหลดคำขอ/การตอบกลับ

หมายเหตุ

  • ในเพลย์บุ๊กนี้ มีการใช้นโยบาย JSONThreatProtection เพื่อประมวลผลเพย์โหลดคำขอเมื่อเปิดใช้ การสตรีมในสถานการณ์ตัวอย่าง ซึ่งทำให้เกิดข้อผิดพลาด 500 Internal Server Error พร้อมข้อผิดพลาดต่างๆ
  • คุณอาจเห็นข้อผิดพลาดเหล่านี้ในนโยบายต่างๆ เช่น JSONToXML และ XMLToJSON ซึ่งประมวลผล เพย์โหลดคำขอหรือการตอบกลับเมื่อเปิดใช้การสตรีม
  • เราไม่แนะนำให้ใช้นโยบายดังกล่าวในพร็อกซีที่ต้องเข้าถึง เพย์โหลดเมื่อเปิดใช้การสตรีม
  • การดำเนินการดังกล่าวเป็นรูปแบบที่ไม่แนะนำ ดังที่ระบุไว้ใน รูปแบบที่ไม่แนะนำ: เข้าถึงเพย์โหลดคำขอ/การตอบกลับเมื่อเปิดใช้การสตรีม.

วินิจฉัยปัญหาโดยใช้การตรวจสอบ API

หากคุณเป็นผู้ใช้ Private Cloud ให้ข้ามขั้นตอนนี้

การตรวจสอบ API ช่วยให้คุณแยกพื้นที่ที่มีปัญหาได้อย่างรวดเร็วเพื่อวินิจฉัยข้อผิดพลาด ปัญหาด้านประสิทธิภาพ และปัญหาเวลาในการตอบสนอง รวมถึงแหล่งที่มาของปัญหา เช่น แอปของนักพัฒนาแอป พร็อกซี API เป้าหมายแบ็กเอนด์ หรือแพลตฟอร์ม API

ดูสถานการณ์ตัวอย่าง ที่แสดงวิธีแก้ปัญหา 5xx กับ API โดยใช้การตรวจสอบ API เช่น คุณอาจต้องการตั้งค่าการแจ้งเตือนเพื่อรับการแจ้งเตือนเมื่อจำนวนข้อผิดพลาด 500 เกินเกณฑ์ที่กำหนด

หากต้องการรับการแจ้งเตือนเมื่อนโยบายแสดงการตอบกลับแสดงข้อผิดพลาด 500 คุณต้องตั้งค่าการแจ้งเตือนสำหรับรหัสสถานะ 500 โดยให้แหล่งที่มาของข้อผิดพลาด เป็น พร็อกซี

ข้อมูลการวินิจฉัยที่ต้องรวบรวม

หากยังพบปัญหาเดิมอยู่แม้จะทำตามวิธีการข้างต้นแล้ว โปรดรวบรวมข้อมูลการวินิจฉัยต่อไปนี้ จากนั้นติดต่อและแชร์ข้อมูลดังกล่าวกับทีมสนับสนุนของ Apigee

หากคุณเป็นผู้ใช้ Public Cloud โปรดระบุข้อมูลต่อไปนี้

  • ชื่อองค์กร
  • ชื่อสภาพแวดล้อม
  • ชื่อพร็อกซี API
  • คำสั่ง curl ที่สมบูรณ์พร้อมเพย์โหลดคำขอ (หากมี) เพื่อจำลองข้อผิดพลาด 500
  • ไฟล์การติดตามที่มีคำขอซึ่งแสดงข้อผิดพลาด 500 Internal Server Error
  • หากข้อผิดพลาด 500 ไม่เกิดขึ้นในขณะนี้ โปรดระบุช่วงเวลาพร้อมข้อมูลเขตเวลาที่เกิดข้อผิดพลาด 500 ในอดีต

หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้

  • ข้อความแสดงข้อผิดพลาดทั้งหมดที่พบสำหรับคำขอที่ล้มเหลว
  • ชื่อองค์กร ชื่อสภาพแวดล้อม และชื่อพร็อกซี API ที่คุณพบข้อผิดพลาด 500
  • ชุดรวมพร็อกซี API
  • เพย์โหลดที่ใช้ในคำขอ (หากมี)
  • ไฟล์การติดตามที่มีคำขอซึ่งแสดงข้อผิดพลาด 500 Internal Server Error
  • บันทึกการเข้าถึง NGINX (/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log)
  • บันทึกของ Message Processor (/opt/apigee/var/log/edge-message-processor/logs/system.log)
  • ช่วงเวลาพร้อมข้อมูลเขตเวลาที่เกิดข้อผิดพลาด 500