一台 WordPress 站点,4 核 8G,早上巡检发现根分区满,/var/log/php-fpm/www-error.log 单文件四十 G,里面九成是 Notice: Undefined index 和 Deprecated 告警,页面访问本身没问题。

一开始怀疑是「主题和插件多年没更新,同一处未定义索引每个请求都触发一次」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。error_reporting 里带着 E_NOTICE 和 E_DEPRECATED,模板里每个未定义索引都记一条。还有一种是log_errors 开着又没有轮转,所有请求往同一个文件里追加。

不容易想到的是,缓存类插件把变量拼进模板,取值路径一错就是成百上千条重复。

第一件事是看哪几类报错占了大头

awk -F: '{print $1,$2}' /var/log/php-fpm/www-error.log | sort | uniq -c | sort -rn | head

生产环境把提示级别的告警关掉

sed -i 's/^error_reporting.*/error_reporting = E_ALL \& ~E_NOTICE \& ~E_DEPRECATED \& ~E_STRICT/' /etc/php.ini && systemctl reload php-fpm

给错误日志配轮转,别再单文件无限长

printf '/var/log/php-fpm/*.log {\n  size 200M\n  rotate 5\n  compress\n  copytruncate\n}\n' > /etc/logrotate.d/php-fpm

等前面都确认过,再把当前文件清空止血

truncate -s 0 /var/log/php-fpm/www-error.log && df -h /

别只看报错消失,验证要多做一步。错误日志每小时增量降到几十 M,df 显示根分区可用空间回到二十 G 以上,页面访问与写入都正常。

这里还有个坑。关掉 Notice 只是少写日志,代码问题还在;真正要改的是模板里的未定义索引,别把告警当噪音长期忽略。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189