ฉันเขียนที่นี่หลังจากใช้เวลาหลายสัปดาห์ในการต่อสู้กับปัญหาที่ทำให้ Apache หยุดตอบสนองจนกว่าจะรีสตาร์ท
มันเกิดขึ้น 3/4 ครั้งต่อวัน บางครั้งหลังจากชั่วโมง บางครั้งหลังจากบางนาที บางครั้งหลังจากวัน
ไม่มีความสัมพันธ์ (อย่างน้อยก็ไม่มีหลักฐาน) กับจำนวนการเชื่อมต่อพร้อมกันกับเซิร์ฟเวอร์: เกิดขึ้นทั้งในช่วงเวลาที่มีการจราจรคับคั่ง (ระหว่าง 8.00 น. - 18.00 น.) และในช่วงกลางคืนที่มีการเข้าถึงต่ำมาก
การกำหนดค่า:
VM บน Vmware ESXi Rel 7 - ระบบปฏิบัติการ: Ubuntu 20.04, Apache 2.4.41, PHP 8.0.15, ไดรเวอร์ MSSQL 17.8.1.1-1
6 CPU "Xeon(R) Gold 5218", แรม 12Gb.
3 เว็บไซต์ที่ทำงานด้วย PHP "บริสุทธิ์" (ไม่มี CMS เช่น Wordpress, Drupal, Ruby On Rails เป็นต้น)
Awstats แสดงให้เห็นว่าอินทราเน็ตที่ไม่มีการเข้าถึงจากภายนอกให้บริการ < 10,000 หน้าต่อวัน ส่วนอีกประมาณ 200,000 หน้าให้บริการต่อวัน
การใช้งาน CPU ส่วนใหญ่อยู่ที่ประมาณ 1% และหน่วยความจำที่ใช้ประมาณ 2Gb เมื่อเกิดปัญหาขึ้น จะไม่พบ "spikes" ของ CPU/หน่วยความจำ/เครือข่าย
ในขณะนั้นฉันติดตั้งและกำหนดค่า โมนิท ที่ทดสอบทุกๆ 20 วินาทีด้วยการขดหน้าเว็บ PHP ขั้นต่ำนี้:
<?php
echo "ok";
?>
โดยปกติจะพิมพ์ "ตกลง" ในช่วง "หยุด" แม้แต่หน้าธรรมดานี้ก็ไม่แสดง curl จบลงด้วยข้อผิดพลาดการหมดเวลาและทริกเกอร์ monit เพื่อทำการ "เริ่มบริการ apache2 ใหม่" หลังจากผ่านไป 2/3 วินาที เว็บไซต์จะกลับมาทำงานตามปกติ (จนกว่าจะหยุดทำงานครั้งต่อไป)
ติดตามรายการการแก้ไขที่ไม่สำเร็จ (ไม่เรียงตามลำดับเวลา):
- ลบ certbot-Letsencrypt และใช้ Sectigo ที่ซื้อ SSL cerificate
- เปลี่ยน Apache จาก mpm_worker เป็น mpm_event
- ปิดใช้งานโมดูลของ Apache ที่ไม่ได้ใช้จำนวนมาก
- ปิดใช้งานโมดูลของ PHP ที่ไม่ได้ใช้จำนวนมาก
- ปิดใช้งานงาน cron ที่ไม่สำคัญส่วนใหญ่ (แม้ว่าจะไม่มีหลักฐานว่าการหยุดทำงานเกิดขึ้นระหว่างการดำเนินการงาน cron)
- เปลี่ยนอะแดปเตอร์เครือข่ายเสมือนจาก VMXNET3 เป็น E1000
- เปิดใช้งานการบันทึกแบบละเอียด: ไม่มีการบันทึกข้อมูลที่เป็นประโยชน์/ข้อผิดพลาด เพียงแค่มีช่องว่างเวลา 25-30 วินาทีจากหน้าสุดท้ายที่แสดงผลก่อนที่จะหยุดการเสิร์ฟครั้งแรกเมื่อการรีสตาร์ทเสร็จสมบูรณ์
- เปิดใช้งานเป็นบางวัน mod_log_forensic: ไม่มี (!) รายงานข้อผิดพลาดโดยใช้ยูทิลิตี้ check_forensic
- ตรวจสอบกฎการเขียนซ้ำสองสามข้อใน .conf และ .htaccess
- เปลี่ยนการกำหนดค่าของ Apache; ค่าที่เกี่ยวข้องคือ:
สตาร์ทเซิร์ฟเวอร์ 10
MinSpareThreads 40
MaxSpareThreads 120
ขีด จำกัด ของเธรด 100
กระทู้ต่อเด็ก 75
MaxRequestWorkers 450
MaxConnectionsPerChild 1,000
ไม่มีความสัมพันธ์ที่ชัดเจนระหว่างหน้า/ไฟล์ "สุดท้าย" ที่แสดงก่อนเกิดปัญหา: บางครั้งเป็นหน้า PHP (เห็นได้ชัดว่าไม่เหมือนกัน) บางครั้งเป็นรูปภาพ png/jpeg
การอ่านบันทึก ฉันไม่พบคำขอของลูกค้าที่ผิดปกติ/ผิดรูปแบบ/มากเกินไป
ปัญหาเกี่ยวข้องกับ Apache 99.99% บริการ PHP-fpm ทำงานได้อย่างสมบูรณ์และไม่จำเป็นต้องรีสตาร์ทหลังจากหยุดทำงาน บริการที่ทำงานอยู่ของเซิร์ฟเวอร์อื่นทั้งหมดจะไม่ได้รับผลกระทบ
ก่อนเขียนที่นี่ ฉันอ่านหน้าเว็บมากมายแต่ไม่พบคำใบ้ที่เป็นประโยชน์ (สำหรับฉัน) เลย
ขอบคุณใน adv
เฉียว
ปปส