คุณกําลังดูเอกสารประกอบของ Apigee Edge
ไปที่
เอกสารประกอบเกี่ยวกับ Apigee X. ข้อมูล
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์ได้รับข้อผิดพลาด 502 Bad Gateway ตัวประมวลผลข้อความจะแสดงข้อผิดพลาดนี้ไปยังแอปพลิเคชันไคลเอ็นต์เมื่อไม่ได้รับการตอบกลับจากเซิร์ฟเวอร์แบ็กเอนด์
ข้อความแสดงข้อผิดพลาด
แอปพลิเคชันไคลเอ็นต์จะได้รับโค้ดตอบกลับต่อไปนี้
HTTP/1.1 502 Bad Gateway
นอกจากนี้ คุณอาจสังเกตเห็นข้อความแสดงข้อผิดพลาดต่อไปนี้
{
"fault": {
"faultstring":"Bad Gateway",
"detail":{
"errorcode":"messaging.adaptors.http.flow.BadGateway"
}
}
}
สาเหตุที่เป็นไปได้
สาเหตุที่เป็นไปได้ของปัญหานี้แสดงไว้ในตารางต่อไปนี้
สาเหตุ | คำอธิบาย | คุณสามารถดำเนินการตามขั้นตอนการแก้ปัญหาได้โดย |
การหมดเวลาของ handshake TLS/SSL | เกิดข้อจำกัดเวลาระหว่างการแฮนด์เชค TLS/SSL ระหว่างโปรแกรมประมวลผลข้อความกับเซิร์ฟเวอร์แบ็กเอนด์ | ผู้ใช้ Edge Private และ Public Cloud |
สาเหตุ: หมดเวลาแฮนด์เชค TLS/SSL
ใน Apigee Edge คุณสามารถตั้งค่าการเชื่อมต่อ TLS/SSL กับเซิร์ฟเวอร์แบ็กเอนด์เพื่อเปิดใช้การสื่อสาร TLS ระหว่าง Edge Message Processor กับเซิร์ฟเวอร์แบ็กเอนด์
การทำ Handshake ของ TLS/SSL มีหลายขั้นตอน ข้อผิดพลาดนี้มักเกิดขึ้นเมื่อ แฮนด์เชค TLS/SSL ระหว่างตัวประมวลผลข้อความและเซิร์ฟเวอร์แบ็กเอนด์หมดเวลา
การวินิจฉัย
ส่วนนี้จะอธิบายวิธีการวินิจฉัยระยะหมดเวลาของแฮนด์เชค TLS/SSL อย่างถูกต้อง มีการแสดงวิธีการสำหรับ Edge Private Cloud และ Public Cloud
ตรวจสอบเอาต์พุตเซสชันการติดตาม
ขั้นตอนต่อไปนี้จะอธิบายวิธีวินิจฉัยปัญหาเบื้องต้นโดยใช้เครื่องมือ Apigee Edge Trace
- ใน UI ของ Edge ให้เปิดใช้เซสชันการติดตามสําหรับพร็อกซี API ที่ได้รับผลกระทบ
หากการติดตามคำขอ API ที่ดำเนินการไม่สำเร็จแสดงข้อมูลต่อไปนี้ แสดงว่าอาจเกิดข้อผิดพลาดในการจับคู่ TLS/SSL หมดเวลา สาเหตุที่เป็นไปได้ของข้อผิดพลาดคือไฟร์วอลล์ของเซิร์ฟเวอร์แบ็กเอนด์บล็อกการรับส่งข้อมูลจาก Apigee
- ตรวจสอบว่าข้อผิดพลาด 502 Bad Gateway เกิดขึ้นหลังจากผ่านไป 55 วินาทีหรือไม่ ซึ่งเป็นระยะเวลาหมดเวลาเริ่มต้นที่ตั้งค่าไว้ในโปรแกรมประมวลผลข้อความ หากคุณเห็นว่าข้อผิดพลาดเกิดขึ้นหลังจากผ่านไป 55 วินาที แสดงว่าเวลาหมดอาจเป็นสาเหตุของปัญหา
- ตรวจสอบว่าข้อผิดพลาดแสดงข้อผิดพลาดหรือไม่: messaging.adaptors.http.BadGateway อีกครั้ง ข้อผิดพลาดนี้มักบ่งบอกว่าเกิดปัญหาการหมดเวลา
หากคุณใช้ Edge Private Cloud ให้จดค่าของช่อง X-Apigee.Message-ID ในเอาต์พุตการติดตามดังที่แสดงด้านล่าง ผู้ใช้ Private Cloud สามารถใช้ค่ารหัสนี้เพื่อแก้ปัญหาเพิ่มเติมได้ ตามที่อธิบายไว้ภายหลัง
คลิกไอคอนบันทึกข้อมูล Analytics ในเส้นทางการติดตาม ดังนี้
เลื่อนลงและสังเกตค่าของช่องที่มีชื่อว่า X-Apigee.Message-ID
หากต้องการยืนยันว่าการหมดเวลาของแฮนด์เชค TLS/SSL เป็นสาเหตุของข้อผิดพลาด โปรดทำตามขั้นตอนในส่วนต่อไปนี้โดยขึ้นอยู่กับว่าคุณใช้งานระบบคลาวด์สาธารณะหรือ Private Cloud
ขั้นตอนการวินิจฉัยเพิ่มเติมสำหรับผู้ใช้ Edge Private Cloud เท่านั้น
หากคุณใช้ Apigee Edge Private Cloud คุณสามารถทำตามขั้นตอนต่อไปนี้เพื่อช่วยยืนยันสาเหตุของข้อผิดพลาดในการแฮนด์เชค ในขั้นตอนนี้ ให้ตรวจสอบไฟล์บันทึกของตัวประมวลผลข้อความเพื่อดูข้อมูลที่เกี่ยวข้อง หากคุณใช้ Edge Public Cloud ให้ข้ามส่วนนี้และไปที่ขั้นตอนการวินิจฉัยเพิ่มเติมสำหรับผู้ใช้ระบบคลาวด์ส่วนตัวและสาธารณะ
ตรวจสอบว่าคุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์แบ็กเอนด์ที่เจาะจงจาก Message Processor แต่ละรายการได้โดยตรงหรือไม่โดยใช้คำสั่ง
telnet
หากเซิร์ฟเวอร์แบ็กเอนด์แก้ไขเป็นที่อยู่ IP เดียว ให้ใช้คำสั่งนี้
telnet BackendServer-IPaddress 443
หากเซิร์ฟเวอร์แบ็กเอนด์แก้ไขเป็นที่อยู่ IP หลายรายการ ให้ใช้ชื่อโฮสต์ของเซิร์ฟเวอร์แบ็กเอนด์ในคำสั่ง telnet ดังที่แสดงด้านล่าง
telnet BackendServer-HostName 443
หากเชื่อมต่อกับเซิร์ฟเวอร์แบ็กเอนด์ได้โดยไม่มีข้อผิดพลาด ให้ไปยังขั้นตอนถัดไป
หากใช้คำสั่ง
telnet
ไม่สำเร็จ คุณจะต้องทำงานร่วมกับทีมเครือข่ายเพื่อตรวจสอบการเชื่อมต่อระหว่างโปรแกรมประมวลผลข้อความกับเซิร์ฟเวอร์แบ็กเอนด์ตรวจสอบไฟล์บันทึกของโปรแกรมประมวลผลข้อความเพื่อหาหลักฐานที่บ่งชี้ว่าจับมือไม่สำเร็จ เปิดไฟล์
/opt/apigee/var/log/edge-message-processor/system.log
และค้นหารหัสข้อความที่ไม่ซ้ำกัน (ค่าของ X-Apigee.Message-ID ที่คุณ ที่พบในไฟล์การติดตาม) ตรวจสอบว่าคุณเห็นข้อความแสดงข้อผิดพลาดในการจับมือที่เชื่อมโยงกับรหัสข้อความดังที่แสดงด้านล่างหรือไม่
org:xxx env:xxx api:xxx rev:x messageid:<MESSAGE_ID> NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context.handshakeTimeout() : SSLClientChannel[Connected: Remote:X.X.X.X:443 Local:X.X.X.X]@739028 useCount=1 bytesRead=0 bytesWritten=0 age=55221ms lastIO=55221ms isOpen=true handshake timeout
หากเห็นข้อผิดพลาดนี้ในไฟล์บันทึกของโปรแกรมประมวลผลข้อความ ให้ดำเนินการตรวจสอบเพิ่มเติม ไปที่ขั้นตอนการวินิจฉัยเพิ่มเติมสำหรับผู้ใช้ Edge Private และ Public Cloud
หากคุณไม่เห็นข้อความแฮนด์เชคในไฟล์บันทึก ให้ไปที่ ต้องรวบรวมข้อมูลการวินิจฉัย
ขั้นตอนการวินิจฉัยเพิ่มเติมสำหรับผู้ใช้ Edge Private และ Public Cloud
ในการระบุปัญหาเพิ่มเติม คุณสามารถใช้เครื่องมือ tcpdump เพื่อวิเคราะห์แพ็กเก็ต TCP/IP เพื่อยืนยันว่าหมดเวลาในระหว่างการแฮนด์เชค TLS/SSL หรือไม่
- หากคุณเป็นผู้ใช้ระบบคลาวด์ส่วนตัว คุณจะบันทึกแพ็กเก็ต TCP/IP ได้ในเซิร์ฟเวอร์แบ็กเอนด์หรือโปรแกรมประมวลผลข้อความ เราขอแนะนำให้บันทึกแพ็กเก็ตในเซิร์ฟเวอร์แบ็กเอนด์ เนื่องจากมีการถอดรหัสแพ็กเก็ตในเซิร์ฟเวอร์แบ็กเอนด์
- หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ คุณจะไม่มีสิทธิ์เข้าถึงโปรแกรมประมวลผลข้อความ อย่างไรก็ตาม การบันทึกแพ็กเก็ต TCP/IP ในเซิร์ฟเวอร์แบ็กเอนด์อาจช่วยระบุปัญหาได้
หลังจากตัดสินใจเลือกตำแหน่งที่จะบันทึกแพ็กเก็ต TCP/IP แล้ว ให้ใช้ข้อมูลต่อไปนี้ tcpdump เพื่อบันทึกแพ็กเก็ต TCP/IP
tcpdump -i any -s 0 host <IP address> -w <File name>
หากคุณจะรับแพ็กเก็ต TCP/IP บนเซิร์ฟเวอร์แบ็กเอนด์ ให้ใช้ไฟล์สาธารณะ ที่อยู่ IP ของเครื่องมือประมวลผลข้อความในคำสั่ง
tcpdump
ดูความช่วยเหลือเกี่ยวกับการใช้คำสั่งเพื่อตรวจสอบการรับส่งข้อมูลของเซิร์ฟเวอร์แบ็กเอนด์ได้ที่ tcpdumpหากคุณใช้แพ็กเก็ต TCP/IP บนตัวประมวลผลข้อความ ให้ใช้แบบสาธารณะ ที่อยู่ IP ของเซิร์ฟเวอร์แบ็กเอนด์ในคำสั่ง
tcpdump
สำหรับความช่วยเหลือในการใช้คำสั่ง ในการตรวจสอบการรับส่งข้อมูลของโปรแกรมประมวลผลข้อความ โปรดดู tcpdumpหากมีที่อยู่ IP หลายรายการสำหรับเซิร์ฟเวอร์แบ็กเอนด์/โปรแกรมประมวลผลข้อความ คุณจะต้องลองใช้คำสั่ง
tcpdump
อื่น ดูข้อมูลเพิ่มเติมเกี่ยวกับเครื่องมือนี้และรูปแบบอื่นๆ ของคําสั่งนี้ได้ที่ tcpdump
วิเคราะห์แพ็กเก็ต TCP/IP โดยใช้เครื่องมือ Wireshark หรือเครื่องมือที่คล้ายกัน ภาพหน้าจอต่อไปนี้แสดงแพ็กเก็ต TCP/IP ใน Wireshark
โปรดสังเกตในเอาต์พุต Wireshark ว่าการเชื่อมต่อ TCP แบบ 3 ทางเสร็จสมบูรณ์ในแพ็กเก็ต 3 รายการแรก
จากนั้น เครื่องมือประมวลผลข้อความจะส่งข้อผิดพลาด "Client Hello" ในแพ็คเก็ต #4
เนื่องจากไม่มีการตอบกลับจากเซิร์ฟเวอร์แบ็กเอนด์ ตัวประมวลผลข้อความจึงส่งข้อความ "Client Hello" ซ้ำหลายครั้งในแพ็กเก็ต 5, 6 และ 7 หลังจากรอตามช่วงเวลาที่กำหนดไว้ล่วงหน้า
เมื่อผู้ประมวลผลข้อความไม่รับทราบใดๆ หลังจากลองใหม่ 3 ครั้ง ระบบจะส่งข้อความ FIN, ACK ไปยังเซิร์ฟเวอร์แบ็กเอนด์เพื่อระบุว่ากำลังจะปิดการเชื่อมต่อ
ตามที่แสดงในเซสชัน Wireshark ตัวอย่าง การเชื่อมต่อกับแบ็กเอนด์ สำเร็จ (ขั้นตอนที่ 1) แต่แฮนด์เชค SSL หมดเวลาเนื่องจากแบ็กเอนด์ เซิร์ฟเวอร์ไม่ตอบกลับ
หากคุณทำตามขั้นตอนการแก้ปัญหาใน Playbook นี้แล้ว และพิจารณาแล้วว่าการหมดเวลาทำให้เกิดข้อผิดพลาดในการจับมือ TLS/SSL ให้ไปที่ส่วนการแก้ปัญหา
การใช้การตรวจสอบ API เพื่อระบุปัญหา
การตรวจสอบ API ช่วยให้คุณแยกแยะปัญหาได้อย่างรวดเร็วเพื่อวินิจฉัยปัญหาข้อผิดพลาด ประสิทธิภาพ และเวลาในการตอบสนอง รวมถึงแหล่งที่มาของปัญหา เช่น แอปของนักพัฒนาแอป, API Proxy, เป้าหมายแบ็กเอนด์ หรือแพลตฟอร์ม API
ดูตัวอย่างสถานการณ์ที่สาธิตวิธีแก้ปัญหา 5xx เกี่ยวกับ API โดยใช้การตรวจสอบ API เช่น คุณอาจต้องการตั้งค่าการแจ้งเตือนให้ได้รับการแจ้งเตือนเมื่อจำนวนข้อบกพร่อง messaging.adaptors.http.BadGateway เกินเกณฑ์ที่กำหนด
ความละเอียด
โดยปกติแล้ว การหมดเวลาของ SSL Handshake เกิดขึ้นเนื่องจากข้อจํากัดของไฟร์วอลล์ในเซิร์ฟเวอร์แบ็กเอนด์ที่บล็อกการรับส่งข้อมูลจาก Apigee Edge หากคุณทำตามขั้นตอนการวินิจฉัยและพิจารณาแล้วว่าสาเหตุของข้อผิดพลาดในการจับมือคือหมดเวลา คุณจะต้องติดต่อทีมเครือข่ายเพื่อระบุสาเหตุและแก้ไขข้อจำกัดของไฟร์วอลล์
โปรดทราบว่าการจำกัดไฟร์วอลล์อาจกำหนดที่เลเยอร์เครือข่ายที่ต่างกัน สิ่งสำคัญคือต้องนำข้อจำกัดทั้งหมดในเลเยอร์เครือข่ายที่เกี่ยวข้องกับ IP ของ Message Processor ออกเพื่อให้การรับส่งข้อมูลระหว่าง Apigee Edge กับเซิร์ฟเวอร์แบ็กเอนด์เป็นไปอย่างราบรื่น
หากไม่มีข้อจำกัดของไฟร์วอลล์และ/หรือยังคงพบปัญหาอยู่ ให้ไปที่ ต้องรวบรวมข้อมูลการวินิจฉัย
ต้องรวบรวมข้อมูลการวินิจฉัย
หากยังพบปัญหาอยู่แม้จะทำตามวิธีการข้างต้นแล้ว โปรดรวบรวมข้อมูลการวินิจฉัยต่อไปนี้ โปรดติดต่อและแชร์ข้อมูลต่อไปนี้กับทีมสนับสนุนของ Apigee Edge
- หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ ให้ระบุข้อมูลต่อไปนี้
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- ชื่อพร็อกซี API
- พิมพ์คำสั่ง curl ให้เสร็จสมบูรณ์เพื่อทําให้ข้อผิดพลาดเกิดขึ้นอีกครั้ง
- ไฟล์การติดตามที่แสดงข้อผิดพลาด
- แพ็กเก็ต TCP/IP ที่บันทึกไว้ในเซิร์ฟเวอร์แบ็กเอนด์
- หากคุณเป็นผู้ใช้ Private Cloud ให้ระบุข้อมูลต่อไปนี้
- พบข้อความแสดงข้อผิดพลาดฉบับสมบูรณ์
- แพ็กเกจพร็อกซี API
- ไฟล์การย้ายข้อมูลแสดงข้อผิดพลาด
- บันทึกสำหรับผู้ประมวลผลข้อมูล /opt/apigee/var/log/edge-message-processor/logs/system.log
- แพ็กเก็ต TCP/IP ที่บันทึกในเซิร์ฟเวอร์แบ็กเอนด์หรือ Message Processor
- รายละเอียดเกี่ยวกับส่วนใดใน Playbook ที่คุณได้ลองใช้ และข้อมูลเชิงลึกอื่นๆ ที่จะช่วยให้เราแก้ไขปัญหานี้ได้อย่างรวดเร็ว