คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่
เอกสารประกอบของ Apigee X info
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะการตอบกลับ HTTP 503 พร้อมข้อความ
Service Unavailable หลังจากเรียกพร็อกซี API
ข้อความแสดงข้อผิดพลาด
แอปพลิเคชันไคลเอ็นต์ได้รับโค้ดตอบกลับต่อไปนี้
HTTP/1.1 503 Service Unavailable
นอกจากนี้ คุณอาจเห็นข้อความแสดงข้อผิดพลาดต่อไปนี้
{
"fault": {
"faultstring": "The Service is temporarily unavailable",
"detail": {
"errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
}
}
}สาเหตุที่เป็นไปได้
| สาเหตุ | คำอธิบาย | วิธีการแก้ปัญหาที่ใช้ได้กับ |
|---|---|---|
| เซิร์ฟเวอร์ปลายทางปิดการเชื่อมต่อก่อนเวลาอันควร | เซิร์ฟเวอร์ปลายทางสิ้นสุดการเชื่อมต่อก่อนเวลาอันควรในขณะที่ Message Processor ยังคง ส่งเพย์โหลดของคำขออยู่ | ผู้ใช้ Edge Public และ Private Cloud |
ขั้นตอนการวินิจฉัยที่พบบ่อย
กำหนดรหัสข้อความของคำขอที่ไม่สำเร็จ
เครื่องมือติดตาม
วิธีกำหนดรหัสข้อความของคำขอที่ไม่สำเร็จโดยใช้เครื่องมือติดตาม
- หากปัญหายังคงเกิดขึ้นอยู่ ให้เปิดใช้ เซสชันการติดตามสำหรับ API ที่ได้รับผลกระทบ
- เรียก API และจำลองปัญหา -
503 Service Unavailableที่มีรหัสข้อผิดพลาดmessaging.adaptors.http.flow.ServiceUnavailable. - เลือกคำขอที่ไม่สำเร็จรายการใดรายการหนึ่ง
- ไปที่ระยะ AX แล้วกำหนดรหัสข้อความ
(
X-Apigee.Message-ID) ของคำขอโดยเลื่อนลงใน ส่วนรายละเอียดระยะ ตามที่แสดงในรูปภาพต่อไปนี้
บันทึกการเข้าถึงของ NGINX
วิธีกำหนดรหัสข้อความของคำขอที่ไม่สำเร็จโดยใช้บันทึกการเข้าถึงของ NGINX
นอกจากนี้ คุณยังดูบันทึกการเข้าถึงของ NGINX เพื่อกำหนดรหัสข้อความสำหรับข้อผิดพลาด 503 ได้ด้วย
ซึ่งจะเป็นประโยชน์อย่างยิ่งหากปัญหาเกิดขึ้นในอดีตหรือเกิดขึ้นเป็นครั้งคราว
และคุณไม่สามารถบันทึกการติดตามใน UI ได้ ทำตามขั้นตอนต่อไปนี้เพื่อกำหนดข้อมูลนี้จากบันทึกการเข้าถึงของ NGINX
- ตรวจสอบบันทึกการเข้าถึงของ NGINX (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log) - ค้นหาเพื่อดูว่ามีข้อผิดพลาด
503สำหรับพร็อกซี API ที่เฉพาะเจาะจงในช่วงระยะเวลาหนึ่ง (หากปัญหาเกิดขึ้นในอดีต) หรือหากยังมีคำขอที่ไม่สำเร็จโดยมีข้อผิดพลาด503อยู่หรือไม่ - หากมีข้อผิดพลาด
503ที่มีรหัสข้อผิดพลาด X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable ให้จดรหัสข้อความสำหรับคำขออย่างน้อย 1 รายการตามที่แสดงในตัวอย่างต่อไปนี้ตัวอย่างรายการที่แสดงข้อผิดพลาด
503
สาเหตุ: เซิร์ฟเวอร์ปลายทางปิดการเชื่อมต่อก่อนเวลาอันควร
การวินิจฉัย
- หากคุณเป็นผู้ใช้ Public Cloud หรือ Private Cloud ให้ทำดังนี้
- ใช้เครื่องมือติดตาม (ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยที่พบบ่อย)
และตรวจสอบว่าคุณได้ตั้งค่าทั้ง 2 รายการต่อไปนี้ในบานหน้าต่างข้อมูลการวิเคราะห์ที่บันทึกไว้:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable - X-Apigee.fault-source:
target

- X-Apigee.fault-code:
- ใช้เครื่องมือติดตาม (ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยที่พบบ่อย)
และตรวจสอบว่าคุณได้ตั้งค่าทั้ง 2 รายการต่อไปนี้ในบานหน้าต่างข้อผิดพลาด ทันทีหลังจาก
พร็อพเพอร์ตี้
TARGET_REQ_FLOWstate:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException - error.cause:
Broken pipe

- error.class:
- ไปที่การใช้ tcpdump เพื่อตรวจสอบเพิ่มเติม
- ใช้เครื่องมือติดตาม (ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยที่พบบ่อย)
และตรวจสอบว่าคุณได้ตั้งค่าทั้ง 2 รายการต่อไปนี้ในบานหน้าต่างข้อมูลการวิเคราะห์ที่บันทึกไว้:
- หากคุณเป็นผู้ใช้ Private Cloud ให้ทำดังนี้
- กำหนดรหัสข้อความ ของคำขอที่ไม่สำเร็จ
- ค้นหารหัสข้อความในบันทึกของ Message Processor
(
/opt/apigee/var/log/edge-message-processor/logs/system.log) - คุณจะเห็นข้อยกเว้นรายการใดรายการหนึ่งต่อไปนี้
ข้อยกเว้นที่ 1: java.io.IOException: Broken pipe occurred while writing to channel ClientOutputChannel
2021-01-30 15:31:14,693 org:anotherorg env:prod api:myproxy rev:1 messageid:myorg-opdk-test-1-30312-13747-1 NIOThread@1 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception java.io.IOException: Broken pipe occurred while writing to channel ClientOutputChannel(ClientChannel[Connected: Remote:IP:PORT Local:0.0.0.0:42828]@8380 useCount=1 bytesRead=0 bytesWritten=76295 age=2012ms lastIO=2ms isOpen=false)
หรือ
ข้อยกเว้นที่ 2: onExceptionWrite exception: {}
java.io.IOException: Broken pipe2021-01-31 15:29:37,438 org:anotherorg env:prod api:503-test rev:1 messageid:leonyoung-opdk-test-1-18604-13978-1 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$2.onException() : ClientChannel[Connected: Remote:IP:PORT Local:0.0.0.0:57880]@8569 useCount=1 bytesRead=0 bytesWritten=76295 age=3180ms lastIO=2 ms isOpen=false.onExceptionWrite exception: {} java.io.IOException: Broken pipe
- ข้อยกเว้นทั้ง 2 รายการนี้บ่งชี้ว่าในขณะที่ Message Processor ยังคงเขียน
เพย์โหลดของคำขอไปยังเซิร์ฟเวอร์แบ็กเอนด์ เซิร์ฟเวอร์แบ็กเอนด์ได้ปิดการเชื่อมต่อก่อนเวลาอันควร
ดังนั้น Message Processor จึงแสดงข้อยกเว้น
java.io.IOException: Broken pipe Remote:IP:PORTระบุที่อยู่ IP และหมายเลขพอร์ตของเซิร์ฟเวอร์แบ็กเอนด์ที่แก้ไขแล้ว- แอตทริบิวต์
bytesWritten=76295ในข้อความแสดงข้อผิดพลาดข้างต้นบ่งชี้ว่า Message Processor ได้ส่งเพย์โหลดขนาด76295ไบต์ไปยังเซิร์ฟเวอร์แบ็กเอนด์เมื่อการเชื่อมต่อถูกปิดก่อนเวลาอันควร - แอตทริบิวต์
bytesRead=0บ่งชี้ว่า Message Processor ไม่ได้ รับข้อมูล (การตอบกลับ) จากเซิร์ฟเวอร์แบ็กเอนด์ - หากต้องการตรวจสอบปัญหานี้เพิ่มเติม ให้รวบรวม
tcpdumpในเซิร์ฟเวอร์แบ็กเอนด์ หรือ Message Processor แล้ววิเคราะห์ตามที่อธิบายไว้ด้านล่าง
การใช้ tcpdump
-
บันทึก
tcpdumpในเซิร์ฟเวอร์แบ็กเอนด์หรือ Message Processor ด้วย คำสั่งต่อไปนี้คำสั่งรวบรวม
tcpdumpในเซิร์ฟเวอร์แบ็กเอนด์tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
คำสั่งรวบรวม
tcpdumpใน Message Processortcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
- วิเคราะห์
tcpdumpที่บันทึกไว้ตัวอย่างเอาต์พุต tcpdump (รวบรวมใน Message Processor)

ใน
tcpdumpข้างต้น คุณจะเห็นสิ่งต่อไปนี้- ในแพ็กเก็ต
4Message Processor ส่งคำขอPOSTไปยัง เซิร์ฟเวอร์แบ็กเอนด์ - ในแพ็กเก็ต
5,8,9,10,11Message Processor ยังคงส่งเพย์โหลดของคำขอไปยัง เซิร์ฟเวอร์แบ็กเอนด์ - ในแพ็กเก็ต
6และ7เซิร์ฟเวอร์แบ็กเอนด์ตอบกลับด้วยACKสำหรับเพย์โหลดของคำขอที่ได้รับจาก Message Processor - อย่างไรก็ตาม ในแพ็กเก็ต
12แทนที่จะตอบกลับด้วยACKสำหรับแพ็กเก็ตข้อมูลแอปพลิเคชันที่ได้รับและตอบกลับด้วยเพย์โหลดของการตอบกลับในภายหลัง เซิร์ฟเวอร์แบ็กเอนด์กลับตอบกลับด้วยFIN ACKซึ่งเริ่มการปิดการเชื่อมต่อ - ซึ่งแสดงให้เห็นอย่างชัดเจนว่าเซิร์ฟเวอร์แบ็กเอนด์กำลังปิดการเชื่อมต่อก่อนเวลาอันควร ในขณะที่ Message Processor ยังคงส่งเพย์โหลดของคำขออยู่
- การดำเนินการนี้ทำให้ Message Processor บันทึกข้อผิดพลาด
IOException: Broken Pipeและแสดงข้อผิดพลาด503ให้ไคลเอ็นต์
- ในแพ็กเก็ต
ความละเอียด
- ทำงานร่วมกับทีมแอปพลิเคชันและ/หรือทีมเครือข่ายเพื่อวิเคราะห์และแก้ไขปัญหาการยกเลิกการเชื่อมต่อก่อนเวลาอันควรในฝั่งเซิร์ฟเวอร์แบ็กเอนด์
- ตรวจสอบว่าแอปพลิเคชันเซิร์ฟเวอร์แบ็กเอนด์ไม่หมดเวลาหรือรีเซ็ตการเชื่อมต่อ ก่อนที่จะได้รับเพย์โหลดของคำขอทั้งหมด
- หากคุณมีอุปกรณ์หรือเลเยอร์เครือข่ายตัวกลางระหว่าง Apigee กับเซิร์ฟเวอร์แบ็กเอนด์ ให้ตรวจสอบว่าอุปกรณ์หรือเลเยอร์ดังกล่าวไม่หมดเวลาก่อนที่จะได้รับเพย์โหลดของคำขอทั้งหมด
หากปัญหายังคงอยู่ ให้ไปที่ ข้อมูลการวินิจฉัยที่ต้องรวบรวม
ข้อมูลการวินิจฉัยที่ต้องรวบรวม
หากปัญหายังคงอยู่แม้หลังจากทำตามวิธีการข้างต้นแล้ว ให้รวบรวมข้อมูลการวินิจฉัยต่อไปนี้ แล้วติดต่อทีมสนับสนุนของ Apigee Edge
หากคุณเป็นผู้ใช้ Public Cloud โปรดระบุข้อมูลต่อไปนี้
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- ชื่อพร็อกซี API
- คำสั่ง
curlที่สมบูรณ์เพื่อจำลองข้อผิดพลาด503 - ไฟล์การติดตามที่มีคำขอซึ่งมีข้อผิดพลาด
503 Service Unavailable - หากข้อผิดพลาด
503ไม่เกิดขึ้นในปัจจุบัน โปรดระบุช่วงเวลาพร้อมข้อมูลเขตเวลาที่ข้อผิดพลาด503เกิดขึ้นในอดีต
หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้
- ข้อความแสดงข้อผิดพลาดทั้งหมดที่พบสำหรับคำขอที่ไม่สำเร็จ
- ชื่อองค์กร ชื่อสภาพแวดล้อม และชื่อพร็อกซี API ที่คุณพบข้อผิดพลาด
503 - App Bundle ของพร็อกซี API
- ไฟล์การติดตามที่มีคำขอซึ่งมีข้อผิดพลาด
503 Service Unavailable - บันทึกการเข้าถึงของ 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 - ช่วงเวลาพร้อมข้อมูลเขตเวลาที่ข้อผิดพลาด
503เกิดขึ้น Tcpdumpsที่รวบรวมใน Message Processor และเซิร์ฟเวอร์แบ็กเอนด์เมื่อ เกิดข้อผิดพลาด