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