ไดเรกทอรีบทความ
คุณเคยประสบกับสถานการณ์แบบนี้บ้างไหม?การเข้าถึงเว็บไซต์ช้าลงอย่างกะทันหัน หรืออาจส่งผลให้เกิดข้อผิดพลาด 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.5 และเปลี่ยนเป็นแบบนี้:
/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.5 ซึ่งหมายความว่าเว็บไซต์นี้ใช้ 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
www.conf: "แหล่งรวมทรัพยากรสากล" ในตัวของระบบ
หลังจากติดตั้ง PHP-FPM แล้ว ระบบจะแสดง... ให้คุณโดยอัตโนมัติ www.conf ไฟล์.
ของมันการวางตำแหน่งมันง่ายมาก—มันเป็นเพียงพูลกระบวนการเริ่มต้นที่ใช้งานได้ทันที โดยปกติจะเชื่อมต่ออยู่กับ... www ข้อมูล ดาวน์โหลดโดยผู้ใช้
พูลประเภทนี้เหมาะอย่างยิ่งสำหรับสภาพแวดล้อมแบบไซต์เดียว: การกำหนดค่ามีน้ำหนักเบา และพารามิเตอร์ทั้งหมดเป็นเทมเพลตทั่วไป เช่น:
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
pm.max_children = 5
หากคุณโฮสต์เว็บไซต์เพียงเว็บไซต์เดียว คุณสามารถใช้งานได้โดยตรงและเชื่อถือได้โดยไม่ต้องยุ่งยากเพิ่มเติม
etยูเอฟโอ.org.conf: กลุ่มพูลแบบกำหนดเอง
เมื่อคุณบริหารจัดการหลายเว็บไซต์ คุณไม่สามารถรวมทุกคนไว้ในกลุ่มผู้ใช้งานเดียวกันได้
ในขั้นตอนนี้ HestiaCP จะสร้างพูลแยกต่างหากสำหรับแต่ละไซต์โดยอัตโนมัติ ตัวอย่างเช่น... etยูเอฟโอ.org.confเชี่ยวชาญด้านชื่อโดเมน etufo.org 服务
วิธีการเล่นทั่วไปคือ:
- เปลี่ยนผู้ใช้และกลุ่ม:
user = etufo,group = etufo - การตรวจสอบโดยอิสระ:
listen = /run/php/etufo.sock - การปรับจำนวนกระบวนการช่วยให้ระบบมีเสถียรภาพอย่างมั่นคงแม้ในสภาวะที่มีการทำงานพร้อมกันจำนวนมาก
- การแยกไฟล์บันทึกข้อมูลจะช่วยให้การแก้ไขปัญหาชัดเจนยิ่งขึ้น
ประโยชน์ที่ได้รับนั้นชัดเจน:การแยกตัวอย่างปลอดภัยแม้ว่าเว็บไซต์หนึ่งจะถูกโจมตี เว็บไซต์อื่นๆ ก็จะยังคงไม่ได้รับผลกระทบ
dummy.conf: ไฟล์จำลอง
ดัมมี่.คอนฟ์ สิ่งเหล่านี้มักจะเป็นตัวอย่างหรือแม่แบบที่ระบบจัดเตรียมไว้ให้
โปรแกรมจะไม่ทำงานจริง ๆ เว้นแต่คุณจะแก้ไขและเปิดใช้งานด้วยตนเอง
ความสำคัญของมันนั้นคล้ายกับ "คู่มือการใช้งาน" ที่บอกวิธีเขียนการตั้งค่าพูลใหม่
ทำไมต้องแบ่งสระว่ายน้ำ?
- 安全性ควรใช้บัญชีผู้ใช้ที่แตกต่างกันสำหรับเว็บไซต์ต่างๆ เพื่อหลีกเลี่ยงปัญหาการขัดแย้งเรื่องสิทธิ์การเข้าถึง
- 性能优化สามารถปรับจำนวนกระบวนการได้ทีละส่วนสำหรับแต่ละพูล ทำให้สามารถปรับเปลี่ยนได้อย่างยืดหยุ่นตามความต้องการด้านปริมาณการใช้งาน
- การแยกตัวบันทึกข้อผิดพลาดและที่อยู่การรับฟังถูกแยกออกจากกัน ทำให้การแก้ไขปัญหาทำได้ง่ายขึ้น
ตัวอย่างเช่น แม้ว่า www.conf มันพังทลายลงetufo.org.conf ระบบจะยังคงทำงานได้ตามปกติและจะไม่ทำให้เซิร์ฟเวอร์ล่มทั้งหมด
实际场景
- เซิร์ฟเวอร์ไซต์เดียวแค่ www.conf ก็เพียงพอแล้ว
- เซิร์ฟเวอร์มัลติไซต์แต่ละเว็บไซต์จะมีไฟล์ .conf แยกต่างหากเป็นของตนเอง เช่น etufo.org.conf
- ดัมมี่.คอนฟ์เพื่อเป็นข้อมูลอ้างอิงเท่านั้น ไม่แนะนำให้ใช้
การเปรียบเทียบการกำหนดค่า
www.conf (พูลเริ่มต้น)
[www]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
pm = dynamic
pm.max_children = 5
etufo.org.conf (พูลแบบกำหนดเอง)
[etufo.org]
user = etufo
group = etufo
listen = /run/php/etufo.sock
pm = dynamic
pm.max_children = 20
access.log = /var/log/php-fpm/etufo.access.log
ความแตกต่างหลักคือ:ข้อมูลประจำตัวผู้ใช้ ที่อยู่สำหรับการรับฟัง จำนวนกระบวนการ.
1. ปรับพารามิเตอร์ของกลุ่มกระบวนการ PHP-FPM
หากการกำหนดค่าใช้ dynamicนี่เป็นวิธีการเริ่มกระบวนการทำงานบางอย่างล่วงหน้าและปรับเปลี่ยนแบบไดนามิกตามปริมาณคำขอ ซึ่งจะตอบสนองได้เร็วขึ้นเมื่อปริมาณคำขอเพิ่มขึ้นอย่างกะทันหัน
สำหรับเว็บไซต์ที่มีปริมาณการเข้าชมจำนวนหนึ่ง แนะนำให้ใช้ pm = dynamicเนื่องจากสามารถรักษาปริมาณกระบวนการที่ไม่ได้ใช้งานในระดับหนึ่งและหลีกเลี่ยงข้อผิดพลาด 500 ในระหว่างการทำงานพร้อมกันจำนวนมาก
ขอแนะนำให้ใช้เฉพาะเมื่อปริมาณการเข้าถึงต่ำมากและทรัพยากรหน่วยความจำมีจำกัด pm = ondemand เพื่อประหยัดทรัพยากร
แนะนำให้ dynamicและเพิ่มประสิทธิภาพ 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 ตามการกำหนดค่า VPS
ตัวอย่างการตั้งค่า VPS:
- รายละเอียด: VPS 3 NVMe
- เนื้อที่ดิสก์: 300 GB
- จำนวนคอร์ CPU: 8
- RAM: 24 GB
ขึ้นอยู่กับการตั้งค่า VPS ของคุณ (ซีพียู 8 คอร์, แรม 24 GBทรัพยากรเซิร์ฟเวอร์ของคุณมีเหลือเฟือ สำหรับ PHP-FPM หน่วยความจำ 24 GB ช่วยให้คุณสามารถกำหนดค่ากระบวนการทำงานพร้อมกันได้จำนวนมาก
ในสภาพแวดล้อมการใช้งานจริง เรามักจะจัดเตรียมระบบและฐานข้อมูล Apache (เช่น...) ให้เอง MySQL/MariaDB) และแคช (เช่น Redis/memcachedเว้นพื้นที่หน่วยความจำให้เพียงพอ (เช่น 8-12GB) ส่วนที่เหลือ... แรม 12GB-16GBสามารถมอบหมายงานนี้ให้กับ PHP-FPM ได้อย่างสมบูรณ์
อ้างอิงจากการใช้งานเฉลี่ยต่อกระบวนการ PHP 40เมกะไบต์ – 60เมกะไบต์ ในแง่ของการใช้งานหน่วยความจำ หน่วยความจำ 1GB สามารถรองรับการทำงานได้ประมาณ 16-25 กระบวนการ
ข้อมูลต่อไปนี้ได้รับการจัดทำขึ้นเป็นพิเศษสำหรับคุณการกำหนดค่า FPM ที่รองรับการทำงานพร้อมกันสูงและประสิทธิภาพสูงมันสามารถปรับปรุงได้อย่างมาก WordPress ระบบนี้มีศักยภาพในการรองรับปริมาณการใช้งานที่หนาแน่น และสามารถป้องกันปริมาณการใช้งานที่เพิ่มขึ้นอย่างฉับพลันซึ่งอาจทำให้ระบบล่มได้
pm = dynamic
; 允许的最大 PHP 进程数(12GB 内存 / 40MB ≈ 300)
; 8核CPU搭配300个进程,可以轻松应对极高并发,且不至于让内存溢出
pm.max_children = 300
; 启动时创建的初始进程数(CPU核心数 * 4)
pm.start_servers = 32
; 维持的最小空闲进程数(服务器空闲时保留的进程,保证随时响应)
pm.min_spare_servers = 16
; 维持的最大空闲进程数(超过这个数量的空闲进程会被释放)
pm.max_spare_servers = 64
; 每个进程处理1000个请求后自动重启,高配置服务器可适当调大,有效防止WP插件内存泄露
pm.max_requests = 1000
; 单个请求最大执行时间,超时60秒强杀,防止死锁卡死
request_terminate_timeout = 60s
; 慢日志路径及触发阈值(请求超过5秒则记录,用于排查性能瓶颈)
slowlog = /var/log/php8.4-fpm.log.slow
request_slowlog_timeout = 5s
💡 ทำไมถึงใช้การตั้งค่าแบบนี้?
pm.max_children = 300นี่คือการปรับปรุงประสิทธิภาพหลัก การตั้งค่าเดิมของคุณที่ 50 กระบวนการนั้นน้อยเกินไปสำหรับหน่วยความจำ 24GB เมื่อเจอกับปริมาณการใช้งานที่เพิ่มขึ้นอย่างกะทันหัน (หรือบอทจำนวนมากที่ทำงานอยู่เบื้องหลัง) 50 กระบวนการจะรับมือไม่ไหวทันที ทำให้เกิดการหมดเวลาการเชื่อมต่อ การเพิ่มเป็น 300 จะช่วยเพิ่มความสามารถในการประมวลผลพร้อมกันของเซิร์ฟเวอร์ของคุณได้หลายเท่าpm.start_servers/ `min_spare_serversเนื่องจากคุณมีซีพียู 8 คอร์ คุณจึงสามารถคงกระบวนการที่ไม่ได้ใช้งานไว้ได้มากขึ้นในตอนเริ่มต้นและโดยปกติ โดยใช้ประโยชน์จากข้อดีของมัลติคอร์เพื่อให้สามารถเปิดคำขอใหม่ได้ทันทีโดยไม่ต้องรอการสร้างกระบวนการpm.max_requests = 1000เพิ่มจาก 500 เป็น 1000 หน่วยความจำของคุณมีขนาดใหญ่ และไม่จำเป็นต้องรีสตาร์ทกระบวนการบ่อยๆ การเพิ่มเป็น 1000 จะช่วยลดการใช้ CPU ที่เกิดจากการทำลายและสร้างกระบวนการบ่อยครั้งได้
หลังจากทำการเปลี่ยนแปลงแล้ว อย่าลืมรีสตาร์ทบริการ PHP-FPM เพื่อให้การเปลี่ยนแปลงมีผล
systemctl restart php8.5-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.5-fpm restart
จะเกิดอะไรขึ้นถ้าปัญหายังคงมีอยู่? เพิ่มประสิทธิภาพเพิ่มเติม!
หากคุณยังคงปฏิบัติตามการเพิ่มประสิทธิภาพข้างต้นบางครั้งเกิดข้อผิดพลาด 500 ครั้งคุณสามารถดำเนินการต่อด้วยการปรับแต่งต่อไปนี้:
1. เปิดใช้งาน OPcache เพื่อปรับปรุงประสิทธิภาพการทำงานของ PHP
หากยังไม่ได้เปิดใช้งาน OPcache คุณสามารถติดตั้งได้ดังนี้ (โดยใช้ Ubuntu เป็นตัวอย่าง):
sudo apt install php8.5-opcache -y
แล้วแก้ไข php.ini:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.validate_timestamps=0
- opcache.validate_timestamps=0
- ปิดใช้งานการตรวจจับแบบเรียลไทม์ลดปริมาณการอ่านเขียนไฟล์และเพิ่มประสิทธิภาพการทำงาน
อย่างไรก็ตาม นั่นหมายความว่าคุณต้องล้างแคชด้วยตนเอง (รีสตาร์ทบริการ PHP) หลังจากแก้ไขไฟล์ PHP เสร็จแล้ว
หลังจากแก้ไขการตั้งค่าแล้ว คุณต้องรีสตาร์ทบริการ PHP เพื่อให้การเปลี่ยนแปลงมีผล
sudo systemctl restart php<版本>-fpmผล? ความเร็วในการดำเนินการหน้า 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
