phpenv中nginx日志必须手动隔离:在站点conf的server块内显式修改access_log和error_log路径,再为每个站点单独配置logrotate规则并启用copytruncate,否则无法分站清理。

phpEnv 的 Nginx 日志路径必须手动隔离,否则无法分站清理
phpEnv 本身不自动为每个站点生成独立日志路径,所有 vhost 默认共用 /www/wwwlogs/nginx.log 和 /www/wwwlogs/error.log。这意味着你写再多“按域名判断”的脚本,删的都是同一份文件。
真正可行的做法是:在 phpEnv 管理界面或直接编辑 /www/server/panel/vhost/nginx/ 下对应站点的 conf 文件,在 server 块内显式重写日志路径:
- 把
access_log /www/wwwlogs/nginx.log;改成access_log /www/wwwlogs/site-a.access.log; - 把
error_log /www/wwwlogs/error.log;改成error_log /www/wwwlogs/site-a.error.log; - 确保
/www/wwwlogs/目录对www用户可写(chown -R www:www /www/wwwlogs)
用 logrotate 按站点配独立配置,不是改 phpEnv 设置
phpEnv 不提供日志轮转开关,轮转必须靠系统级工具 logrotate。每个站点一份配置,放在 /etc/logrotate.d/ 下,文件名任意(如 site-a),但不能带扩展名。
示例配置 /etc/logrotate.d/site-a:
/www/wwwlogs/site-a.*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 640 www www
copytruncate
sharedscripts
postrotate
kill -USR1 $(cat /www/server/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || true
endscript
}
注意点:
-
copytruncate是关键——PHP-FPM 或 Nginx 进程无需重启,日志就能清空续写 -
create 640 www www必须写对,宝塔系默认运行用户是www,不是www-data -
postrotate里用kill -USR1通知 Nginx 重新打开日志,不是 reload(避免中断请求)
测试 logrotate 配置前先确认真实路径和权限
很多人配完发现没生效,根本原因是路径写错或权限不对。别等第二天看有没有 .1 文件,当场验证:
- 运行
sudo logrotate -d /etc/logrotate.d/site-a,检查输出中considering log file后面是不是你改过的/www/wwwlogs/site-a.access.log - 手动 touch 一个测试日志:
sudo -u www touch /www/wwwlogs/site-a.test.log && sudo chmod 640 /www/wwwlogs/site-a.test.log - 强制跑一次:
sudo logrotate -f /etc/logrotate.d/site-a,然后ls -l /www/wwwlogs/看是否生成了site-a.test.log.1,且新文件属主是www:www - 最后
sudo -u www tail -f /www/wwwlogs/site-a.test.log,确认仍有新内容写入(说明copytruncate生效、进程未断写)
PHP 应用层日志(如 ThinkPHP、Monolog)要单独处理
phpEnv 管理的是 Web 服务器日志,而 PHP 自身错误、框架日志(如 runtime/log/)由 PHP 进程直接写入,logrotate 对它们无效,除非你主动配置。
推荐做法:
- ThinkPHP:在配置中启用时间切分,比如
'time_format' => 'Ymd',配合'max_files' => 30,框架自动轮转并清理 - Monolog:用
RotatingFileHandler,设置$maxFiles = 30,它会基于文件名后缀自动归档删除 - 原生日志(
error_log()):统一重定向到文件,并在 php.ini 中设error_log = /www/wwwlogs/php-site-a.log,再给这个路径单独配一份logrotate规则
最易被忽略的是:PHP 应用日志路径若没加 copytruncate,又没配 postrotate 通知 PHP-FPM,轮转后新日志就写不进去——看起来“清理成功”,实则后续日志全部丢失。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











