คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ
Apigee X info
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์จะได้รับรหัสสถานะ HTTP 502 พร้อมข้อความ
Bad Gateway เป็นการตอบกลับสำหรับการเรียก API
รหัสสถานะ HTTP 502 หมายความว่าไคลเอ็นต์ไม่ได้รับการตอบกลับที่ถูกต้องจากเซิร์ฟเวอร์แบ็กเอนด์ที่ควรจะดำเนินการตามคำขอ
ข้อความแสดงข้อผิดพลาด
แอปพลิเคชันไคลเอ็นต์จะได้รับโค้ดตอบกลับต่อไปนี้
HTTP/1.1 502 Bad Gateway
นอกจากนี้ คุณอาจเห็นข้อความแสดงข้อผิดพลาดต่อไปนี้
{
"fault": {
"faultstring": "Unexpected EOF at target",
"detail": {
"errorcode": "messaging.adaptors.http.UnexpectedEOFAtTarget"
}
}
}สาเหตุที่เป็นไปได้
สาเหตุทั่วไปอย่างหนึ่งที่ทำให้เกิด 502 Bad Gateway Error คือข้อผิดพลาด Unexpected EOF
ซึ่งอาจเกิดจากสาเหตุต่อไปนี้
| สาเหตุ | รายละเอียด | ขั้นตอนที่ระบุสำหรับ |
|---|---|---|
| เซิร์ฟเวอร์เป้าหมายที่กำหนดค่าไม่ถูกต้อง | ไม่ได้กำหนดค่าเซิร์ฟเวอร์เป้าหมายอย่างถูกต้องเพื่อรองรับการเชื่อมต่อ TLS/SSL | ผู้ใช้ Edge Public และ Private Cloud |
| EOFException จากเซิร์ฟเวอร์แบ็กเอนด์ | เซิร์ฟเวอร์แบ็กเอนด์อาจส่ง EOF อย่างกะทันหัน | ผู้ใช้ Edge Private Cloud เท่านั้น |
| กำหนดค่าการหมดเวลา Keep-Alive ไม่ถูกต้อง | กำหนดค่าการหมดเวลา Keep-Alive ไม่ถูกต้องใน Apigee และเซิร์ฟเวอร์แบ็กเอนด์ | ผู้ใช้ Edge Public และ Private Cloud |
ขั้นตอนการวินิจฉัยที่พบบ่อย
หากต้องการวินิจฉัยข้อผิดพลาด คุณสามารถใช้วิธีใดวิธีหนึ่งต่อไปนี้
การตรวจสอบ API
วิธีวินิจฉัยข้อผิดพลาดโดยใช้การตรวจสอบ API
การใช้การตรวจสอบ API ช่วยให้คุณตรวจสอบ
ข้อผิดพลาด 502 ได้โดยทำตามขั้นตอนที่อธิบายไว้ใน
ตรวจสอบปัญหา โดยการ
- ไปที่แดชบอร์ดตรวจสอบ
- เลือกรหัสสถานะ ในเมนูแบบเลื่อนลง และตรวจสอบว่าได้เลือกช่วงเวลาที่เหมาะสม
เมื่อเกิดข้อผิดพลาด
502 - คลิกช่องในเมทริกซ์เมื่อเห็นข้อผิดพลาด
502จำนวนมาก - ทางด้านขวา ให้คลิกดูบันทึกสำหรับข้อผิดพลาด
502ซึ่งจะมีลักษณะดังนี้ - แหล่งที่มาของข้อบกพร่องคือ
target - รหัสข้อบกพร่องคือ
messaging.adaptors.http.UnexpectedEOFAtTarget

ในส่วนนี้ คุณจะเห็นข้อมูลต่อไปนี้
ซึ่งบ่งชี้ว่าข้อผิดพลาด 502 เกิดจากเป้าหมายเนื่องจาก EOF ที่ไม่คาดคิด
นอกจากนี้ ให้จดบันทึกRequest Message IDสำหรับข้อผิดพลาด 502 เพื่อทำการตรวจสอบเพิ่มเติม
เครื่องมือติดตาม
วิธีวิเคราะห์ข้อผิดพลาดโดยใช้เครื่องมือติดตาม
- เปิดใช้
เซสชันการติดตาม แล้วเรียกใช้ API เพื่อจำลองปัญหา
502 Bad Gateway - เลือกคำขอที่ล้มเหลวรายการใดรายการหนึ่ง แล้วตรวจสอบการติดตาม
- ไปยังส่วนต่างๆ ของการติดตาม และค้นหาตำแหน่งที่เกิดข้อผิดพลาด
-
คุณควรเห็นความล้มเหลวหลังจากส่งคำขอไปยังเซิร์ฟเวอร์เป้าหมายดังที่แสดงด้านล่าง


-
กำหนดค่าของ X-Apigee.fault-source และ X-Apigee.fault-code ในระยะ AX (บันทึกข้อมูลวิเคราะห์) ในการติดตาม
หากค่าของ X-Apigee.fault-source และ X-Apigee.fault-code ตรงกับค่าที่แสดงในตารางต่อไปนี้ คุณจะยืนยันได้ว่าข้อผิดพลาด
502มาจากเซิร์ฟเวอร์เป้าหมายส่วนหัวการตอบกลับ ค่า X-Apigee.fault-source targetX-Apigee.fault-code messaging.adaptors.http.flow.UnexpectedEOFAtTargetนอกจากนี้ ให้จดบันทึก
X-Apigee.Message-IDสำหรับข้อผิดพลาด502เพื่อทำการตรวจสอบเพิ่มเติม
บันทึกการเข้าถึง NGINX
วิธีวินิจฉัยข้อผิดพลาดโดยใช้ NGINX
นอกจากนี้ คุณยังดูบันทึกการเข้าถึง NGINX เพื่อหาสาเหตุของรหัสสถานะ 502 ได้ด้วย
ซึ่งจะมีประโยชน์อย่างยิ่งหากปัญหาเกิดขึ้นในอดีตหรือหากปัญหาเกิดขึ้นเป็นระยะๆ และคุณไม่สามารถบันทึกการติดตามใน UI ได้ ทำตามขั้นตอนต่อไปนี้เพื่อ
ระบุข้อมูลนี้จากบันทึกการเข้าถึง NGINX
- ตรวจสอบบันทึกการเข้าถึง NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log - ค้นหาข้อผิดพลาด
502สำหรับพร็อกซี API ที่เฉพาะเจาะจงในช่วงระยะเวลาหนึ่ง (หากปัญหาเกิดขึ้นในอดีต) หรือสำหรับคำขอที่ยังคงล้มเหลวด้วย502 - หากมี
502ข้อผิดพลาด ให้ตรวจสอบว่าข้อผิดพลาดเกิดจากเป้าหมายส่งUnexpected EOFหรือไม่ หากค่าของ X-Apigee.fault-source และ X- Apigee.fault-code ตรงกับค่าที่แสดงในตารางด้านล่าง แสดงว่าข้อผิดพลาด502เกิดจากเป้าหมายปิดการเชื่อมต่อโดยไม่คาดคิดส่วนหัวการตอบกลับ ค่า X-Apigee.fault-source targetX-Apigee.fault-code messaging.adaptors.http.flow.UnexpectedEOFAtTargetต่อไปนี้คือตัวอย่างรายการที่แสดงข้อผิดพลาด
502ซึ่งเกิดจากเซิร์ฟเวอร์เป้าหมาย
นอกจากนี้ ให้จดรหัสข้อความสำหรับข้อผิดพลาด 502 เพื่อทำการตรวจสอบเพิ่มเติม
สาเหตุ: เซิร์ฟเวอร์เป้าหมายกำหนดค่าไม่ถูกต้อง
ไม่ได้กำหนดค่าเซิร์ฟเวอร์เป้าหมายอย่างถูกต้องเพื่อรองรับการเชื่อมต่อ TLS/SSL
การวินิจฉัย
- ใช้การตรวจสอบ API, เครื่องมือติดตาม หรือ
บันทึกการเข้าถึง NGINX เพื่อกำหนดรหัสข้อความ
รหัสข้อผิดพลาด และแหล่งที่มาของข้อผิดพลาดสำหรับข้อผิดพลาด
502 - เปิดใช้การติดตามใน UI สำหรับ API ที่ได้รับผลกระทบ
- หากการติดตามคำขอ API ที่ล้มเหลวแสดงข้อมูลต่อไปนี้
502 Bad Gatewayข้อผิดพลาดจะปรากฏทันทีที่เริ่มคำขอโฟลว์เป้าหมายerror.classแสดงmessaging.adaptors.http.UnexpectedEOF.ในกรณีนี้ ปัญหานี้อาจเกิดจากการกำหนดค่าเซิร์ฟเวอร์เป้าหมายไม่ถูกต้อง
- รับคำจำกัดความของเซิร์ฟเวอร์เป้าหมายโดยใช้การเรียก Edge Management API ดังนี้
- หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ ให้ใช้ API นี้
curl -v https://api.enterprise.apigee.com/v1/organizations/<orgname>/environments/<envname>/targetservers/<targetservername> -u <username>
- หากคุณเป็นผู้ใช้ Private Cloud ให้ใช้ API นี้
curl -v http://<management-server-host>:<port #>/v1/organizations/<orgname>/environments/<envname>/targetservers/<targetservername> -u <username>
ตัวอย่างคำจำกัดความของ
TargetServerที่ไม่ถูกต้อง<TargetServer name="target1"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> </TargetServer >
- หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ ให้ใช้ API นี้
-
TargetServerที่แสดงเป็นตัวอย่างของการกำหนดค่าที่ไม่ถูกต้องตามปกติ ซึ่งอธิบายได้ดังนี้สมมติว่าเซิร์ฟเวอร์เป้าหมาย
mocktarget.apigee.netได้รับการกำหนดค่า ให้ยอมรับการเชื่อมต่อที่ปลอดภัย (HTTPS) ในพอร์ต443อย่างไรก็ตาม หากดูที่ คำจำกัดความของเซิร์ฟเวอร์เป้าหมาย จะไม่มีแอตทริบิวต์/แฟล็กอื่นๆ ที่บ่งชี้ว่า มีไว้สำหรับการเชื่อมต่อที่ปลอดภัย ซึ่งทำให้ Edge ถือว่าคำขอ API ที่ไปยังเซิร์ฟเวอร์เป้าหมายที่เฉพาะเจาะจงเป็นคำขอ HTTP (ไม่ปลอดภัย) ดังนั้น Edge จะไม่ เริ่มกระบวนการแฮนด์เชค SSL กับเซิร์ฟเวอร์เป้าหมายนี้เนื่องจากเซิร์ฟเวอร์เป้าหมายได้รับการกำหนดค่าให้ยอมรับเฉพาะคำขอ HTTPS (SSL) ใน
443ดังนั้นเซิร์ฟเวอร์จะ ปฏิเสธคำขอจาก Edge หรือปิดการเชื่อมต่อ ด้วยเหตุนี้ คุณจึงได้รับข้อผิดพลาดUnexpectedEOFAtTargetใน Message Processor Message Processor จะส่ง502 Bad Gatewayเป็นการตอบกลับไคลเอ็นต์
ความละเอียด
ตรวจสอบให้แน่ใจเสมอว่าได้กำหนดค่าเซิร์ฟเวอร์เป้าหมายอย่างถูกต้องตามข้อกำหนด
สำหรับตัวอย่างที่แสดงด้านบน หากต้องการส่งคำขอไปยังเซิร์ฟเวอร์เป้าหมายที่ปลอดภัย (HTTPS/SSL)
คุณต้องรวมแอตทริบิวต์ SSLInfo โดยตั้งค่าแฟล็ก enabled เป็น true แม้ว่าจะอนุญาตให้เพิ่มแอตทริบิวต์ SSLInfo สำหรับเซิร์ฟเวอร์เป้าหมายในการกําหนดปลายทางเป้าหมายเอง แต่เราขอแนะนําให้เพิ่มแอตทริบิวต์ SSLInfo เป็นส่วนหนึ่งของการกําหนดเซิร์ฟเวอร์เป้าหมายเพื่อหลีกเลี่ยงความสับสน
- หากบริการแบ็กเอนด์ต้องใช้การสื่อสาร SSL ทางเดียว ให้ทำดังนี้
- คุณต้องเปิดใช้ TLS/SSL ในคำจำกัดความ
TargetServerโดยใส่แอตทริบิวต์SSLInfoซึ่งตั้งค่าสถานะenabledเป็นจริง ดังที่แสดงด้านล่าง<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </TargetServer> - หากต้องการตรวจสอบใบรับรองของเซิร์ฟเวอร์เป้าหมายใน Edge เราจะต้อง
รวม Truststore (ที่มีใบรับรองของเซิร์ฟเวอร์เป้าหมาย) ดังที่แสดงด้านล่างด้วย
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Ciphers/> <ClientAuthEnabled>false</ClientAuthEnabled> <Enabled>true</Enabled> <IgnoreValidationErrors>false</IgnoreValidationErrors> <Protocols/> <TrustStore>mocktarget-truststore</TrustStore> </SSLInfo> </TargetServer>
- คุณต้องเปิดใช้ TLS/SSL ในคำจำกัดความ
- หากบริการแบ็กเอนด์ต้องใช้การสื่อสาร SSL แบบ 2 ทาง ให้ทำดังนี้
- คุณต้องมีแอตทริบิวต์
SSLInfoที่มีค่าสถานะClientAuthEnabled,Keystore,KeyAliasและTruststoreตั้งค่าอย่างเหมาะสม ดังที่แสดงด้านล่าง<TargetServer name="mocktarget"> <IsEnabled>true</IsEnabled> <Host>www.example.com</Host> <Port>443</Port> <SSLInfo> <Ciphers/> <ClientAuthEnabled>true</ClientAuthEnabled> <Enabled>true</Enabled> <IgnoreValidationErrors>false</IgnoreValidationErrors> <KeyAlias>keystore-alias</KeyAlias> <KeyStore>keystore-name</KeyStore> <Protocols/> <TrustStore>truststore-name</TrustStore> </SSLInfo> </TargetServer >
- คุณต้องมีแอตทริบิวต์
ข้อมูลอ้างอิง
การจัดสรรภาระงาน ในเซิร์ฟเวอร์แบ็กเอนด์
สาเหตุ: EOFException จากเซิร์ฟเวอร์แบ็กเอนด์
เซิร์ฟเวอร์แบ็กเอนด์อาจส่ง EOF (สิ้นสุดไฟล์) อย่างกะทันหัน
การวินิจฉัย
- ใช้การตรวจสอบ API, เครื่องมือติดตาม หรือ
บันทึกการเข้าถึง NGINX เพื่อกำหนดรหัสข้อความ
รหัสข้อผิดพลาด และแหล่งที่มาของข้อผิดพลาดสำหรับข้อผิดพลาด
502 - ตรวจสอบบันทึกของ Message Processor
(
/opt/apigee/var/log/edge-message-processor/logs/system.log) และค้นหาเพื่อดูว่าคุณ มีeof unexpectedสำหรับ API ที่เฉพาะเจาะจงหรือไม่ หรือหากคุณมีmessageidที่ไม่ซ้ำสำหรับคำขอ API คุณก็ค้นหาได้สแต็กเทรซของข้อยกเว้นตัวอย่างจากบันทึกของ Message Processor
"message": "org:myorg env:test api:api-v1 rev:10 messageid:rrt-1-14707-63403485-19 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : SSLClientChannel[C:193.35.250.192:8443 Remote host:0.0.0.0:50100]@459069 useCount=6 bytesRead=0 bytesWritten=755 age=40107ms lastIO=12832ms .onExceptionRead exception: {} java.io.EOFException: eof unexpected at com.apigee.nio.channels.PatternInputChannel.doRead(PatternInputChannel.java:45) ~[nio-1.0.0.jar:na] at com.apigee.nio.channels.InputChannel.read(InputChannel.java:103) ~[nio-1.0.0.jar:na] at com.apigee.protocol.http.io.MessageReader.onRead(MessageReader.java:79) ~[http-1.0.0.jar:na] at com.apigee.nio.channels.DefaultNIOSupport$DefaultIOChannelHandler.onIO(NIOSupport.java:51) [nio-1.0.0.jar:na] at com.apigee.nio.handlers.NIOThread.run(NIOThread.java:123) [nio-1.0.0.jar:na]"
ในตัวอย่างข้างต้น คุณจะเห็นว่าเกิด
java.io.EOFException: eof unexpectedข้อผิดพลาดขณะที่ Message Processor พยายามอ่านการตอบกลับจาก เซิร์ฟเวอร์แบ็กเอนด์ ข้อยกเว้นนี้บ่งบอกถึงจุดสิ้นสุดของไฟล์ (EOF) หรือจุดสิ้นสุดของสตรีมที่ มาถึงโดยไม่คาดคิดกล่าวคือ Message Processor ส่งคำขอ API ไปยังเซิร์ฟเวอร์แบ็กเอนด์และกำลังรอ หรืออ่านการตอบกลับ อย่างไรก็ตาม เซิร์ฟเวอร์แบ็กเอนด์ได้สิ้นสุดการเชื่อมต่ออย่างกะทันหัน ก่อนที่ Message Processor จะได้รับการตอบกลับหรืออ่านการตอบกลับที่สมบูรณ์ได้
- ตรวจสอบบันทึกเซิร์ฟเวอร์แบ็กเอนด์และดูว่ามีข้อผิดพลาดหรือข้อมูลที่อาจ ทำให้เซิร์ฟเวอร์แบ็กเอนด์สิ้นสุดการเชื่อมต่ออย่างกะทันหันหรือไม่ หากพบข้อผิดพลาด/ข้อมูล ให้ไปที่การแก้ปัญหา และแก้ไขปัญหาอย่างเหมาะสมในเซิร์ฟเวอร์แบ็กเอนด์
- หากไม่พบข้อผิดพลาดหรือข้อมูลใดๆ ในเซิร์ฟเวอร์แบ็กเอนด์ ให้รวบรวมเอาต์พุต
tcpdumpในตัวประมวลผลข้อความโดยทำดังนี้- หากโฮสต์เซิร์ฟเวอร์แบ็กเอนด์มีที่อยู่ IP เดียว ให้ใช้คำสั่งต่อไปนี้
tcpdump -i any -s 0 host IP_ADDRESS -w FILE_NAME
- หากโฮสต์เซิร์ฟเวอร์แบ็กเอนด์มีที่อยู่ IP หลายรายการ ให้ใช้คำสั่งต่อไปนี้
tcpdump -i any -s 0 host HOSTNAME -w FILE_NAME
โดยปกติแล้ว ข้อผิดพลาดนี้เกิดจากเซิร์ฟเวอร์แบ็กเอนด์ตอบกลับด้วย
[FIN,ACK]ทันทีที่ Message Processor ส่งคำขอไปยังเซิร์ฟเวอร์แบ็กเอนด์
- หากโฮสต์เซิร์ฟเวอร์แบ็กเอนด์มีที่อยู่ IP เดียว ให้ใช้คำสั่งต่อไปนี้
-
ลองดู
tcpdumpตัวอย่างต่อไปนี้ตัวอย่าง
tcpdumpที่นำมาเมื่อเกิด502 Bad Gateway Error(UnexpectedEOFAtTarget)
- จากเอาต์พุต TCPDump คุณจะเห็นลำดับเหตุการณ์ต่อไปนี้
- ในแพ็กเก็ต
985ตัวประมวลผลข้อความจะส่งคำขอ API ไปยังเซิร์ฟเวอร์แบ็กเอนด์ - ในแพ็กเก็ต
986เซิร์ฟเวอร์แบ็กเอนด์จะตอบกลับทันทีด้วย[FIN,ACK] - ในแพ็กเก็ต
987Message Processor จะตอบกลับด้วย[FIN,ACK]ไปยังเซิร์ฟเวอร์แบ็กเอนด์ - ในที่สุดการเชื่อมต่อจะปิดด้วย
[ACK]และ[RST]จากทั้ง 2 ฝั่ง - เนื่องจากเซิร์ฟเวอร์แบ็กเอนด์ส่ง
[FIN,ACK]คุณจึงได้รับข้อยกเว้นjava.io.EOFException: eof unexpectedใน Message Processor
- ในแพ็กเก็ต
- ซึ่งอาจเกิดขึ้นหากมีปัญหาเกี่ยวกับเครือข่ายในเซิร์ฟเวอร์แบ็กเอนด์ โปรดติดต่อทีมปฏิบัติการเครือข่าย เพื่อตรวจสอบปัญหานี้เพิ่มเติม
ความละเอียด
แก้ไขปัญหาในเซิร์ฟเวอร์แบ็กเอนด์อย่างเหมาะสม
หากยังพบปัญหาอยู่และต้องการความช่วยเหลือในการแก้ปัญหา 502 Bad Gateway Error หรือสงสัยว่าปัญหาเกิดจาก Edge โปรดติดต่อทีมสนับสนุนของ Apigee Edge
สาเหตุ: กำหนดค่าการหมดเวลา Keep-Alive ไม่ถูกต้อง
ก่อนที่จะวินิจฉัยว่านี่คือสาเหตุของข้อผิดพลาด 502 โปรดอ่านแนวคิดต่อไปนี้
การเชื่อมต่อแบบถาวรใน Apigee
โดยค่าเริ่มต้น Apigee (และตามมาตรฐาน HTTP/1.1) จะใช้การเชื่อมต่อแบบถาวร
เมื่อสื่อสารกับเซิร์ฟเวอร์แบ็กเอนด์เป้าหมาย การเชื่อมต่อแบบถาวรช่วยเพิ่มประสิทธิภาพ
โดยอนุญาตให้ใช้การเชื่อมต่อ TCP และ (หากมี) TLS/SSL ที่สร้างไว้แล้วซ้ำ ซึ่งจะช่วย
ลดค่าใช้จ่ายในการตอบสนอง ระยะเวลาที่ต้องคงการเชื่อมต่อจะควบคุมผ่านพร็อพเพอร์ตี้การหมดเวลา Keep-Alive (keepalive.timeout.millis)
ทั้งเซิร์ฟเวอร์แบ็กเอนด์และ Message Processor ของ Apigee ใช้การหมดเวลา Keep-alive เพื่อให้การเชื่อมต่อเปิดอยู่ซึ่งกันและกัน เมื่อไม่ได้รับข้อมูลภายในระยะเวลาการหมดเวลา Keep-Alive เซิร์ฟเวอร์แบ็กเอนด์หรือ Message Processor จะปิดการเชื่อมต่อกับอีกฝ่ายได้
โดยค่าเริ่มต้น พร็อกซี API ที่ติดตั้งใช้งานใน Message Processor ใน Apigee จะมีการตั้งค่าการหมดเวลา Keep-Alive เป็น
60s เว้นแต่จะมีการลบล้าง เมื่อไม่ได้รับข้อมูลสำหรับ 60s Apigee จะ
ปิดการเชื่อมต่อกับเซิร์ฟเวอร์แบ็กเอนด์ เซิร์ฟเวอร์แบ็กเอนด์จะรักษาการหมดเวลา Keep-Alive ด้วย
และเมื่อหมดเวลาแล้ว เซิร์ฟเวอร์แบ็กเอนด์จะปิดการเชื่อมต่อกับ Message Processor
ผลกระทบของการกำหนดค่าการหมดเวลา Keep-Alive ที่ไม่ถูกต้อง
หาก Apigee หรือเซิร์ฟเวอร์แบ็กเอนด์ได้รับการกำหนดค่าด้วยการหมดเวลา Keep-Alive ที่ไม่ถูกต้อง จะส่งผลให้เกิดภาวะแข่งขันซึ่งทำให้เซิร์ฟเวอร์แบ็กเอนด์ส่ง End Of File
(FIN) ที่ไม่คาดคิดเพื่อตอบสนองต่อคำขอทรัพยากร
ตัวอย่างเช่น หากกำหนดค่าการหมดเวลา Keep-Alive ภายใน พร็อกซี API หรือ Message
Processor โดยมีค่ามากกว่าหรือเท่ากับการหมดเวลาของ เซิร์ฟเวอร์แบ็กเอนด์ จากต้นน้ำ
ภาวะแข่งขัน ต่อไปนี้อาจเกิดขึ้น กล่าวคือ หากตัวประมวลผลข้อความไม่ได้รับข้อมูลใดๆ จนกว่าจะใกล้ถึงเกณฑ์ของระยะหมดเวลาในการเชื่อมต่อที่ใช้งานอยู่ของเซิร์ฟเวอร์แบ็กเอนด์ คำขอจะเข้ามาและส่งไปยังเซิร์ฟเวอร์แบ็กเอนด์โดยใช้การเชื่อมต่อที่มีอยู่ ซึ่งอาจทำให้เกิด
502 Bad Gateway เนื่องจากข้อผิดพลาด EOF ที่ไม่คาดคิดตามที่อธิบายไว้ด้านล่าง
- สมมติว่าการหมดเวลา Keep-Alive ที่ตั้งค่าไว้ในทั้ง Message Processor และเซิร์ฟเวอร์แบ็กเอนด์ คือ 60 วินาที และไม่มีคำขอใหม่ เข้ามาจนกว่าจะถึง 59 วินาทีหลังจากที่ Message Processor เฉพาะ ประมวลผลคำขอก่อนหน้า
- จากนั้น Message Processor จะประมวลผลคำขอที่เข้ามาในวินาทีที่ 59 โดยใช้การเชื่อมต่อที่มีอยู่ (เนื่องจากยังไม่หมดเวลา Keep-Alive) และส่งคำขอ ไปยังเซิร์ฟเวอร์แบ็กเอนด์
- อย่างไรก็ตาม ก่อนที่คำขอจะไปถึงเซิร์ฟเวอร์แบ็กเอนด์ เกณฑ์การหมดเวลา Keep-Alive ได้เกินขีดจำกัดในเซิร์ฟเวอร์แบ็กเอนด์แล้ว
- คำขอทรัพยากรของ Message Processor อยู่ระหว่างดำเนินการ แต่เซิร์ฟเวอร์แบ็กเอนด์
พยายามปิดการเชื่อมต่อโดยการส่งแพ็กเก็ต
FINไปยัง Message Processor - ขณะที่ Message Processor กำลังรอรับข้อมูล แต่กลับได้รับ
FINที่ไม่คาดคิดแทน และระบบจะสิ้นสุดการเชื่อมต่อ - ซึ่งจะส่งผลให้
Unexpected EOFและต่อมา502จะ ส่งคืนไปยังไคลเอ็นต์โดย Message Processor
ในกรณีนี้ เราพบว่าข้อผิดพลาด 502 เกิดขึ้นเนื่องจากมีการกำหนดค่าการหมดเวลา Keep-Alive เดียวกันที่ 60 วินาทีทั้งใน Message Processor และเซิร์ฟเวอร์แบ็กเอนด์ ในทำนองเดียวกัน ปัญหานี้อาจเกิดขึ้นได้เช่นกันหากมีการกำหนดค่าระยะหมดเวลา Keep-Alive ใน Message
Processor ให้สูงกว่าในเซิร์ฟเวอร์แบ็กเอนด์
การวินิจฉัย
- หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ ให้ทำดังนี้
- ใช้เครื่องมือตรวจสอบ API หรือเครื่องมือติดตาม (ตามที่อธิบายไว้ใน
ขั้นตอนการวินิจฉัยทั่วไป) และตรวจสอบว่าคุณมีการตั้งค่าทั้ง 2 รายการต่อไปนี้
- รหัสข้อบกพร่อง:
messaging.adaptors.http.flow.UnexpectedEOFAtTarget - แหล่งที่มาของข้อบกพร่อง:
target
- รหัสข้อบกพร่อง:
- ไปที่การใช้ tcpdump เพื่อตรวจสอบเพิ่มเติม
- ใช้เครื่องมือตรวจสอบ API หรือเครื่องมือติดตาม (ตามที่อธิบายไว้ใน
ขั้นตอนการวินิจฉัยทั่วไป) และตรวจสอบว่าคุณมีการตั้งค่าทั้ง 2 รายการต่อไปนี้
- หากคุณเป็นผู้ใช้ Private Cloud ให้ทำดังนี้
- ใช้เครื่องมือติดตามหรือ
บันทึกการเข้าถึง NGINX เพื่อระบุรหัสข้อความ
รหัสข้อผิดพลาด และแหล่งที่มาของข้อผิดพลาดสำหรับข้อผิดพลาด
502 - ค้นหารหัสข้อความในบันทึกของ Message Processor
(/opt/apigee/var/log/edge-message-processor/logs/system.log) - คุณจะเห็น
java.io.EOFEXception: eof unexpectedดังที่แสดงด้านล่าง2020-11-22 14:42:39,917 org:myorg env:prod api:myproxy rev:1 messageid:myorg-opdk-dc1-node2-17812-56001-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:51.254.225.9:80 Local:10.154.0.61:35326]@12972 useCount=7 bytesRead=0 bytesWritten=159 age=7872ms lastIO=479ms isOpen=true.onExceptionRead exception: {} java.io.EOFException: eof unexpected at com.apigee.nio.channels.PatternInputChannel.doRead(PatternInputChannel.java:45) at com.apigee.nio.channels.InputChannel.read(InputChannel.java:103) at com.apigee.protocol.http.io.MessageReader.onRead(MessageReader.java:80) at com.apigee.nio.channels.DefaultNIOSupport$DefaultIOChannelHandler.onIO(NIOSupport.java:51) at com.apigee.nio.handlers.NIOThread.run(NIOThread.java:220)
- ข้อผิดพลาด
java.io.EOFException: eof unexpectedแสดงว่า Message Processor ได้รับEOFขณะที่ยังรออ่านการตอบกลับจากเซิร์ฟเวอร์แบ็กเอนด์ - แอตทริบิวต์
useCount=7ในข้อความแสดงข้อผิดพลาดข้างต้นระบุว่า Message Processor ใช้การเชื่อมต่อนี้ซ้ำประมาณ 7 ครั้ง และแอตทริบิวต์bytesWritten=159ระบุว่า Message Processor ได้ส่งเพย์โหลดคำขอ ขนาด159ไบต์ไปยังเซิร์ฟเวอร์แบ็กเอนด์ แต่ได้รับข้อมูลกลับมาเป็น 0 ไบต์ เมื่อเกิดEOFที่ไม่คาดคิด -
ซึ่งแสดงให้เห็นว่า Message Processor ใช้การเชื่อมต่อเดียวกันซ้ำหลายครั้ง และในโอกาสนี้ เครื่องมือได้ส่งข้อมูล แต่หลังจากนั้นไม่นานก็ได้รับ
EOFก่อนที่จะได้รับข้อมูลใดๆ ซึ่งหมายความว่ามีโอกาสสูงที่การหมดเวลา Keep-Alive ของเซิร์ฟเวอร์แบ็กเอนด์จะสั้นกว่าหรือเท่ากับที่ตั้งค่าไว้ในพร็อกซี APIคุณสามารถตรวจสอบเพิ่มเติมได้โดยใช้
tcpdumpตามที่อธิบายไว้ด้านล่าง
- ใช้เครื่องมือติดตามหรือ
บันทึกการเข้าถึง NGINX เพื่อระบุรหัสข้อความ
รหัสข้อผิดพลาด และแหล่งที่มาของข้อผิดพลาดสำหรับข้อผิดพลาด
การใช้ tcpdump
- บันทึก
tcpdumpในเซิร์ฟเวอร์แบ็กเอนด์ด้วยคำสั่งต่อไปนี้tcpdump -i any -s 0 host MP_IP_Address -w File_Name
- วิเคราะห์
tcpdumpที่บันทึกไว้ตัวอย่างเอาต์พุต tcpdump มีดังนี้

ในตัวอย่าง
tcpdumpด้านบน คุณจะเห็นข้อมูลต่อไปนี้- ในแพ็กเก็ต
5992,เซิร์ฟเวอร์แบ็กเอนด์ได้รับคำขอGET - ในแพ็กเก็ต
6064ระบบจะตอบกลับด้วย200 OK. - ในแพ็กเก็ต
6084เซิร์ฟเวอร์แบ็กเอนด์ได้รับคำขอGETอีกรายการ - ในแพ็กเก็ต
6154อุปกรณ์จะตอบกลับด้วย200 OK - ในแพ็กเก็ต
6228เซิร์ฟเวอร์แบ็กเอนด์ได้รับคำขอที่ 3GET - คราวนี้เซิร์ฟเวอร์แบ็กเอนด์จะส่งคืน
FIN, ACKไปยัง Message Processor (แพ็กเก็ต6285) ซึ่งเริ่มการปิดการเชื่อมต่อ
ตัวอย่างนี้ใช้การเชื่อมต่อเดียวกันซ้ำ 2 ครั้งได้สำเร็จ แต่ในคำขอที่ 3 เซิร์ฟเวอร์แบ็กเอนด์จะเริ่มปิดการเชื่อมต่อ ขณะที่ Message Processor รอข้อมูลจากเซิร์ฟเวอร์แบ็กเอนด์ ซึ่งแสดงว่าการหมดเวลา Keep-Alive ของเซิร์ฟเวอร์แบ็กเอนด์มีแนวโน้มที่จะสั้นกว่าหรือเท่ากับค่าที่ตั้งไว้ในพร็อกซี API หากต้องการตรวจสอบ โปรดดูเปรียบเทียบการหมดเวลา Keep-Alive ใน Apigee และเซิร์ฟเวอร์แบ็กเอนด์
- ในแพ็กเก็ต
เปรียบเทียบการหมดเวลา Keep-Alive ใน Apigee และเซิร์ฟเวอร์แบ็กเอนด์
- โดยค่าเริ่มต้น Apigee จะใช้ค่า 60 วินาทีสำหรับพร็อพเพอร์ตี้การหมดเวลา Keep-Alive
-
อย่างไรก็ตาม คุณอาจลบล้างค่าเริ่มต้นในพร็อกซี API ได้ คุณยืนยันได้โดยตรวจสอบคำจำกัดความ
TargetEndpointที่เฉพาะเจาะจงใน พร็อกซี API ที่ล้มเหลวซึ่งทำให้เกิดข้อผิดพลาด502ตัวอย่างการกำหนดค่า TargetEndpoint
<TargetEndpoint name="default"> <HTTPTargetConnection> <URL>https://mocktarget.apigee.net/json</URL> <Properties> <Property name="keepalive.timeout.millis">30000</Property> </Properties> </HTTPTargetConnection> </TargetEndpoint>ในตัวอย่างข้างต้น พร็อพเพอร์ตี้การหมดเวลา Keep-Alive จะถูกลบล้างด้วยค่า 30 วินาที (
30000มิลลิวินาที) - จากนั้นตรวจสอบพร็อพเพอร์ตี้การหมดเวลา Keep-Alive ที่กำหนดค่าไว้ในเซิร์ฟเวอร์แบ็กเอนด์ สมมติว่า
เซิร์ฟเวอร์แบ็กเอนด์ของคุณได้รับการกำหนดค่าด้วยค่า
25 seconds - หากคุณพิจารณาว่าค่าของพร็อพเพอร์ตี้ Keep Alive Timeout ใน Apigee สูงกว่า
ค่าของพร็อพเพอร์ตี้ Keep Alive Timeout ในเซิร์ฟเวอร์แบ็กเอนด์ตามตัวอย่างข้างต้น
นั่นคือสาเหตุของข้อผิดพลาด
502
ความละเอียด
ตรวจสอบว่าพร็อพเพอร์ตี้การหมดเวลา Keep-Alive ใน Apigee (ในพร็อกซี API และ คอมโพเนนต์ Message Processor) ต่ำกว่าในเซิร์ฟเวอร์แบ็กเอนด์เสมอ
- พิจารณาค่าที่ตั้งไว้สำหรับระยะหมดเวลา Keep-Alive ในเซิร์ฟเวอร์แบ็กเอนด์
- กำหนดค่าที่เหมาะสมสำหรับพร็อพเพอร์ตี้การหมดเวลา Keep-Alive ใน API Proxy หรือ Message Processor เพื่อให้พร็อพเพอร์ตี้การหมดเวลา Keep-Alive มีค่าต่ำกว่าค่าที่ตั้งไว้ใน แบ็กเอนด์เซิร์ฟเวอร์ โดยใช้ขั้นตอนที่อธิบายไว้ใน การกำหนดค่าการหมดเวลา Keep-Alive ใน Message Processor
หากยังพบปัญหาอยู่ ให้ไปที่ ต้องรวบรวมข้อมูลการวินิจฉัย
แนวทางปฏิบัติแนะนำ
เราขอแนะนำอย่างยิ่งว่าคอมโพเนนต์ดาวน์สตรีมควรมีเกณฑ์การหมดเวลา Keep-Alive ที่ต่ำกว่า
ที่กำหนดค่าไว้ในเซิร์ฟเวอร์อัปสตรีมเสมอ เพื่อหลีกเลี่ยงการแข่งขันและ
502ข้อผิดพลาดประเภทนี้ แต่ละฮ็อปลงควรต่ำกว่าแต่ละฮ็อปต้นทาง ใน Apigee
Edge แนวทางปฏิบัติแนะนำคือการใช้หลักเกณฑ์ต่อไปนี้
- การหมดเวลา Keep-Alive ของไคลเอ็นต์ควรน้อยกว่าการหมดเวลา Keep-Alive ของเราเตอร์ Edge
- ระยะหมดเวลา Keep-Alive ของเราเตอร์ Edge ควรน้อยกว่าระยะหมดเวลา Keep-Alive ของ Message Processor
- ระยะหมดเวลา Keep-Alive ของ Message Processor ควรน้อยกว่าระยะหมดเวลา Keep-Alive ของเซิร์ฟเวอร์เป้าหมาย
- หากคุณมีฮ็อปอื่นๆ ที่อยู่หน้าหรือหลัง Apigee คุณควรใช้กฎเดียวกัน คุณควรปล่อยให้เป็นความรับผิดชอบของไคลเอ็นต์ดาวน์สตรีมในการปิด การเชื่อมต่อกับอัปสตรีมเสมอ
ต้องรวบรวมข้อมูลการวินิจฉัย
หากยังพบปัญหาเดิมอยู่แม้จะทำตามวิธีการข้างต้นแล้ว โปรดรวบรวมข้อมูลการวินิจฉัยต่อไปนี้ แล้วติดต่อทีมสนับสนุนของ Apigee Edge
หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ โปรดระบุข้อมูลต่อไปนี้
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- ชื่อพร็อกซี API
- ทำตามคำสั่ง
curlให้เสร็จสมบูรณ์เพื่อจำลองข้อผิดพลาด502 - ไฟล์การติดตามที่มีคำขอซึ่งมีข้อผิดพลาด
502 Bad Gateway - Unexpected EOF - หาก
502ไม่มีข้อผิดพลาดในขณะนี้ โปรดระบุระยะเวลาพร้อมข้อมูลเขตเวลาเมื่อเกิดข้อผิดพลาด502ในอดีต
หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้
- ข้อความแสดงข้อผิดพลาดทั้งหมดที่พบสำหรับคำขอที่ไม่สำเร็จ
- ชื่อองค์กร ชื่อสภาพแวดล้อม และชื่อพร็อกซี API ที่คุณสังเกตเห็น
502ข้อผิดพลาด - แพ็กเกจพร็อกซี API
- ไฟล์การติดตามที่มีคำขอซึ่งมีข้อผิดพลาด
502 Bad Gateway - Unexpected EOF - บันทึกการเข้าถึง 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 - ระยะเวลาที่มีข้อมูลเขตเวลาเมื่อเกิดข้อผิดพลาด
502 Tcpdumpsที่รวบรวมไว้ในเครื่องมือประมวลผลข้อความหรือเซิร์ฟเวอร์แบ็กเอนด์ หรือทั้ง 2 อย่างเมื่อเกิดข้อผิดพลาด ขึ้น