怎样压缩Nginx日志文件大小
Nginx日志文件可能快速占用大量磁盘空间。可通过logrotate工具实现每日自动轮转和gzip压缩,保留最近7天日志;也可手动压缩并创建符号链接;或降低日志级别减少输出。这些方法能有效控制日志文件大小。
Nginx 跑久了,日志文件难免越积越厚。别看 access.log 和 error.log 平时不起眼,一旦服务器流量上来,几天不清理,几十个 GB 的磁盘空间说没就没。所以,压缩日志这事儿,其实是个基本功。

1. 使用 logrotate 工具
logrotate 几乎是 Linux 系统上日志管理的标配工具,专门用来自动压缩、轮转、删除老日志。配置起来也不复杂,几步就能搞定。
配置 logrotate
先创建或编辑 Nginx 的日志轮转配置文件:
sudo nano /etc/logrotate.d/nginx然后把下面这段配置贴进去:
/var/log/nginx/*.log { daily missingok rotate 7 compress notifempty create 0640 www-data adm sharedscripts postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript }这里简单解释一下几个关键参数:
daily表示每天轮转一次;rotate 7保留最近 7 天的日志,超过的自动删除;compress就是压缩旧日志,默认用 gzip;notifempty表示如果日志文件是空的,就不轮转,避免白费力气;create 0640 www-data adm指定新日志文件的权限和属主。postrotate里的脚本会在轮转完成后向 Nginx 主进程发送USR1信号,让它重新打开新的日志文件继续写。
配置写完后,可以用以下命令测试一下,确保没语法错误:
sudo logrotate -f /etc/logrotate.d/nginx加上
-f参数会强制轮转一次,方便验证效果。
2. 手动压缩日志文件
如果你不想依赖自动工具,或者只是临时处理一下,手动压缩也完全可以。
压缩日志文件
sudo gzip /var/log/nginx/access.log
sudo gzip /var/log/nginx/error.log创建符号链接
直接压缩后,Nginx 会找不到原来的日志文件,所以需要先重命名原文件,再创建一个符号链接指向压缩后的文件,这样 Nginx 才能继续正常写入。
sudo mv /var/log/nginx/access.log /var/log/nginx/access.log.1
sudo ln -s /var/log/nginx/access.log.1.gz /var/log/nginx/access.log
sudo mv /var/log/nginx/error.log /var/log/nginx/error.log.1
sudo ln -s /var/log/nginx/error.log.1.gz /var/log/nginx/error.log注意:符号链接指向的是压缩后的 .gz 文件,Nginx 写日志时会通过链接直接写入该文件(内容会被追加到压缩包内,但实际写入的是未压缩的流,这个机制比较特殊,不过大多数场景下够用)。更稳妥的做法还是用 logrotate 的 compress 选项,它内部处理得更好。
3. 调整日志级别
如果日志文件实在太大,而且很多内容其实没必要记录,可以降低日志级别。比如,把 info 改成 warn 或 error,就能大幅减少输出量。
修改配置文件
编辑 Nginx 主配置文件 /etc/nginx/nginx.conf 或某个站点的配置,找到 http 块里的 log_level 设置:
http {
log_level info;
# 可以改为 notice, warn, error 等...
}重新加载配置
sudo nginx -s reload改完之后记得重新加载,不用重启服务。
4. 使用日志分割工具
除了 logrotate,还有一些更专业的日志管理工具,比如 rsyslog 和 fluentd。它们不仅能做压缩和轮转,还能做集中收集、过滤、转发等高级功能。如果你的服务器集群规模较大,或者日志需要汇总分析,可以考虑引入这类工具。但对大多数单机场景来说,logrotate 已经足够用了。
总之,压缩 Nginx 日志这件事,方法不少,核心思路就两个:一是自动轮转压缩,二是减少不必要的内容输出。选一个最适合自己维护习惯的方案就好。


































