Nginx 日志轮转

在 Ubuntu 系统上,Nginx 日志不断增大(access.log / error.log) 是一个非常常见的问题。 如果不加限制,日志可能会几百 GB,占满磁盘。

如何排查、限制、自动轮转、删除旧日志


🧩 一、先确认日志路径和大小

默认情况下,Nginx 日志路径如下:

bash 复制代码
/var/log/nginx/access.log
/var/log/nginx/error.log

查看大小:

bash 复制代码
sudo du -h /var/log/nginx/*.log
复制代码

示例输出:

bash 复制代码
1.2G /var/log/nginx/access.log 500M /var/log/nginx/error.log

如果文件非常大(比如几 GB),说明日志没有被轮转。


🧰 二、检查 logrotate 是否启用

Ubuntu 系统自带 logrotate,默认会自动轮转 Nginx 日志。 配置文件在:

bash 复制代码
/etc/logrotate.d/nginx

查看内容:

bash 复制代码
cat /etc/logrotate.d/nginx

典型配置如下 👇

bash 复制代码
/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 640 www-data adm
    sharedscripts
    postrotate
        if [ -f /run/nginx.pid ]; then
            kill -USR1 `cat /run/nginx.pid`
        fi
    endscript
}

解释:

|------------|-------------------|
| 配置项 | 说明 |
| daily | 每天轮转一次 |
| rotate 14 | 保留 14 天的日志 |
| compress | 自动 gzip 压缩旧日志 |
| notifempty | 空文件不处理 |
| postrotate | 通知 Nginx 重新打开日志文件 |


🧮 三、手动测试日志轮转是否工作

运行:

bash 复制代码
sudo logrotate -f /etc/logrotate.d/nginx

执行后,你应该看到:

  • 生成了 access.log.1access.log.1.gz

  • 原始的 access.log 重新创建,文件大小变小

查看结果:

bash 复制代码
ls -lh /var/log/nginx/

⚙️ 四、如果日志没有轮转(常见原因)

|-----------------------------|---------------------------------------------|
| 原因 | 解决方案 |
| /etc/logrotate.d/nginx 文件缺失 | 重新创建(见上面的示例) |
| Nginx PID 路径不同 | 修改 postrotate 里的路径,比如 /var/run/nginx.pid |
| 权限问题 | 确保 /var/log/nginx 属于 www-data:adm 或 root 可写 |
| logrotate 服务没启用 | 查看:systemctl status logrotate.timer |

启用定时器:

复制代码

sudo systemctl enable --now logrotate.timer


🧯 五、清理旧日志(节省磁盘空间)

手动删除旧的压缩日志:

sudo find /var/log/nginx -name "*.gz" -type f -mtime +14 -delete

删除超过 14 天的日志归档。

或者彻底清空日志(危险操作前请确认):

sudo truncate -s 0 /var/log/nginx/access.log sudo truncate -s 0 /var/log/nginx/error.log


🧩 六、减少日志体积(优化写入)

如果访问量极大,可通过 Nginx 配置减少日志写入。

编辑:

sudo nano /etc/nginx/nginx.conf

找到:

access_log /var/log/nginx/access.log;

改为:

# 1️⃣ 禁止日志(不推荐生产) # access_log off; # 2️⃣ 或只记录错误级别高的日志 error_log /var/log/nginx/error.log warn;

重启 Nginx:

sudo systemctl reload nginx


📊 七、推荐最终配置模板(放在 /etc/logrotate.d/nginx

/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 640 www-data adm sharedscripts postrotate [ -f /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid` endscript }


✅ 八、总结

|----------|-----------------------------------------------------------|
| 操作 | 命令 |
| 查看日志大小 | sudo du -h /var/log/nginx/*.log |
| 手动轮转 | sudo logrotate -f /etc/logrotate.d/nginx |
| 清空日志 | sudo truncate -s 0 /var/log/nginx/access.log |
| 删除旧日志 | sudo find /var/log/nginx -name "*.gz" -mtime +14 -delete |
| 启用自动轮转服务 | sudo systemctl enable --now logrotate.timer |


相关推荐
高铭杰17 分钟前
万物皆可KV(2)SurrealDB 存储布局分析
linux·服务器
万事可爱^29 分钟前
Claude 新发布的 Opus 5,系统提示语删了 80%,半价还能逼近 Fable 5
android·服务器·数据库·人工智能·claude
Jerry小杰1 小时前
运维神器|单端口搞定多台内网SSH!frp端口复用终极教程
运维·ssh
Python私教1 小时前
Blender模型导入Godot完整教程:GLB、BLEND与继承场景怎么选
运维·godot·blender
其实防守也摸鱼1 小时前
GitHub开源项目破圈方法论:从技术自嗨到生态共赢
服务器·数据库·学习·开源·github·命令行·linux系统
爱写代码的森2 小时前
鸿蒙三方库 | harmony-utils之PasteboardUtil剪贴板数据读写详解
服务器·华为·harmonyos·鸿蒙·huawei
AOwhisky2 小时前
Linux(CentOS)系统管理入门笔记(第十二期)——系统管理工具与软件包管理(上篇):Cockpit 与 RPM 包管理
linux·运维·笔记·centos·云计算
xlq223223 小时前
高并发服务器day5
java·服务器·数据库
明日清晨3 小时前
printf(“%p\n“,&((struct A *)NULL)->m_float)的原理
linux·服务器·前端
运维大师3 小时前
【K8S 运维实战】15-链路追踪Jaeger与OTel
运维·容器·kubernetes