ไดเรกทอรีบทความ
- 1 เหตุผลหลักที่ทำให้ PHP-FPM มีภาระมากเกินไป
- 2 การเพิ่มประสิทธิภาพกลุ่มกระบวนการ PHP-FPM (การปรับพารามิเตอร์หลัก)
- 3 เปิดใช้งานการตรวจสอบสถานะ PHP-FPM เพื่อติดตามความคืบหน้าได้ตลอดเวลา
- 4 เพิ่มประสิทธิภาพบันทึก PHP-FPM เพื่อแก้ไขปัญหาอย่างรวดเร็ว
- 5 รีสตาร์ท PHP-FPM เป็นประจำเพื่อป้องกันการรั่วไหลของหน่วยความจำ
- 6 จะเกิดอะไรขึ้นถ้าปัญหายังคงมีอยู่? เพิ่มประสิทธิภาพเพิ่มเติม!
- 7 สรุป: เพิ่มประสิทธิภาพ PHP-FPM และเว็บไซต์จะไม่ล่มอีกต่อไป!
คุณเคยประสบกับสถานการณ์แบบนี้บ้างไหม?การเข้าถึงเว็บไซต์ช้าลงอย่างกะทันหัน หรืออาจส่งผลให้เกิดข้อผิดพลาด 500 หลังจากรีสตาร์ท PHP-FPM เว็บไซต์ก็กลับมาเป็นปกติแต่ปัญหาเริ่มเกิดขึ้นอีกหลังจากนั้นสักพัก? มันน่าหงุดหงิดจริงๆ!
เหตุใดจึงเกิดขึ้นในความเป็นจริงแล้วนี่เป็นปกติพูลกระบวนการ PHP-FPM ไม่ได้รับการกำหนดค่าอย่างถูกต้องหรือทรัพยากรเซิร์ฟเวอร์ไม่เพียงพอเกิดจาก. วันนี้เราจะมาปรับให้ละเอียดขึ้น เฮสเทียซีพี PHP-FPM ช่วยให้เว็บไซต์มีเสถียรภาพมั่นคงเหมือนหิน!
เหตุผลหลักที่ทำให้ PHP-FPM มีภาระมากเกินไป
PHP-FPM คือผู้จัดการกระบวนการซึ่งรับผิดชอบการจัดการคำขอแบบไดนามิก หากการกำหนดค่าไม่เหมาะสมอาจทำให้เกิดผลดังต่อไปนี้:
- ทรัพยากรเซิร์ฟเวอร์หมดลงทำให้ PHP-FPM ไม่สามารถตอบสนองคำขอใหม่ได้ทันเวลา
- กระบวนการมีน้อยเกินไปเมื่อปริมาณการจราจรเพิ่มขึ้นกระทันหัน ไม่สามารถดำเนินการได้ทันเวลา
- การใช้กระบวนการสูงเกินไปทำให้โหลด CPU ระเบิด

จะทราบได้อย่างไรว่า PHP-FPM โอเวอร์โหลดหรือไม่
สามารถใช้ top 或 htop คำสั่งดูการใช้งาน CPU และหน่วยความจำ:
top -c
หากคุณเห็นข้อมูลกระบวนการคล้ายกับต่อไปนี้ แสดงว่า PHP-FPM กำลังทำงานภายใต้โหลดสูง:
1669293 abc 20 0 790284 227880 185568 R 73.1 0.9 1:30.09 php-fpm: pool chenweiliang.com
1669522 abc 20 0 801924 224224 170236 R 69.9 0.9 0:59.01 php-fpm: pool chenweiliang.com
เห็นไหมว่ากระบวนการเหล่านี้ใช้ CPU มากถึง 70% หากสิ่งนี้เกิดขึ้นบ่อยครั้ง PHP-FPM ของคุณ ต้องมีปัญหาอะไรสักอย่าง!
แล้วเราจะปรับแต่งการตั้งค่า PHP-FPM ให้เหมาะสมเพื่อไม่ให้เซิร์ฟเวอร์ทำงานหนักเกินไปได้อย่างไร?
การเพิ่มประสิทธิภาพกลุ่มกระบวนการ PHP-FPM (การปรับพารามิเตอร์หลัก)
อันดับแรกให้เปิด php-fpm ไฟล์การกำหนดค่า:
sudo nano /etc/php/*/fpm/pool.d/www.conf- *เปลี่ยนเป็นเวอร์ชัน PHP ของคุณ เช่น PHP8.3 และเปลี่ยนเป็นแบบนี้:
/etc/php/8.3/fpm/pool.d/www.conf
สอบถามเวอร์ชัน PHP ที่ตั้งโดย HestiaCP
v-list-web-domain user domain.com
ตัวอย่างเช่น:
v-list-web-domain abc chenweiliang.com
ในผลลัพธ์ คุณจะเห็นบางอย่างเช่น:
PHP SUPPORT yes
PHP MODE php-fpm
PHP VERSION 8.3
ซึ่งหมายความว่าเว็บไซต์นี้ใช้ PHP ฮิต.
มาดูการกำหนดค่า PHP-FPM ของคุณกัน:
[chenweiliang.com]
listen = /run/php/php8.3-fpm-chenweiliang.com.sock
listen.owner = abc
listen.group = www-data
listen.mode = 0660
user = abc
group = abc
pm = ondemand
pm.max_children = 8
pm.max_requests = 4000
pm.process_idle_timeout = 10s
คุณจะเห็นว่าคุณ pm อันที่ใช้คือ ondemand,แม้ว่าจะสามารถลดการใช้ทรัพยากรในช่วงเวลาว่างได้ แต่เมื่อปริมาณการรับส่งข้อมูลเพิ่มขึ้นอย่างกะทันหัน กระบวนการอาจไม่สามารถตอบสนองได้ทันเวลาส่งผลให้เกิดข้อผิดพลาด 500
1. ปรับพารามิเตอร์ของกลุ่มกระบวนการ PHP-FPM
หากการกำหนดค่าใช้ dynamicนี่เป็นวิธีการเริ่มกระบวนการทำงานบางอย่างล่วงหน้าและปรับเปลี่ยนแบบไดนามิกตามปริมาณคำขอ ซึ่งจะตอบสนองได้เร็วขึ้นเมื่อปริมาณคำขอเพิ่มขึ้นอย่างกะทันหัน
สำหรับเว็บไซต์ที่มีปริมาณการเข้าชมจำนวนหนึ่ง แนะนำให้ใช้ pm = dynamicเนื่องจากสามารถรักษาปริมาณกระบวนการที่ไม่ได้ใช้งานในระดับหนึ่งและหลีกเลี่ยงข้อผิดพลาด 500 ในระหว่างการทำงานพร้อมกันจำนวนมาก
ขอแนะนำให้ใช้เฉพาะเมื่อปริมาณการเข้าถึงต่ำมากและทรัพยากรหน่วยความจำมีจำกัด pm = ondemand เพื่อประหยัดทรัพยากร
แนะนำให้ ondemandและเพิ่มประสิทธิภาพ pm.max_children และพารามิเตอร์อื่น ๆ :
pm = dynamic
pm.max_children = 16 ; 根据服务器资源调整,建议值:CPU 核心数 × 2
pm.start_servers = 4 ; 初始进程数,建议设为 max_children × 25%
pm.min_spare_servers = 2 ; 最小空闲进程数
pm.max_spare_servers = 7 ; 最大空闲进程数
pm.max_requests = 3000 ; 每个子进程处理完 3000 个请求后自动重启
pm.process_idle_timeout = 10s ; 空闲进程 10s 后自动退出
ทำไมคุณถึงอยากเปลี่ยนแปลงแบบนี้?
pm = dynamic:จัดสรรกระบวนการให้ยืดหยุ่นมากขึ้นเพื่อหลีกเลี่ยงการรอคำขอที่อาจเกิดขึ้นตามความต้องการpm.max_children = 16: ป้องกันข้อผิดพลาด 500 รายการที่เกิดจากกระบวนการน้อยเกินไปpm.start_servers = 5: หลีกเลี่ยงการเริ่มต้นกระบวนการช้าpm.max_requests = 3000:การป้องกันการรั่วไหลของหน่วยความจำ, รีไซเคิลกระบวนการเป็นประจำ
2. จำกัดเวลาในการดำเนินการของสคริปต์ PHP เพื่อป้องกันการครอบครองในระยะยาว
request_terminate_timeout = 30s ; 超过 30s 的 PHP 脚本自动终止
php_admin_value[memory_limit] = 128M ; 限制 PHP 进程最大内存占用
สิ่งนี้สามารถป้องกันบางอย่างได้สคริปต์ PHP ที่ใช้ CPU มากเกินไปอาจทำให้เซิร์ฟเวอร์ของคุณหยุดทำงาน.
หลังจากบันทึกแล้วให้เริ่มกระบวนการ PHP ใหม่:
sudo systemctl restart php8.3-fpmเปิดใช้งานการตรวจสอบสถานะ PHP-FPM เพื่อติดตามความคืบหน้าได้ตลอดเวลา
เปิดใช้งานการตรวจสอบกระบวนการ PHP-FPM และดูได้ตลอดเวลาจำนวนปัจจุบันของกระบวนการที่ใช้งานอยู่และสถานะการรอการร้องขอเพื่อหลีกเลี่ยงการโอเวอร์โหลดของเซิร์ฟเวอร์
在 php-fpm.conf เพิ่มใน:
pm.status_path = /status
จากนั้นกำหนดค่า Nginx:
location /status {
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
allow 127.0.0.1;
deny all;
}
ด้วยวิธีนี้คุณสามารถ http://yourdomain.com/status ลองใช้ PHP-FPM ในการทำงาน!
เพิ่มประสิทธิภาพบันทึก PHP-FPM เพื่อแก้ไขปัญหาอย่างรวดเร็ว
在 php-fpm.conf เครื่องหมาย:
php_admin_value[error_log] = /var/log/php-fpm/error.log
php_admin_value[log_errors] = On
php_admin_value[error_reporting] = E_ALL
slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 5s ; 执行超过 5s 的脚本记录到日志
ด้วยวิธีนี้ เมื่อใดก็ตามที่เกิดข้อผิดพลาด 500 คุณสามารถดูบันทึกได้โดยตรง:
tail -f /var/log/php-fpm/error.log
ดูว่า PHP รายงานข้อผิดพลาดหรือไม่ เช่น out of memory,script execution timeout 等
รีสตาร์ท PHP-FPM เป็นประจำเพื่อป้องกันการรั่วไหลของหน่วยความจำ
สามารถผ่านไปได้ cron รีสตาร์ท PHP-FPM เป็นประจำเพื่อป้องกันไม่ให้กระบวนการทำงานยาวนานทำให้เกิดการรั่วไหลของหน่วยความจำ.
crontab -e
เพิ่มงานตามกำหนดเวลาต่อไปนี้เพื่อรีสตาร์ท PHP-FPM โดยอัตโนมัติในเวลา 3 น. ทุกวัน:
0 3 * * * /usr/sbin/service php8.3-fpm restart
จะเกิดอะไรขึ้นถ้าปัญหายังคงมีอยู่? เพิ่มประสิทธิภาพเพิ่มเติม!
หากคุณยังคงปฏิบัติตามการเพิ่มประสิทธิภาพข้างต้นบางครั้งเกิดข้อผิดพลาด 500 ครั้งคุณสามารถดำเนินการต่อด้วยการปรับแต่งต่อไปนี้:
1. เปิดใช้งาน OPcache เพื่อปรับปรุงประสิทธิภาพการทำงานของ PHP
หากยังไม่ได้เปิดใช้งาน OPcache คุณสามารถติดตั้งได้ดังนี้ (โดยใช้ Ubuntu เป็นตัวอย่าง):
sudo apt install php8.3-opcache -y
แล้วแก้ไข php.ini:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.validate_timestamps=1
ผล? ความเร็วในการดำเนินการหน้า PHP ได้รับการปรับปรุงอย่างมาก!
2. การเพิ่มประสิทธิภาพการกำหนดค่า Nginx
ตรวจสอบให้แน่ใจว่าพารามิเตอร์ที่เกี่ยวข้องกับ Nginx มีความเหมาะสม เช่น fastcgi_read_timeout ปรับแต่งให้เหมาะสมเพื่อหลีกเลี่ยงสคริปต์ PHP ที่ถูกยุติโดย Nginx เนื่องจากเวลาในการดำเนินการที่ยาวนาน:
fastcgi_read_timeout 60s;
client_max_body_size 100M;
สรุป: เพิ่มประสิทธิภาพ PHP-FPM และเว็บไซต์จะไม่ล่มอีกต่อไป!
เราได้ทำการปรับปรุงอะไรบ้างหลังจากการเพิ่มประสิทธิภาพครั้งนี้?
✅ การเพิ่มประสิทธิภาพของกลุ่มกระบวนการ PHP-FPM,ใช้ ondemandและเพิ่มประสิทธิภาพ pm.max_children พารามิเตอร์;
✅ การจำกัดเวลาการทำงานของสคริปต์ PHPเพื่อป้องกันการครอบครอง CPU ในระยะยาว
✅ เปิดใช้งานการตรวจสอบ PHP-FPMดูภาระกระบวนการแบบเรียลไทม์;
✅ การเพิ่มประสิทธิภาพบันทึก PHP-FPMแก้ไขข้อผิดพลาด 500 รายการอย่างรวดเร็ว
✅ รีสตาร์ท PHP-FPM เป็นประจำป้องกันการรั่วไหลของหน่วยความจำ
✅ เปิดใช้งาน OPcacheปรับปรุงประสิทธิภาพการดำเนินการ PHP;
✅ การเพิ่มประสิทธิภาพการกำหนดค่า Nginxเพื่อหลีกเลี่ยงปัญหาการหมดเวลา
หลังจากการเพิ่มประสิทธิภาพนี้ โหลด PHP-FPM จะลดลงอย่างมาก และการทำงานของเว็บไซต์จะเสถียรยิ่งขึ้น!
ไปลองเลยตอนนี้!
หวัง Chen Weiliang บล็อก ( https://www.chenweiliang.com/ ) แชร์ "โหลด PHP-FPM ของ HestiaCP สูงเกินไปหรือไม่? ข้อผิดพลาดหน้าเว็บไดนามิก 500? การเพิ่มประสิทธิภาพนี้จะมีผลทันที! ” มันอาจจะเป็นประโยชน์กับคุณ
ยินดีต้อนรับสู่การแบ่งปันลิงค์ของบทความนี้:https://www.chenweiliang.com/cwl-32512.html
หากต้องการปลดล็อคเคล็ดลับที่ซ่อนอยู่เพิ่มเติม ยินดีต้อนรับเข้าร่วมช่อง Telegram ของเรา!
แชร์และกดไลค์ถ้าคุณชอบ! การแชร์และการถูกใจของคุณคือแรงบันดาลใจอย่างต่อเนื่องของเรา!