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

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

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์จะได้รับรหัสสถานะการตอบกลับ HTTP 500 พร้อมข้อความข้อผิดพลาดภายในเซิร์ฟเวอร์สำหรับการเรียก 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 อาจเกิดขึ้นได้จากหลายสาเหตุ Playbook นี้มุ่งเน้นที่ข้อผิดพลาดภายในเซิร์ฟเวอร์ 500 ซึ่งเกิดจากการเข้าถึงเพย์โหลดคำขอ/การตอบกลับเมื่อเปิดใช้สตรีมมิง

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

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

การวินิจฉัย

ขั้นตอนที่ 1: การใช้การติดตาม

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

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

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

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

    alt_text

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

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

    ในทำนองเดียวกัน หากเปย์โหลดการตอบกลับได้รับการแยกวิเคราะห์เมื่อเกิดข้อผิดพลาด ให้ตรวจสอบเนื้อหาการตอบกลับในระยะ "การตอบกลับที่ได้รับจากเซิร์ฟเวอร์เป้าหมาย"

  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) ในการติดตามโดยใช้ขั้นตอนที่ระบุไว้ด้านล่าง
    1. คลิกระยะ "AX" (บันทึกข้อมูล Analytics) ดังที่แสดงในภาพหน้าจอด้านล่าง

      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" ตามที่แสดงในภาพด้านบน แสดงว่าข้อผิดพลาดเกิดจากนโยบายในการเข้าถึงเพย์โหลดเมื่อเปิดใช้สตรีมมิง

ความละเอียด

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

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

    หรือ

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

หมายเหตุ:

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

วินิจฉัยปัญหาโดยใช้ API Monitoring

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

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

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

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

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

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

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

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

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

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