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

จดบันทึกข้อมูลต่อไปนี้จากเอาต์พุตการติดตาม ดังที่แสดงในภาพหน้าจอ ด้านบน:
นโยบายที่ล้มเหลว: JSONThreatProtection
โฟลว์: คำขอพร็อกซี
- ตรวจสอบคำจำกัดความของนโยบายที่ล้มเหลว และตรวจสอบเพย์โหลดที่กำลังแยกวิเคราะห์
ในสถานการณ์ตัวอย่าง ให้ตรวจสอบนโยบาย 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.ซึ่งหมายความว่า ข้อผิดพลาดเกิดขึ้นขณะแยกวิเคราะห์เพย์โหลดคำขอ - กำหนดประเภทของเพย์โหลดที่กำลังแยกวิเคราะห์โดยตรวจสอบคำขอ API
- ตรวจสอบว่าเพย์โหลดอยู่ในรูปแบบที่ถูกต้อง หากเพย์โหลดไม่ถูกต้อง คุณอาจได้รับข้อผิดพลาดนี้
หากเพย์โหลดถูกต้อง แต่คุณยังคงได้รับข้อผิดพลาดตามที่ระบุไว้ในส่วน ข้อความแสดงข้อผิดพลาด สาเหตุของข้อผิดพลาดเหล่านี้ คือมีการเข้าถึงเพย์โหลดเมื่อเปิดใช้การสตรีม
ตรวจสอบเนื้อหาเพย์โหลดในเครื่องมือ Trace ในระยะที่เหมาะสม ทั้งนี้ขึ้นอยู่กับเพย์โหลดที่นโยบายกำลังแยกวิเคราะห์ (ตามที่กำหนดไว้ในขั้นตอนที่ 6)
ในสถานการณ์ตัวอย่าง ระบบกำลังแยกวิเคราะห์เพย์โหลดคำขอ ดังนั้นให้ตรวจสอบระยะ "Request Received from Client" ในการติดตาม และตรวจสอบ เนื้อหาคำขอ

หากพบว่าเนื้อหาคำขอว่างเปล่าดังที่แสดงในภาพหน้าจอด้านบน แม้ว่า คุณจะส่งเพย์โหลดที่ถูกต้องแล้วก็ตาม แสดงว่า สาเหตุที่เป็นไปได้ของปัญหานี้คือ เปิดใช้การสตรีมคำขออยู่
เนื่องจากเมื่อเปิดใช้การสตรีม เพย์โหลดคำขอจะไม่ปรากฏในการติดตาม
ในทำนองเดียวกัน หากระบบกำลังแยกวิเคราะห์เพย์โหลดการตอบกลับเมื่อเกิดข้อผิดพลาด ให้ตรวจสอบเนื้อหาการตอบกลับในระยะ "Response received from target server"
จากนั้น ให้ตรวจสอบคำจำกัดความของพร็อกซีและปลายทางเป้าหมาย ทั้งนี้ขึ้นอยู่กับตำแหน่งที่ใช้นโยบายที่ล้มเหลว ในโฟลว์พร็อกซี 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 ไม่ได้ผล
คุณอาจไม่เห็นข้อผิดพลาดนี้กับเพย์โหลดขนาดเล็ก แต่เมื่อใช้เพย์โหลดขนาดใหญ่ คุณ จะเห็นข้อผิดพลาดเหล่านี้
- คุณสามารถตรวจสอบว่าข้อผิดพลาด 500 เกิดจากนโยบายโดยตรวจสอบค่า
ของ "X-Apigee-fault-source" ในระยะ "AX"
(Analytics Data Recorded) ในการติดตามโดยใช้ขั้นตอนด้านล่าง:
- คลิกระยะ "AX" (Analytics Data Recorded)
ดังที่แสดงในภาพหน้าจอด้านล่าง
- เลื่อนลงไปที่รายละเอียดระยะในส่วน "Error Headers" และ กำหนดค่าของ "X-Apigee-fault-code",
"X-Apigee-fault-source" และ "X-Apigee-fault-policy" ดังที่แสดงด้านล่าง:
- หากค่าของ "X-Apigee-fault-source" คือ "policy" ดังที่แสดง ในรูปภาพด้านบน แสดงว่าข้อผิดพลาดเกิดจากนโยบายที่เข้าถึง เพย์โหลดเมื่อเปิดใช้การสตรีม
- คลิกระยะ "AX" (Analytics Data Recorded)
ดังที่แสดงในภาพหน้าจอด้านล่าง
คุณสามารถตรวจสอบเนื้อหาของเพย์โหลดคำขอและ 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
ความละเอียด
การเข้าถึงเพย์โหลดเมื่อเปิดใช้การสตรีมเป็นรูปแบบที่ไม่แนะนำ ดังที่อธิบายไว้ใน รูปแบบที่ไม่แนะนำ: เข้าถึงเพย์โหลดคำขอ/การตอบกลับเมื่อเปิดใช้การสตรีม
- หากต้องการประมวลผลเพย์โหลด คุณต้องปิดใช้การสตรีมในปลายทางพร็อกซี/เป้าหมาย
โดยนำพร็อพเพอร์ตี้
"request.streaming.enabled" and "response.streaming.enabled"ออก ดังที่แสดงในตัวอย่าง ProxyEndpoint ด้านล่าง<ProxyEndpoint name="default"> ... <HTTPProxyConnection> <BasePath>/v1/weather</BasePath> <VirtualHost>secure</VirtualHost> </HTTPProxyConnection> </ProxyEndpoint>หรือ
- หากต้องการใช้การสตรีมสำหรับพร็อกซี 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