原文链接:https://www.chenweiliang.com/cwl-32512.html
文章目录
你有没有遇到过这种情况?网站访问突然变慢,甚至直接 500 错误,重启 PHP-FPM 后又恢复正常,但过一段时间问题又出现?这简直让人崩溃!
为什么会这样?其实,这通常是PHP-FPM 进程池配置不合理,或者服务器资源不足导致的。今天,我们就来彻底优化 HestiaCP 下的 PHP-FPM,让网站稳如泰山!
PHP-FPM 负载过高的核心原因
PHP-FPM 是 PHP 的进程管理器,它负责处理动态请求。如果配置不合理,可能会导致:
- 服务器资源被吃光,导致 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 配置:
[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 = ondemand
,并调整相关参数; - 找到
php-fpm.conf
,修改pm = dynamic
为pm = ondemand
,这样 PHP 进程只在需要时才启动,不浪费 CPU 资源!🚀
建议改为 ondemand
,并优化 pm.max_children
等参数:
pm = ondemand
pm.max_children = 20 ; 根据服务器资源调整,建议值:CPU 核心数 × 2
pm.start_servers = 5 ; 初始进程数,建议设为 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
:更灵活地分配进程,避免 ondemand 可能导致的请求等待;pm.max_children = 20
:防止进程数过少导致 500 错误;pm.start_servers = 5
:避免进程启动过慢;pm.max_requests = 3000
:防止内存泄漏,定期回收进程。
2. 限制 PHP 脚本执行时间,防止长时间占用
request_terminate_timeout = 30s ; 超过 30s 的 PHP 脚本自动终止
php_admin_value[memory_limit] = 128M ; 限制 PHP 进程最大内存占用
这样可以防止某些占用 CPU 过高的 PHP 脚本拖垮服务器。
启用 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
添加以下定时任务,每天凌晨 3 点自动重启 PHP-FPM:
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 负载会大幅降低,网站运行会更加稳定!🔥
快去试试吧!💪🚀
欢迎转载《HestiaCP PHP-FPM 负载过高?动态网页 500 错误?这样优化立马见效!》
欢迎分享本文链接:https://www.chenweiliang.com/cwl-32512.html
网站地址:https://www.chenweiliang.com/
欲获取更多资讯内幕和秘技,欢迎进入Telegram频道:https://www.chenweiliang.com/go/tgchannel
没有评论:
发表评论