คุณกำลังดูเอกสารประกอบ Apigee Edge
ไปที่
เอกสารประกอบเกี่ยวกับ Apigee X. ข้อมูล
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะ 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 สาธารณะและ Private Cloud |
EOFException จากเซิร์ฟเวอร์แบ็กเอนด์ | เซิร์ฟเวอร์แบ็กเอนด์อาจส่ง EOF กะทันหัน | เฉพาะผู้ใช้ Edge Private Cloud |
การกำหนดค่าระยะหมดเวลาของ Keep-alive ไม่ถูกต้อง | กำหนดค่าระยะหมดเวลาตลอดอายุการใช้งานอย่างไม่ถูกต้องใน Apigee และเซิร์ฟเวอร์แบ็กเอนด์ | ผู้ใช้ Edge สาธารณะและ Private Cloud |
ขั้นตอนการวินิจฉัยทั่วไป
หากต้องการวินิจฉัยข้อผิดพลาด คุณสามารถใช้วิธีการใดก็ได้ต่อไปนี้
การตรวจสอบ API
วิธีวินิจฉัยข้อผิดพลาดโดยใช้การตรวจสอบ API
คุณใช้การตรวจสอบ API เพื่อตรวจสอบได้
502
โดยทำตามขั้นตอนตามที่อธิบายไว้ใน
ตรวจสอบปัญหา โดยการ
- ไปที่หน้าแดชบอร์ดตรวจสอบ
- เลือกรหัสสถานะ ในเมนูแบบเลื่อนลง และตรวจสอบให้แน่ใจว่าได้ในเวลาที่ถูกต้อง
ระยะเวลาที่เลือกเมื่อเกิดข้อผิดพลาด
502
รายการ - คลิกช่องในเมทริกซ์เมื่อพบข้อผิดพลาด
502
จำนวนมาก - ที่ด้านขวา ให้คลิก ดูบันทึก เพื่อดูข้อผิดพลาด
502
รายการซึ่ง ซึ่งจะมีลักษณะดังนี้ - Fault Source คือ
target
- Fault Code คือ
messaging.adaptors.http.UnexpectedEOFAtTarget
เราจะเห็นข้อมูลต่อไปนี้
นี่เป็นการระบุว่าข้อผิดพลาด 502
เกิดจากเป้าหมายเนื่องจาก EOF ที่ไม่คาดคิด
นอกจากนี้ โปรดบันทึก Request Message ID
สำหรับข้อผิดพลาด 502
เพิ่มเติม
การสอบสวน
เครื่องมือการติดตาม
วิธีวินิจฉัยข้อผิดพลาดโดยใช้เครื่องมือติดตาม
- เปิดใช้งาน
ติดตามเซสชัน และทำการเรียก API เพื่อจำลองปัญหา
502 Bad Gateway
- เลือกคำขอที่ไม่สำเร็จรายการหนึ่งและตรวจสอบการติดตาม
- ดำเนินการตามขั้นตอนต่างๆ ของการติดตามและค้นหาตำแหน่งที่เกิดข้อผิดพลาด
-
คุณควรเห็นความล้มเหลวหลังจากส่งคำขอไปยังเซิร์ฟเวอร์เป้าหมายดังที่แสดงด้านล่าง
-
ระบุค่า X-Apigee.fault-source และ X-Apigee.fault-code ในฟังก์ชัน AX (บันทึกข้อมูล Analytics) ระยะในการติดตาม
หากค่าของ X-Apigee.fault-source และ X-Apigee.fault-code ตรงกับค่า ที่แสดงในตารางต่อไปนี้ คุณสามารถยืนยันว่าข้อผิดพลาด
502
ที่มาจากเซิร์ฟเวอร์เป้าหมาย:ส่วนหัวการตอบกลับ ค่า X-Apigee.fault-source target
X-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 target
X-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 จากนั้นโปรแกรมประมวลผลข้อความจะส่ง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
- ตรวจสอบบันทึกสำหรับโปรแกรมประมวลผลข้อความ
(
/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
เกิดขึ้นขณะที่ระบบประมวลผลข้อความกำลังพยายามอ่านการตอบกลับจาก เซิร์ฟเวอร์แบ็กเอนด์ ข้อยกเว้นนี้ระบุว่าจุดสิ้นสุดของไฟล์ (EOF) หรือจุดสิ้นสุดของสตรีม โดยไม่คาดคิดกล่าวคือ ตัวประมวลผลข้อความส่งคำขอ API ไปยังเซิร์ฟเวอร์แบ็กเอนด์และกำลังรอ หรือการอ่านคำตอบ แต่เซิร์ฟเวอร์แบ็กเอนด์ตัดการเชื่อมต่ออย่างกะทันหัน ก่อนที่เครื่องมือประมวลผลข้อความจะได้รับการตอบกลับหรือสามารถอ่านคำตอบทั้งหมดได้
- ตรวจสอบบันทึกเซิร์ฟเวอร์แบ็กเอนด์และดูว่ามีข้อผิดพลาดหรือข้อมูลที่อาจ ทำให้เซิร์ฟเวอร์แบ็กเอนด์สิ้นสุดการเชื่อมต่ออย่างกะทันหัน หากเห็น ข้อผิดพลาด/ข้อมูล แล้วไปที่การแก้ปัญหา และแก้ไขปัญหาในเซิร์ฟเวอร์แบ็กเอนด์อย่างเหมาะสม
- หากไม่พบข้อผิดพลาดหรือข้อมูลในเซิร์ฟเวอร์แบ็กเอนด์ ให้รวบรวมเอาต์พุต
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]
ทันทีที่เครื่องมือประมวลผลข้อความส่งคำขอไปยังเซิร์ฟเวอร์แบ็กเอนด์
- หากโฮสต์เซิร์ฟเวอร์แบ็กเอนด์ของคุณมีที่อยู่ IP เดียว ให้ใช้คำสั่งต่อไปนี้
-
ลองดูตัวอย่าง
tcpdump
ต่อไปนี้ตัวอย่าง
tcpdump
ถ่ายเมื่อ502 Bad Gateway Error
(UnexpectedEOFAtTarget
) เกิดขึ้น - จากเอาต์พุต TCPDump คุณจะเห็นลำดับเหตุการณ์ต่อไปนี้
- ในแพ็กเก็ต
985
ตัวประมวลผลข้อความจะส่งคำขอ API ไปยังเซิร์ฟเวอร์แบ็กเอนด์ - ในแพ็กเก็ต
986
เซิร์ฟเวอร์แบ็กเอนด์จะตอบกลับด้วย[FIN,ACK]
ทันที - ในแพ็กเก็ต
987
ตัวประมวลผลข้อความจะตอบสนองด้วย[FIN,ACK]
ไปยังแบ็กเอนด์ เซิร์ฟเวอร์ - ในที่สุดระบบก็ปิดการเชื่อมต่อโดยมี
[ACK]
และ[RST]
จากทั้ง 2 ฝั่ง - เนื่องจากเซิร์ฟเวอร์แบ็กเอนด์จะส่ง
[FIN,ACK]
คุณจึงได้รับข้อยกเว้น ข้อยกเว้นjava.io.EOFException: eof unexpected
ในข้อความ ผู้ประมวลผลข้อมูล
- ในแพ็กเก็ต
- ซึ่งอาจเกิดขึ้นได้หากเซิร์ฟเวอร์แบ็กเอนด์มีปัญหา สร้างการมีส่วนร่วมในเครือข่าย ทีมปฏิบัติการเพื่อตรวจสอบปัญหานี้เพิ่มเติม
ความละเอียด
แก้ไขปัญหาในเซิร์ฟเวอร์แบ็กเอนด์อย่างเหมาะสม
หากปัญหายังคงอยู่และคุณต้องการความช่วยเหลือในการแก้ปัญหา 502 Bad Gateway Error
หรือคุณ
สงสัยว่าจะเป็นปัญหาใน Edge โปรดติดต่อทีมสนับสนุนของ Apigee Edge
สาเหตุ: กำหนดค่าไม่ถูกต้องสำหรับการหมดเวลาของ Keep-alive
ก่อนที่จะวินิจฉัยว่านี่เป็นสาเหตุของข้อผิดพลาด 502
หรือไม่ โปรดอ่าน
แนวคิดต่อไปนี้
การเชื่อมต่อแบบถาวรใน Apigee
โดยค่าเริ่มต้น Apigee (และต่อท้ายด้วยมาตรฐาน HTTP/1.1) จะใช้การเชื่อมต่อแบบถาวร
เมื่อสื่อสารกับเซิร์ฟเวอร์แบ็กเอนด์เป้าหมาย การเชื่อมต่ออย่างต่อเนื่องช่วยเพิ่มประสิทธิภาพได้
ด้วยการอนุญาตให้ระบบ TCP และการเชื่อมต่อ TLS/SSL ที่มีอยู่แล้ว (หากมี) ถูกใช้ซ้ำ
ช่วยลดค่าใช้จ่ายของเวลาในการตอบสนอง ระยะเวลาที่ต้องคงการเชื่อมต่อได้รับการควบคุม
ผ่านพร็อพเพอร์ตี้ รักษาระยะหมดเวลาไว้ (keepalive.timeout.millis
)
ทั้งเซิร์ฟเวอร์แบ็กเอนด์และ Apigee Message Processor จะใช้ระยะหมดเวลาแบบ Keep-alive เพื่อรักษาไว้ การเชื่อมต่อจะเปิดขึ้นพร้อมกัน เมื่อไม่มีการส่งข้อมูลภายในระยะหมดเวลาของ Keep alive เซิร์ฟเวอร์ส่วนหลังหรือตัวประมวลผลข้อความสามารถปิดการเชื่อมต่อกับเซิร์ฟเวอร์อื่นๆ ได้
โดยค่าเริ่มต้น พร็อกซี API ที่ทำให้ใช้งานได้กับตัวประมวลผลข้อความใน Apigee จะตั้งค่าระยะหมดเวลา Keep ทำงานเป็น
60s
เว้นแต่จะมีการลบล้าง เมื่อได้รับข้อมูลสำหรับ 60s
แล้ว Apigee จะ
ปิดการเชื่อมต่อกับเซิร์ฟเวอร์แบ็กเอนด์ เซิร์ฟเวอร์แบ็กเอนด์จะคงระยะหมดเวลา Keep-alive ไว้
และเมื่อขั้นตอนนี้หมดอายุ เซิร์ฟเวอร์แบ็กเอนด์จะปิดการเชื่อมต่อกับ Message Processor
ผลกระทบจากการกำหนดค่าระยะหมดเวลาของ Keep-alive ที่ไม่ถูกต้อง
หากมีการกำหนดค่า Apigee หรือเซิร์ฟเวอร์แบ็กเอนด์ด้วยระยะหมดเวลาของ Keep-alive ที่ไม่ถูกต้อง
ส่งผลให้เกิดเงื่อนไขการแข่งขันซึ่งทำให้เซิร์ฟเวอร์แบ็กเอนด์ส่ง End Of File
(FIN)
ที่ไม่คาดคิดเพื่อตอบกลับคำขอทรัพยากร
ตัวอย่างเช่น หากมีการกำหนดค่าระยะหมดเวลาของ Keep-alive ภายในพร็อกซี API หรือข้อความ
โปรเซสเซอร์ที่มีค่ามากกว่าหรือเท่ากับระยะหมดเวลาของเซิร์ฟเวอร์แบ็กเอนด์อัปสตรีม จากนั้น
อาจมีอาการดังต่อไปนี้ กล่าวคือ หากตัวประมวลผลข้อความไม่ได้รับ
ข้อมูลจนถึงเกณฑ์ที่ใกล้เกณฑ์ของเซิร์ฟเวอร์แบ็กเอนด์จะทำให้หมดเวลาใช้งาน จากนั้นจะมีคำขอ
เข้ามาและส่งไปยังเซิร์ฟเวอร์แบ็กเอนด์โดยใช้การเชื่อมต่อที่มีอยู่ ซึ่งอาจส่งผลถึง
502 Bad Gateway
เนื่องจากเกิดข้อผิดพลาด EOF ที่ไม่คาดคิดตามที่อธิบายไว้ด้านล่าง:
- สมมติว่าระยะหมดเวลา Keep-alive ถูกตั้งค่าไว้ทั้งในตัวประมวลผลข้อความและเซิร์ฟเวอร์แบ็กเอนด์ คือ 60 วินาทีและไม่มีรายการใหม่ มาจนกระทั่ง 59 วินาทีหลังจากที่คำขอก่อนหน้าได้ส่งโดย ตัวประมวลผลข้อความ
- โปรแกรมประมวลผลข้อความจะดำเนินการตามคำขอที่เข้ามาในวินาทีที่ 59 โดยใช้การเชื่อมต่อที่มีอยู่ (เนื่องจากระยะหมดเวลา Keep-alive ยังไม่ผ่าน) แล้วส่ง ไปยังเซิร์ฟเวอร์แบ็กเอนด์
- อย่างไรก็ตาม ก่อนที่คำขอจะส่งมาที่เซิร์ฟเวอร์แบ็กเอนด์ ระบบจะหมดเวลา "ปล่อยให้ทำงาน" ก่อน เกินเกณฑ์ในเซิร์ฟเวอร์แบ็กเอนด์
- คำขอทรัพยากรของผู้ประมวลผลข้อมูลข้อความอยู่ระหว่างดำเนินการ แต่เซิร์ฟเวอร์แบ็กเอนด์
พยายามปิดการเชื่อมต่อด้วยการส่งแพ็กเก็ต
FIN
ไปยังข้อความ ผู้ประมวลผลข้อมูล - ขณะที่ตัวประมวลผลข้อความกำลังรอรับข้อมูล แต่จะได้รับข้อมูล
FIN
ที่ไม่คาดคิด และการเชื่อมต่อจะสิ้นสุดลง - การดำเนินการนี้จะส่งผลให้เกิด
Unexpected EOF
และต่อมาเป็น502
ตัวประมวลผลข้อความจะส่งกลับไปยังไคลเอ็นต์
ในกรณีนี้ เราพบว่าเกิดข้อผิดพลาด 502
ขึ้นเนื่องจากมีการหมดเวลาของ Keep-alive เดียวกัน
กำหนดค่า 60 วินาทีแล้วทั้งในเซิร์ฟเวอร์ตัวประมวลผลข้อความและเซิร์ฟเวอร์แบ็กเอนด์ ในทำนองเดียวกัน
ปัญหานี้อาจเกิดขึ้นได้เช่นกันหากมีการกำหนดค่าที่สูงกว่าสำหรับระยะหมดเวลาของ Keep-alive ในข้อความ
ผู้ประมวลผลข้อมูลมากกว่าในเซิร์ฟเวอร์แบ็กเอนด์
การวินิจฉัย
- หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ ให้ทำดังนี้
- ใช้เครื่องมือตรวจสอบหรือติดตาม API (ตามที่อธิบายไว้ใน
ขั้นตอนการวิเคราะห์ทั่วไป) และตรวจสอบว่าคุณมีคุณสมบัติตรงตามทั้ง 2 ข้อต่อไปนี้
การตั้งค่าต่อไปนี้
- รหัสข้อผิดพลาด:
messaging.adaptors.http.flow.UnexpectedEOFAtTarget
- แหล่งที่มาของข้อผิดพลาด:
target
- รหัสข้อผิดพลาด:
- ไปที่การใช้ tcpdump เพื่อตรวจสอบเพิ่มเติม
- ใช้เครื่องมือตรวจสอบหรือติดตาม API (ตามที่อธิบายไว้ใน
ขั้นตอนการวิเคราะห์ทั่วไป) และตรวจสอบว่าคุณมีคุณสมบัติตรงตามทั้ง 2 ข้อต่อไปนี้
การตั้งค่าต่อไปนี้
- หากคุณเป็นผู้ใช้ Private Cloud ให้ทำดังนี้
- ใช้เครื่องมือติดตามหรือ
บันทึกการเข้าถึง NGINX เพื่อระบุรหัสข้อความ
รหัสข้อผิดพลาด และแหล่งที่มาของข้อผิดพลาดสำหรับข้อผิดพลาด
502
- ค้นหารหัสข้อความในบันทึกตัวประมวลผลข้อความ
(/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
บ่งชี้ว่า ผู้ประมวลผลข้อความได้รับEOF
ขณะที่รออ่าน การตอบกลับจากเซิร์ฟเวอร์แบ็กเอนด์ - แอตทริบิวต์
useCount=7
ในข้อความแสดงข้อผิดพลาดข้างต้นระบุว่า ตัวประมวลผลข้อความได้ใช้การเชื่อมต่อนี้ซ้ำประมาณ 7 ครั้งและแอตทริบิวต์bytesWritten=159
ระบุว่าเครื่องมือประมวลผลข้อความได้ส่งคำขอแล้ว เพย์โหลด159
ไบต์ไปยังเซิร์ฟเวอร์แบ็กเอนด์ แต่คุณได้รับ 0 ไบต์ เมื่อเกิดEOF
ที่ไม่คาดคิด -
ซึ่งแสดงว่าระบบประมวลผลข้อความได้ใช้การเชื่อมต่อเดิมซ้ำหลายครั้ง และในกรณีนี้ มีการส่งข้อมูล แต่หลังจากนั้นไม่นานก็ได้รับ
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
เซิร์ฟเวอร์แบ็กเอนด์ได้รับคำขอGET
รายการที่ 3 - ในขณะนี้ เซิร์ฟเวอร์แบ็กเอนด์จะส่ง
FIN, ACK
กลับไปยังตัวประมวลผลข้อความ (แพ็กเก็ต6285
) ที่เริ่มปิดการเชื่อมต่อ
ในตัวอย่างนี้มีการใช้การเชื่อมต่อเดียวกันซ้ำ 2 ครั้งแล้ว แต่ในคำขอที่สาม เซิร์ฟเวอร์ส่วนหลังจะเริ่มปิดการเชื่อมต่อ ขณะที่ตัวประมวลผลข้อความ กำลังรอข้อมูลจากเซิร์ฟเวอร์แบ็กเอนด์ แสดงว่าเซิร์ฟเวอร์แบ็กเอนด์จะเก็บ การหมดเวลาตลอดอายุการใช้งานมักจะสั้นกว่าหรือเท่ากับค่าที่ตั้งไว้ในพร็อกซี 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 ใน Apigee สูงกว่า
มากกว่าค่าของพร็อพเพอร์ตี้การหมดเวลา Keep alive บนเซิร์ฟเวอร์แบ็กเอนด์ตามข้างต้น
นั่นคือสาเหตุของข้อผิดพลาด
502
ความละเอียด
ตรวจสอบว่าพร็อพเพอร์ตี้ Keep-alive หมดเวลาใน Apigee ต่ำกว่าเสมอ (ในพร็อกซี API และ คอมโพเนนต์ตัวประมวลผลข้อความ) เทียบกับในเซิร์ฟเวอร์แบ็กเอนด์
- ระบุค่าที่ตั้งไว้สำหรับระยะหมดเวลา Keep alive บนเซิร์ฟเวอร์แบ็กเอนด์
- กำหนดค่าที่เหมาะสมสำหรับพร็อพเพอร์ตี้การหมดเวลาของ Keep alive ในพร็อกซี API หรือ ตัวประมวลผลข้อความ ซึ่งทำให้พร็อพเพอร์ตี้ Keep-alive หมดเวลาต่ำกว่าค่าที่ตั้งไว้ใน เซิร์ฟเวอร์ส่วนหลัง โดยใช้ขั้นตอนที่อธิบายไว้ใน การกำหนดค่าระยะหมดเวลา Keep alive ใน Message Processor
หากยังคงพบปัญหา ให้ไปที่ ต้องรวบรวมข้อมูลการวินิจฉัย
แนวทางปฏิบัติแนะนำ
เราขอแนะนำเป็นอย่างยิ่งว่าคอมโพเนนต์ดาวน์สตรีมจะมีระยะหมดเวลาของ Keep-alive น้อยกว่าเสมอ
เกณฑ์มาตรฐานสูงกว่าที่กำหนดค่าไว้ในเซิร์ฟเวอร์อัปสตรีม เพื่อหลีกเลี่ยงเงื่อนไขการแข่งขันประเภทนี้ และ
ข้อผิดพลาด 502
รายการ ฮอพดาวน์สตรีมแต่ละรายการควรต่ำกว่าฮอพอัปสตรีมแต่ละรายการ ใน Apigee
Edge ควรใช้หลักเกณฑ์ต่อไปนี้
- ระยะหมดเวลาของ Keep-alive ของไคลเอ็นต์ควรน้อยกว่าระยะหมดเวลาของ Edge Router ที่จะคงอยู่
- การหมดเวลาของ Edge Router จะคงการทำงานต้องน้อยกว่าค่าการหมดเวลาของ Message Processor ที่ยังคงทำงานอยู่
- การหมดเวลาของ Keep-alive ของโปรแกรมประมวลผลข้อความควรน้อยกว่าการหมดเวลาแบบ Keep-alive ของเซิร์ฟเวอร์เป้าหมาย
- หากคุณมีการ Hop อื่นๆ ที่อยู่ด้านหน้าหรือหลัง 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
- บันทึกของผู้ประมวลผลข้อความ
วันที่/opt/apigee/var/log/edge-message-processor/logs/system.log
- ช่วงเวลาที่มีข้อมูลเขตเวลาเมื่อเกิดข้อผิดพลาด
502
รายการ Tcpdumps
ถูกรวบรวมไว้ใน Message Processor หรือเซิร์ฟเวอร์แบ็กเอนด์ หรือทั้งสองอย่างเมื่อเกิดข้อผิดพลาด เกิดขึ้น