windows版nginx不支持动态日志文件名(如含$time_iso8601),因windows路径禁用冒号等字符,且nginx.conf中使用变量会导致启动报错;必须用bat脚本+计划任务实现:每日00:01强制终止nginx、移动日志至cut_log目录并按日期归档、再重启nginx,且任务需以system身份、最高权限、无论用户是否登录均运行。

Windows 7 下用 Nginx + PHP 搭建环境时,access.log 和 error.log 不会自动按天切分,日志越滚越大,查问题越来越慢——这不是配置错,是 Windows 版 Nginx 本身就不支持 logrotate 或 ngx_http_log_module 的时间变量切割(如 $time_iso8601 在 Windows 文件名中非法),必须靠外部脚本+计划任务实现。
为什么直接改 nginx.conf 的 log_format + access_log 不行
你在 nginx.conf 里写 access_log logs/access-$time_iso8601.log main;,Nginx 启动会直接报错:invalid number of arguments in "access_log" directive。Windows 文件系统不接受 :、/、? 等字符,而 $time_iso8601 输出形如 2026-10-09T16:10:22+08:00,其中的冒号和加号在路径中非法。Nginx 在 Windows 下只允许静态文件名或极简变量(如 $pid),不支持运行时动态生成带时间戳的文件路径。
用 bat 脚本 + taskkill 实现安全日志切割
核心逻辑是:停 Nginx → 移动当前日志 → 重启 Nginx。关键点不是“能不能切”,而是“切的时候不能丢日志”。以下脚本已验证兼容 Win7 SP1:
-
taskkill /F /IM nginx.exe必须加/F强制终止,否则子进程残留导致后续启动失败 -
move命令前要加> nul屏蔽“文件不存在”提示,避免计划任务误判失败 - 日期变量用
%date:~0,4%-%date:~5,2%-%date:~8,2%,避开 Win7 默认日期格式可能含空格的问题(如2026/10/09或星期五 2026/10/09) - 移动后立即
start nginx.exe,不要用nginx -s reload—— 它在 Windows 下不可靠,容易卡住
示例 cut_logs.bat 内容:
@echo off set nginx_dir=C:\nginx set log_dir=%nginx_dir%\logs set cut_dir=%nginx_dir%\logs\cut_log set today=%date:~0,4%-%date:~5,2%-%date:~8,2% if not exist "%cut_dir%" mkdir "%cut_dir%" taskkill /F /IM nginx.exe > nul move "%log_dir%\access.log" "%cut_dir%\access-%today%.log" > nul move "%log_dir%\error.log" "%cut_dir%\error-%today%.log" > nul start "%nginx_dir%\nginx.exe"
计划任务必须设为“不管用户是否登录都运行”
Win7 默认计划任务以交互式用户身份运行,一旦注销,bat 就停止执行。常见现象是:手动双击 cut_logs.bat 成功,但计划任务到点没反应。解决方法:
- 在“创建基本任务”向导最后一步,勾选
Run whether user is logged on or not - 点“更改用户或组” → 输入
SYSTEM→ 确定(避免密码过期导致任务失效) - 属性页中勾选
Run with highest privileges,否则taskkill可能无权限杀掉 nginx 进程 - 触发器设为每天凌晨 00:01,避开系统维护高峰
注意:start nginx.exe 启动后,Nginx 默认以控制台窗口形式运行;若希望后台静默,需额外用 start /b 或配合 RunHiddenConsole,但日志切割脚本本身无需隐藏——它执行完就退出。
PHP 进程干扰日志切割的风险点
如果你同时用 php-cgi.exe -b 127.0.0.1:9000 启动了 PHP,且未用 RunHiddenConsole 包裹,那么双击 cut_logs.bat 时,CMD 窗口会等待所有子进程结束才关闭。而 php-cgi.exe 是长驻进程,会导致脚本卡在 start nginx.exe 后无法退出,进而阻塞下一次计划任务。实际排查时,打开任务管理器看是否有多个 cmd.exe 占着 CPU 却无输出——这就是典型卡死表现。解决方案只有两个:要么在 PHP 启动脚本里强制用 RunHiddenConsole,要么把 PHP-CGI 也纳入同一体系用服务方式管理(如 NSSM)。单纯靠 kill php-cgi 并不安全,可能中断正在处理的请求。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











