nginx日志切割推荐使用logrotate工具,需手动配置/etc/logrotate.d/nginx,匹配真实日志路径,设置daily、rotate 30、compress、create及postrotate中kill -usr1通知主进程重开日志文件,并通过logrotate -d/-f验证。

PHP框架上线后,Nginx日志会随请求量暴增而迅速膨胀,单个access.log动辄几百MB甚至数GB,导致grep慢、vim卡顿、错误排查耗时翻倍——必须在部署阶段就完成日志切割与可分析结构配置。
确认Nginx日志真实路径与权限
先别急着写脚本,很多运维踩坑就在这一步:phpEnv或源码编译的Nginx,【GUI界面修改的日志目录完全无效】。真正生效的是nginx.conf里access_log和error_log指令指定的路径。
执行命令查看当前生效配置:grep -E "access_log|error_log" /usr/local/nginx/conf/nginx.conf 或 grep -E "access_log|error_log" /phpenv/nginx/conf/nginx.conf。
若返回为空,说明使用默认路径:/usr/local/nginx/logs/access.log 和 /usr/local/nginx/logs/error.log;若返回带路径,则以该路径为准。
检查日志目录权限:ls -ld $(dirname $(grep "access_log" /usr/local/nginx/conf/nginx.conf | awk '{print $2}' | sed 's/;//')),确保nginx用户(如www-data或nobody)对该目录有写权限,否则切割后新日志无法生成。
方法一:Shell脚本切割(适合所有环境)
这一步操作起来很简单,直接把脚本丢进服务器就行,但要注意PID文件位置不统一。
用vim创建脚本:vim /usr/local/nginx/sbin/cut_nginx_log.sh。
粘贴以下内容(已适配phpEnv常见PID路径):
#!/bin/bash<br>log_path="/usr/local/nginx/logs"<br># 先尝试标准PID路径,失败则 fallback 到 phpEnv 常见路径<br>pid_path=$(if [ -f "/usr/local/nginx/logs/nginx.pid" ]; then echo "/usr/local/nginx/logs/nginx.pid"; else echo "/phpenv/nginx/logs/nginx.pid"; fi)<br>if [ ! -f "$pid_path" ]; then<br> echo "ERROR: PID file not found at $pid_path" >&2<br> exit 1<br>fi<br>yesterday=$(date -d "yesterday" +%Y-%m-%d)<br>mv "$log_path/access.log" "$log_path/access_$yesterday.log"<br>mv "$log_path/error.log" "$log_path/error_$yesterday.log"<br>kill -USR1 $(cat "$pid_path")
赋予执行权限:chmod +x /usr/local/nginx/sbin/cut_nginx_log.sh。
手动运行测试:/usr/local/nginx/sbin/cut_nginx_log.sh,然后立即执行 ls -l /usr/local/nginx/logs/,应看到 access_2026-08-05.log 类似文件,且新的 access.log 已重建并可写入。
方法二:logrotate自动管理(推荐CentOS/Ubuntu生产环境)
logrotate是系统级工具,比手写脚本更稳,尤其适合长期无人值守的PHP应用服务器。
第一步:确认logrotate已安装:which logrotate,未安装则执行 sudo yum install logrotate -y(CentOS)或 sudo apt-get install logrotate -y(Ubuntu)。
第二步:创建Nginx专属配置:sudo vim /etc/logrotate.d/nginx。
填入以下内容(关键参数已按PHP框架高并发场景优化):
/usr/local/nginx/logs/*.log {<br> daily<br> missingok<br> rotate 30<br> compress<br> delaycompress<br> notifempty<br> create 0644 nobody nobody<br> sharedscripts<br> postrotate<br> if [ -f /usr/local/nginx/logs/nginx.pid ]; then<br> kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)<br> fi<br> endscript<br>}
注意:create行中的nobody nobody需替换为你的Nginx实际运行用户和组,可通过ps aux | grep nginx | grep master查看USER列确定。
第三步:立即测试配置是否语法正确:sudo logrotate -d /etc/logrotate.d/nginx,输出末尾出现“rotating log /usr/local/nginx/logs/access.log”即成功。
第四步:强制执行一次切割验证:sudo logrotate -f /etc/logrotate.d/nginx,检查日志目录是否生成带日期后缀的旧文件,且新access.log大小为0字节。
让错误日志具备PHP框架上下文定位能力
Nginx默认错误日志只记录级别和简短信息,对Laravel/Symfony等框架的异常堆栈毫无帮助——必须启用详细错误日志并关联PHP-FPM。
编辑nginx.conf,在http块内添加或修改error_log指令:error_log /usr/local/nginx/logs/error.log warn; → 改为 error_log /usr/local/nginx/logs/error.log error;。
在对应的server块中,确保PHP-FPM fastcgi_pass后添加两行关键参数:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br>fastcgi_param REQUEST_URI $request_uri;
重启Nginx:sudo nginx -s reload。
触发一个PHP致命错误(如在index.php里写<?php undefined_function(); ?>),再查error.log,应出现类似PHP message: PHP Fatal error: Uncaught Error: Call to undefined function undefined_function()的完整报错行,含文件路径与行号。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











