เมื่อเร็ว ๆ นี้ฉันพบว่าตัวเองมีเว็บไซต์ (Prestashop e-commerce บนเครื่อง Centos PHP-FPM /Apache / MySql) ที่หยุดทำงานและไม่ตอบสนองต่อคำขอของเว็บ
หลังจากการตรวจสอบ ปัญหาเกิดจากการเรียก API ที่ทำด้วย php-curl ไปยังจุดสิ้นสุดที่ออฟไลน์ชั่วคราว ภายในไฟล์ PHP ของแอปพลิเคชันที่ถูกเรียกคืนในทุกหน้าของเว็บไซต์
การเรียก cURL เกิดขึ้นอย่างไม่ถูกต้องโดยไม่มีการตั้งค่า CURLOPT_TIMEOUT_MS ดังนั้นผู้ใช้ที่เยี่ยมชมเว็บไซต์ของฉันจึงเติมการเชื่อมต่อ php ในจำนวนสูงสุดอย่างรวดเร็ว บล็อกกระบวนการ php-fpm และป้องกันไม่ให้เซิร์ฟเวอร์ของฉันรับการเชื่อมต่อขาเข้าอื่นๆ
ฉันสงสัยว่าใครสามารถป้องกัน / ระบุปัญหา "ในการผลิต" จากเทอร์มินัลได้อย่างรวดเร็วและมีประสิทธิภาพหากเกิดขึ้นอีกครั้ง (โดยเฉพาะอย่างยิ่งเพื่อทำความเข้าใจอย่างรวดเร็วว่าจุดสิ้นสุดที่ถูกบล็อกหรือระบุไฟล์ที่สร้างสคริปต์ที่บล็อกเซิร์ฟเวอร์) เนื่องจากในกรณีของฉัน ฉันต้องตรวจสอบปัญหาที่ "ระดับแอปพลิเคชัน" แทนที่จะตรวจสอบจากเซิร์ฟเวอร์ เนื่องจาก:
- การเปิดใช้ "บนสุด" เซิร์ฟเวอร์จะแสดงรายการกระบวนการ php-fpm ที่ถูกบล็อกโดยไม่มีข้อมูลเพิ่มเติมเพื่อทำความเข้าใจปัญหา (เช่น โหลดเซิร์ฟเวอร์เฉลี่ยอยู่ที่ประมาณ 0.00 เนื่องจากแทบไม่มีกิจกรรมใดๆ เนื่องจากการเชื่อมต่อติดขัด)
- การเปิดตัว "netstat -nputw" แสดงการเชื่อมต่อภายในจำนวนมากในสถานะ TIME_WAIT แต่ไม่มีข้อมูลเกี่ยวกับการหยุดทำงาน "ผู้ร้าย" (ฉันสามารถเห็นจุดสิ้นสุดที่เรียกโดย php-curl ด้วย netstat หรือคำสั่งเครือข่ายที่คล้ายกันหรือไม่)
- การเปิดใช้ "strace" ของกระบวนการ php-fpm ฉันเห็นไฟล์ที่เกี่ยวข้องจำนวนมาก แต่สิ่งนี้ไม่มีประโยชน์มากนักเนื่องจากไซต์นี้มีปริมาณการใช้งานเฉลี่ย เปิดไฟล์หลายสิบไฟล์
- บันทึกของเว็บเซิร์ฟเวอร์แจ้งเพียงการหมดเวลาการเชื่อมต่อไปยังทรัพยากรบนเว็บ แต่ไม่ใช่ของสคริปต์ที่มีการเรียก cURL ที่มีปัญหา
ขอบคุณสำหรับความช่วยเหลือของคุณ.