Thư mục bài viết
Bạn đã bao giờ gặp phải tình huống này chưa? Trang web của bạn đột nhiên chậm lại, hoặc thậm chí báo lỗi 500. Khởi động lại PHP-FPM sẽ khôi phục lại bình thường , nhưng vấn đề lại xuất hiện sau một thời gian? Thật vô cùng khó chịu!
Tại sao điều này lại xảy ra? Thực tế, nguyên nhân thường là do cấu hình nhóm tiến trình PHP-FPM không chính xác hoặc tài nguyên máy chủ không đủ . Hôm nay, chúng ta sẽ tối ưu hóa triệt để PHP-FPM trên HestiaCP để đảm bảo tính ổn định vững chắc cho trang web của bạn!
Lý do cốt lõi khiến PHP-FPM bị quá tải
PHP-FPM là trình quản lý tiến trình cho PHP , chịu trách nhiệm xử lý các yêu cầu động. Cấu hình không phù hợp có thể dẫn đến:
- Tài nguyên máy chủ đã cạn kiệt, khiến PHP-FPM không thể phản hồi các yêu cầu mới một cách kịp thời;
- Quá ít quy trình, khi lưu lượng truy cập tăng đột ngột, không thể xử lý kịp thời;
- Quy trình sử dụng quá cao, khiến cho CPU phải hoạt động quá tải.

Làm sao để biết PHP-FPM có bị quá tải không?
co thể sử dụng top 或 htop Lệnh để xem mức sử dụng CPU và bộ nhớ:
top -c
Nếu bạn thấy thông tin quy trình tương tự như sau, điều đó có nghĩa là PHP-FPM đang chạy dưới tải cao:
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
Bạn có thấy các tiến trình này sử dụng hơn 70% CPU không? Nếu điều này xảy ra thường xuyên, thì chắc chắn có vấn đề với PHP-FPM của bạn!
Vậy, làm thế nào chúng ta có thể tối ưu hóa cấu hình PHP-FPM để máy chủ không còn bị quá tải?
Tối ưu hóa nhóm quy trình PHP-FPM (điều chỉnh tham số cốt lõi)
Đầu tiên, mở php-fpm Tệp cấu hình:
sudo nano /etc/php/*/fpm/pool.d/www.conf- *Đổi sang phiên bản PHP của bạn, chẳng hạn như PHP8.5, và đổi thành:
/etc/php/8.3/fpm/pool.d/www.conf
Truy vấn phiên bản PHP được thiết lập bởi HestiaCP
v-list-web-domain user domain.com
Ví dụ:
v-list-web-domain abc chenweiliang.com
Trong kết quả đầu ra, bạn sẽ thấy nội dung tương tự như sau:
PHP SUPPORT yes
PHP MODE php-fpm
PHP VERSION 8.5 Điều này cho thấy trang web sử dụng PHP 8.5.
Hãy cùng xem cấu hình PHP-FPM của bạn:
[chenweiliang.com]
listen = /run/php/php8.5-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
Bạn có thể thấy rằng pm được sử dụng là ondemand,Mặc dù có thể giảm mức sử dụng tài nguyên trong thời gian nhàn rỗi, nhưng khi lưu lượng truy cập đột nhiên tăng lên, quy trình có thể không phản hồi kịp thời., dẫn đến lỗi 500.
www.conf: "Nhóm tài nguyên chung" tích hợp sẵn của hệ thống.
Sau khi cài đặt PHP-FPM, hệ thống sẽ tự động cung cấp cho bạn... www.conf tập tin.
nó làĐịnh vịNó rất đơn giản — đó chỉ là một nhóm tiến trình mặc định hoạt động ngay lập tức, thường được gắn với... www-data Tải xuống dành cho người dùng.
Loại nhóm này đặc biệt phù hợp với môi trường đơn lẻ: cấu hình đơn giản và các tham số đều là các mẫu chung, chẳng hạn như:
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
pm.max_children = 5
Nếu bạn chỉ lưu trữ một trang web, bạn có thể sử dụng nó trực tiếp và đáng tin cậy mà không gặp bất kỳ rắc rối nào.
etufo.org.conf: Nhóm tùy chỉnh
Khi bạn điều hành nhiều trang web, bạn không thể nhốt tất cả mọi người vào cùng một nhóm được.
Tại bước này, HestiaCP sẽ tự động tạo một nhóm riêng biệt cho mỗi trang web, ví dụ... etufo.org.confChuyên về tên miền etufo.org dịch vụ.
Cách chơi phổ biến là:
- Thay đổi người dùng và nhóm:
user = etufo,group = etufo - Giám sát độc lập:
listen = /run/php/etufo.sock - Việc điều chỉnh số lượng tiến trình đảm bảo tính ổn định vững chắc ngay cả khi có nhiều truy cập đồng thời.
- Việc tách riêng các tệp nhật ký giúp việc khắc phục sự cố trở nên rõ ràng hơn.
Lợi ích rất rõ ràng: khả năng cách ly an toàn . Ngay cả khi một địa điểm bị xâm nhập, các địa điểm khác vẫn không bị ảnh hưởng.
dummy.conf: tệp giả
dummy.conf Đây thường là các ví dụ hoặc mẫu do hệ thống cung cấp.
Nó sẽ không thực sự chạy trừ khi bạn tự tay chỉnh sửa và kích hoạt nó.
Ý nghĩa của nó giống như một "sổ tay hướng dẫn vận hành", chỉ cho bạn cách viết cấu hình nhóm mới.
Tại sao phải chia bể bơi?
- 安全 性Hãy sử dụng các tài khoản người dùng khác nhau cho các trang web khác nhau để tránh xung đột quyền truy cập.
- 性能优化Số lượng quy trình có thể được điều chỉnh riêng cho từng nhóm, cho phép điều chỉnh linh hoạt dựa trên nhu cầu lưu lượng truy cập.
- Sự cách lyNhật ký, lỗi và địa chỉ lắng nghe đều được tách biệt, giúp việc khắc phục sự cố dễ dàng hơn.
Ví dụ, ngay cả khi www.conf gặp sự cố, etufo.org.conf vẫn sẽ hoạt động bình thường và không làm sập toàn bộ máy chủ.
实际场景
- Máy chủ đơn vịChỉ cần www.conf là đủ.
- Máy chủ đa trang webMỗi trang web đều có tệp .conf riêng, ví dụ như etufo.org.conf.
- dummy.confChỉ mang tính chất tham khảo, không khuyến khích sử dụng.
So sánh cấu hình
www.conf (nhóm mặc định)
[www]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
pm = dynamic
pm.max_children = 5
etufo.org.conf (Nhóm tùy chỉnh)
[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
Những điểm khác biệt chính là: danh tính người dùng, địa chỉ lắng nghe và số lượng tiến trình.
1. Điều chỉnh các tham số nhóm quy trình PHP-FPM
Nếu cấu hình sử dụng dynamicĐây là phương pháp khởi động trước một số quy trình công việc và điều chỉnh chúng một cách linh hoạt theo khối lượng yêu cầu, có thể phản hồi nhanh hơn khi khối lượng yêu cầu tăng đột ngột.
Đối với các trang web có lượng truy cập nhất định, nên sử dụng pm = dynamicBởi vì nó có thể duy trì một lượng tiến trình nhàn rỗi nhất định và tránh 500 lỗi trong quá trình đồng thời cao.
Chỉ nên sử dụng tính năng này khi dung lượng truy cập cực thấp và tài nguyên bộ nhớ eo hẹp. pm = ondemand Để tiết kiệm tài nguyên.
Đề nghị để dynamicvà tối ưu hóa pm.max_children Và các thông số khác:
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 后自动退出
Tại sao bạn lại muốn thay đổi như thế này?
pm = dynamic: Phân bổ các quy trình linh hoạt hơn để tránh tình trạng chờ yêu cầu có thể xảy ra do theo yêu cầu;pm.max_children = 16: Ngăn ngừa 500 lỗi do quá ít quy trình gây ra;pm.start_servers = 5: Tránh khởi động tiến trình chậm;pm.max_requests = 3000:Ngăn chặn rò rỉ bộ nhớ, tái chế quy trình thường xuyên.
2. Giới hạn thời gian thực hiện các tập lệnh PHP để tránh tình trạng chiếm dụng lâu dài
request_terminate_timeout = 30s ; 超过 30s 的 PHP 脚本自动终止
php_admin_value[memory_limit] = 128M ; 限制 PHP 进程最大内存占用
Điều này giúp ngăn chặn một số tập lệnh PHP tiêu tốn quá nhiều CPU gây ra sự cố sập máy chủ.
Sau khi lưu, hãy khởi động lại tiến trình PHP:
sudo systemctl restart php8.3-fpmTối ưu hóa PHP-FPM dựa trên cấu hình VPS.
Ví dụ về cấu hình VPS:
- Mô tả: VPS 3 NVMe
- Dung lượng đĩa: 300 GB
- Số lõi CPU: 8
- RAM: 24 GB
Dựa trên cấu hình VPS của bạn ( 8 lõi CPU, 24 GB RAM ), tài nguyên máy chủ của bạn là quá đủ. Đối với PHP-FPM, 24 GB RAM cho phép bạn cấu hình một số lượng lớn các tiến trình đồng thời.
Trong môi trường sản xuất, chúng ta thường phân bổ đủ bộ nhớ (khoảng 8GB-12GB) cho hệ thống, cơ sở dữ liệu Apache (như MySQL /MariaDB) và bộ nhớ đệm (như Redis / Memcached ), để lại 12GB-16GB bộ nhớ còn lại dành hoàn toàn cho PHP-FPM.
Dựa trên mức sử dụng bộ nhớ trung bình từ 40MB đến 60MB cho mỗi tiến trình PHP , 1GB bộ nhớ có thể chạy khoảng 16-25 tiến trình.
Sau đây là cấu hình FPM hiệu năng cao, hỗ trợ đồng thời nhiều truy cập , được thiết kế riêng cho bạn , giúp cải thiện đáng kể khả năng của WordPress và ngăn ngừa tình trạng sập hệ thống do lưu lượng truy cập tăng đột biến:
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.5-fpm.log.slow
request_slowlog_timeout = 5s
💡 Tại sao lại chọn cấu hình này?
pm.max_children = 300Đây là một tối ưu hóa cốt lõi. Cấu hình 50 tiến trình trước đây của bạn quá thận trọng đối với 24GB bộ nhớ. Khi gặp phải sự tăng đột biến về lưu lượng truy cập (hoặc các bot tràn ngập nền), 50 tiến trình sẽ ngay lập tức bị quá tải, gây ra lỗi hết thời gian chờ kết nối. Tăng lên 300 có thể cải thiện khả năng xử lý đồng thời của máy chủ lên nhiều lần.pm.start_servers/ `min_spare_serversVì bạn có 8 lõi CPU, ban đầu bạn có thể duy trì nhiều tiến trình nhàn rỗi hơn, điều này cho phép bạn tận dụng lợi thế của đa lõi để các yêu cầu mới có thể được mở ngay lập tức mà không cần chờ tạo tiến trình.pm.max_requests = 1000Hãy tăng từ 500 lên 1000. Bộ nhớ của bạn lớn và các tiến trình không cần phải khởi động lại thường xuyên. Tăng lên 1000 có thể giảm mức tiêu thụ CPU do việc hủy và tạo tiến trình thường xuyên gây ra.
Xem nhật ký hoạt động chậm:
tail -f /var/log/php8.5-fpm.log.slowtail -f /var/log/php8.4-fpm.log.slow
Sau khi thực hiện các thay đổi, hãy nhớ khởi động lại dịch vụ PHP-FPM để các thay đổi có hiệu lực.
systemctl restart php8.5-fpmBật chức năng giám sát trạng thái PHP-FPM để theo dõi tiến trình bất cứ lúc nào
Việc kích hoạt tính năng giám sát tiến trình PHP-FPM cho phép bạn xem số lượng tiến trình đang hoạt động và trạng thái chờ yêu cầu bất cứ lúc nào , giúp ngăn ngừa tình trạng quá tải máy chủ.
在 php-fpm.conf Đã thêm vào:
pm.status_path = /status
Sau đó, cấu hình 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;
}
Bằng cách này, bạn có thể http://yourdomain.com/status Hãy xem PHP-FPM hoạt động như thế nào!
Tối ưu hóa nhật ký PHP-FPM để nhanh chóng khắc phục sự cố
在 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 的脚本记录到日志
Theo cách này, bất cứ khi nào lỗi 500 xảy ra, bạn có thể trực tiếp xem nhật ký:
tail -f /var/log/php-fpm/error.log
Xem PHP có báo lỗi không, chẳng hạn như out of memory,script execution timeout Chờ đợi.
Khởi động lại PHP-FPM thường xuyên để tránh rò rỉ bộ nhớ
có thể vượt qua cron Khởi động lại PHP-FPM thường xuyên để ngăn chặn các tiến trình chạy lâu gây raRò rỉ bộ nhớ.
crontab -e
Thêm tác vụ theo lịch trình sau để tự động khởi động lại PHP-FPM lúc 3 giờ sáng hàng ngày:
0 3 * * * /usr/sbin/service php8.5-fpm restart
Nếu vấn đề vẫn tiếp diễn thì sao? Tối ưu hóa hơn nữa!
Nếu sau khi thực hiện các tối ưu hóa trên mà bạn vẫn thỉnh thoảng gặp lỗi 500 , bạn có thể tiếp tục với các tối ưu hóa sau:
1. Bật OPcache để cải thiện hiệu quả thực thi PHP
Nếu OPcache chưa được bật, bạn có thể cài đặt nó như thế này (ví dụ sử dụng Ubuntu):
sudo apt install php8.5-opcache -y
Sau đó chỉnh sửa php.ini:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.validate_timestamps=0
- opcache.validate_timestamps=0
- Tắt tính năng phát hiện thời gian thựcGiảm thiểu thao tác đọc/ghi dữ liệu trên hệ thống tập tin và cải thiện hiệu năng.
Tuy nhiên, điều này có nghĩa là bạn phải tự tay xóa bộ nhớ cache (khởi động lại dịch vụ PHP) sau khi chỉnh sửa các tệp PHP.
Sau khi sửa đổi cấu hình, bạn phải khởi động lại dịch vụ PHP để các thay đổi có hiệu lực.
sudo systemctl restart php<版本>-fpmTác dụng? Tốc độ thực thi trang PHP đã được cải thiện đáng kể!
2. Tối ưu hóa cấu hình Nginx
Đảm bảo rằng các tham số liên quan đến Nginx là hợp lý, chẳng hạn như fastcgi_read_timeout Điều chỉnh phù hợp để tránh việc các tập lệnh PHP bị Nginx chấm dứt do thời gian thực thi quá dài:
fastcgi_read_timeout 60s;
client_max_body_size 100M;
Tóm tắt: Tối ưu hóa PHP-FPM và trang web sẽ không còn bị sập nữa!
Chúng tôi đã thực hiện những điều chỉnh nào sau khi tối ưu hóa này?
✅ Tối ưu hóa nhóm quy trình PHP-FPM,sử dụng ondemandVà tối ưu hóa pm.max_children tham số;
✅ Giới hạn thời gian thực thi của các tập lệnh PHP, để ngăn chặn việc chiếm dụng CPU trong thời gian dài;
✅ Bật giám sát PHP-FPM, xem tiến trình tải theo thời gian thực;
✅ Tối ưu hóa nhật ký PHP-FPM, nhanh chóng khắc phục 500 lỗi;
✅ Khởi động lại PHP-FPM thường xuyên, ngăn chặn rò rỉ bộ nhớ;
✅ Bật OPcache, cải thiện hiệu quả thực thi PHP;
✅ Tối ưu hóa cấu hình Nginx, để tránh vấn đề hết thời gian.
Sau khi tối ưu hóa, tải PHP-FPM sẽ giảm đáng kể và hoạt động của trang web sẽ ổn định hơn! 🔥
Hãy thử ngay nhé! 💪🚀
Nếu bạn vẫn muốn tìm hiểu thêm về cách tùy chỉnh các mẫu PHP-FPM với HestiaCP, thì bài viết này sẽ giúp bạn hiểu rõ hơn:
👉 Mẫu PHP-FPM tùy chỉnh của HestiaCP: Bí quyết tối ưu hóa hiệu năng PHP 8.5 ▼
Trong nội dung này, bạn sẽ thấy:
- Các kỹ thuật tối ưu hóa xử lý đồng thời cao: Làm thế nào để cải thiện tốc độ phản hồi thông qua cấu hình quy trình hợp lý.
- Giải pháp cách ly bảo mật: Tránh rủi ro truy cập chéo giữa các trang web và đảm bảo tính ổn định của tài khoản.
- Nhật ký và giám sát: Sử dụng nhật ký chậm để xác định các điểm nghẽn và liên tục tối ưu hóa hiệu suất trang web.
Hi vọng bài viết "HestiaCP PHP-FPM Overload? Dynamic Webpage 500 Error? This Optimization Method Will Show Immediate Results!" được chia sẻ trên blog của Chen Weiliang ( https://www.chenweiliang.com/ ) sẽ hữu ích cho bạn.
Bạn có thể thoải mái chia sẻ liên kết bài viết này: https://www.chenweiliang.com/cwl-32512.html

