对于个人站长来说,VPS或公有云虚拟机最大的风险之一就是磁盘被意外占满。其中,网站访问日志和错误日志(如Nginx/Apache logs)是无声的磁盘杀手。如果不对它们进行管理,运行一个月甚至更短时间,就可能导致磁盘100%占用,服务立即宕机。要彻底根除这个低级错误,我们必须使用Linux系统自带的专业工具:logrotate。
什么是Logrotate?
logrotate 是一个用于自动管理系统日志文件的工具,它可以实现日志文件的轮转(Rotation)、压缩(Compression)、删除(Removal)和邮件发送。在大多数Linux发行版(如CentOS, Ubuntu)上,logrotate 都是默认安装且通过 cron 定时运行的。
第一步:诊断磁盘空间(如果已经出问题)
首先,你需要快速检查当前磁盘的占用情况,并定位大文件。
# 检查总体磁盘使用情况
df -h
# 检查 /var/log 目录下哪个文件夹最大(以Nginx为例)
du -sh /var/log/* | sort -rh | head
如果发现 /var/log/nginx 或 /var/log/apache2 占据了惊人的空间,那么日志轮转配置缺失就是罪魁祸首。
第二步:配置 Logrotate for Web Logs
Logrotate的配置通常位于 /etc/logrotate.conf 和 /etc/logrotate.d/ 目录。我们应该在 /etc/logrotate.d/ 中为特定应用创建独立的配置文件,这样便于管理。
假设我们要为Nginx的日志 /var/log/nginx/*.log 创建配置。
- 创建配置文件:
sudo nano /etc/logrotate.d/nginx
- 粘贴以下配置:
这个配置的含义是:每天轮转一次,保留最近7天的日志,使用 gzip 压缩旧日志,并在轮转后通知Nginx重新打开日志文件。
/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
# 通知 Nginx 主进程重新加载日志文件
# 如果是 Apache,命令应为: service apache2 reload
if [ -f /var/run/nginx.pid ]; then
kill -USR1 **cat /var/run/nginx.pid**
fi
endscript
}
关键参数解释:
- daily: 每天执行一次轮转。
- rotate 7: 保留最近 7 个日志文件(7天)。
- compress: 轮转后,立即对旧文件进行 gzip 压缩。
- postrotate / endscript: 在日志轮转完成后执行的脚本。对于Web服务器,这一步至关重要,它确保服务器关闭旧的日志文件句柄并开始写入新的文件,否则日志仍会写入旧文件中。
第三步:手动测试配置
配置完成后,我们应该使用调试模式运行 logrotate 来确认配置没有语法错误,并且能够正常执行。
# -d 参数用于调试模式,它只会打印将要执行的操作,不会真正修改文件
sudo logrotate -d /etc/logrotate.d/nginx
# -f 参数强制执行轮转(不考虑时间间隔),用于首次部署后立即清理
sudo logrotate -f /etc/logrotate.d/nginx
执行强制轮转后,您应该会看到原始日志文件(如 access.log)被替换成一个小的空文件,而旧的日志文件则被重命名并压缩(如 access.log.1.gz)。
总结
logrotate 是 VPS 管理中最基础、最关键的防御措施之一。一旦配置正确,系统将自动且静默地管理日志文件,彻底避免因日志堆积而导致的磁盘空间耗尽问题。
汤不热吧