nginx本身不支持在server块中直接用shell时间变量(如$date)动态生成带年月日的日志文件名,生产环境通用做法是使用logrotate进行日志切割:通过宝塔面板启用内置日志切割(最简),或手动配置/etc/logrotate.d/下的规则,配合kill -usr1通知nginx reopen日志文件,实现按天归档、压缩与保留策略。

Nginx 本身不支持在 server 块中直接按日期动态生成带年月日的文件名(比如 access_20260729.log),因为 $date 这类 shell 时间变量在 Nginx 配置里不可用。真正可靠、生产环境通用的做法是:用 logrotate 管理切割 + 正确配置 Nginx 日志路径 + 合理触发 reload,而不是硬改 Nginx 配置去“模拟”日期分割。
下面分三块说清楚怎么做:
启用宝塔面板内置日志切割(最简方式)
- 进入宝塔「网站」列表 → 找到目标站点 → 点击「设置」→ 切换到「日志」选项卡
- 勾选「启用日志切割」,周期选「每天」→ 保存
- 宝塔会自动:
- 在
/www/server/panel/vhost/logrotate/下为该站点生成专属配置 - 添加计划任务,每天凌晨执行
logrotate -f - 设置好权限、压缩、保留天数(默认通常保留30天)
- 在
这个方式零配置、少出错,适合绝大多数站点。
手动配置 logrotate 实现精细控制
如果需要自定义保留天数、压缩方式或同时处理多个日志文件(如 access.log 和 error.log),可手动编辑配置:
- 编辑或新建文件:
/etc/logrotate.d/example.com(文件名随意,但建议与域名一致) - 内容示例:
/www/wwwroot/example.com/logs/access.log /www/wwwroot/example.com/logs/error.log { daily missingok rotate 365 compress delaycompress notifempty create 644 www www sharedscripts postrotate if [ -f /www/server/nginx/logs/nginx.pid ]; then kill -USR1 $(cat /www/server/nginx/logs/nginx.pid) fi endscript } - 关键点说明:
-
rotate 365表示最多保留365个归档文件(不是365天,而是365份) -
postrotate中的kill -USR1是通知 Nginx 关闭旧日志、新建日志的关键步骤 -
sharedscripts保证多文件匹配时postrotate只执行一次,避免重复 reload
-
验证与排查常见问题
- 手动触发一次测试:
/usr/sbin/logrotate -f /etc/logrotate.d/example.com
- 检查结果:
- 日志目录下应出现
access.log-20260729.gz类似文件 - 原
access.log应变为空文件(说明 Nginx 已 reopen)
- 日志目录下应出现
- 常见失败原因:
-
nginx.pid路径不对 → 查看/www/server/nginx/conf/nginx.conf中pid指令实际路径 - 权限不足 → 确保 logrotate 进程能读取
.pid文件、能写入日志目录 -
www用户对/www/wwwroot/example.com/logs/没有写权限 → 用宝塔文件管理器设为www:www,644 或 755
-
不复杂但容易忽略的是:logrotate 不是“重命名日志”,而是“移动+通知Nginx新建”。只要 postrotate 里的 reload 成功,后续写入就自然进新文件了。











