nginx 如何限定log文件的尺寸
要限定 Nginx 日志文件的尺寸,正确且最常用的方法并非在 Nginx 的配置文件中直接设置,因为 Nginx 本身没有提供按文件大小自动切割日志的功能。
正确的做法是使用一个名为 logrotate 的标准 Linux 工具。logrotate 是一个强大的日志管理工具,它可以根据文件大小、时间(每天、每周、每月)等策略来自动轮转、压缩和删除日志文件。
几乎所有的 Linux 发行版(包括 CentOS, Ubuntu, Debian 等)都预装了 logrotate。通过配置 logrotate,您可以实现:
- 当日志文件达到指定大小时,将其重命名。
- 创建一个新的空日志文件供 Nginx 继续写入。
- 压缩旧的日志文件以节省磁盘空间。
- 定期删除过旧的日志文件。
下面是具体的操作步骤和配置示例。
使用 logrotate 限定 Nginx 日志大小
第 1 步:创建 logrotate 配置文件
为 Nginx 创建一个专门的 logrotate 配置文件。这个文件通常放在 /etc/logrotate.d/ 目录下。如果您的系统中已经有了一个名为 nginx 的文件,可以直接修改它;如果没有,就创建一个新文件。
使用文本编辑器(如 vim 或 nano)创建文件:
1 | sudo vim /etc/logrotate.d/nginx |
第 2 步:编写配置文件内容
向该文件中添加以下内容。这是一个非常实用且通用的配置模板,您可以根据自己的需求进行调整。
1 | log*.log { |
配置参数详解
/var/log/nginx/*.log: 指定要管理的日志文件路径。*是通配符,表示匹配/var/log/nginx/目录下的所有以.log结尾的文件(例如access.log和error.log)。size 100M: 这是限定文件大小的关键指令。当日志文件大小超过 100MB 时,logrotate就会触发轮转操作。您可以将100M修改为任何您需要的大小,如500M,1G。daily: 指定轮转周期为每天。即使文件大小未达到size设定的值,logrotate每天也会检查一次。其他可用值为weekly,monthly,yearly。通常size和daily会结合使用。rotate 14: 指定保留多少个归档日志。在这个例子中,会保留14个备份。当生成第15个备份时,最旧的那个(例如access.log.15.gz)将被删除。compress: 通过gzip压缩轮转后的日志文件,节省空间。压缩后的文件通常会带有.gz后缀。delaycompress: 延迟压缩,与compress选项共用。这可以确保当天的日志文件(例如access.log.1)不会被立即压缩,方便排查问题。下次轮转时,它才会被压缩成.gz文件。missingok: 如果找不到日志文件,不要当作错误处理。notifempty: 如果日志文件是空的,则不执行轮转。create 0640 nginx adm: 创建新日志文件时所使用的权限和所有者/组。请确保这里的用户和组与 Nginx 运行用户匹配。在 Debian/Ubuntu 上可能是www-data,在 CentOS 上可能是nginx。您可以通过ps aux | grep nginx查看 Nginx 的运行用户。sharedscripts/postrotate: 这部分非常重要。postrotate块中的脚本会在所有匹配的日志都轮转完毕后执行一次。kill -USR1 $(cat /var/run/nginx.pid)命令会通知 Nginx 主进程重新打开日志文件句柄。这样,新的日志就会被写入到logrotate新创建的空日志文件中,从而实现无缝切换,避免了重启 Nginx 服务导致的中断。
第 3 步:测试和强制执行
logrotate 通常由 cron 每日自动执行,您不需要手动干预。但如果您想立即测试配置是否正确,可以使用以下命令:
调试模式(模拟执行):
这个命令会模拟执行轮转过程并显示详细输出,但不会真正修改任何文件。这是检查配置语法是否正确的最佳方式。1
sudo logrotate -d /etc/logrotate.d/nginx
强制执行模式:
这个命令会强制立即执行轮转,即使时间和大小条件不满足。1
sudo logrotate -f /etc/logrotate.d/nginx
执行后,您可以去
/var/log/nginx目录下查看是否生成了如access.log.1这样的文件。
总结
通过配置 logrotate,您可以非常灵活且可靠地管理 Nginx 的日志文件大小,防止单个日志文件无限增长耗尽磁盘空间,这是生产环境中管理 Nginx 日志的标准实践。
好的,这是一个在 CentOS 7.4 系统上运行的磁盘空间清理脚本。该脚本将帮助您查找并列出占用磁盘空间较大的文件和目录,并提供一些常见的可安全清理的目录路径建议,供您手动验证和清理。
重要提示:
- 在运行任何删除命令之前,请务ah必仔细检查列出的文件和目录,确保它们不是重要的系统文件或用户数据。
- 对于不确定的文件,建议先备份再删除。
- 建议以 root 用户身份或具有 sudo 权限的用户运行此脚本,以便全面扫描系统。
- 此脚本主要用于查找和列出文件/目录,并不会自动执行任何删除操作,以确保安全。您可以根据脚本的输出,手动执行清理命令。
磁盘空间清理脚本 (clean_disk.sh)
1 |
|
如何使用脚本
保存脚本
将上面的代码内容复制并粘贴到一个新文件中,例如clean_disk.sh。赋予执行权限
在终端中,进入到脚本所在的目录,然后运行以下命令:1
chmod +x clean_disk.sh
运行脚本
使用sudo或者以root用户身份运行脚本:1
sudo ./clean_disk.sh
或者切换到 root 用户后再执行:
1
2su -
./path/to/clean_disk.sh
脚本输出解读和后续步骤
脚本运行后,会依次输出三个部分的内容:
系统中最大的前 20 个文件:
- 关注点:重点关注后缀为
.log,.tar.gz,.zip,.bak的文件,以及一些看起来异常大的文件。 - 处理方法:
- 对于日志文件,如果您确认日志内容无用,可以直接使用
>符号清空,例如:> /var/log/some-large-log.log。这比删除文件再创建更好,可以避免因文件句柄被进程占用导致的空间不释放问题。 - 对于备份文件或压缩包,确认不再需要后,使用
rm命令删除。
- 对于日志文件,如果您确认日志内容无用,可以直接使用
- 关注点:重点关注后缀为
系统中最大的前 20 个目录:
- 关注点:这可以帮助您快速定位到哪个主目录下包含了大量数据。通常
/var(日志、缓存、数据库)、/home(用户数据)、/usr(软件安装)、/opt(第三方软件)是需要关注的重点。 处理方法:当您发现一个大目录,例如
/var/www/html,您可以使用以下命令进一步分析其子目录的大小:1
sudo du -h --max-depth=1 /var/www/html
这样逐层深入,直到找到最终占用空间的文件或目录。
- 关注点:这可以帮助您快速定位到哪个主目录下包含了大量数据。通常
疑似可以清理的大目录路径和建议:
- Systemd Journal 日志:这是 CentOS 7 中常见的日志来源,会持续增长。脚本中提供的
journalctl命令是官方推荐的安全清理方式。 - YUM 软件包缓存:每次安装或更新软件时,下载的 RPM 包会留在这里。清理缓存可以释放可观的空间,且对系统无害。
- 临时文件:
/tmp和/var/tmp中的文件理论上都可以删除,但为了防止意外中断正在运行的程序,建议只删除一段时间以前的旧文件。 - 旧的内核:每次内核更新,旧版本的内核都会保留。通常保留最新的一个和前一个作为备用即可,过多的旧内核会占用
/boot和/lib/modules的空间。package-cleanup是安全的官方清理工具。 - /var/log 目录:除了 journal 日志,许多应用(如 Nginx, Apache, MySQL等)会在这里生成自己的日志。对于轮转后(rotated)的旧日志(通常以
.1,.2.gz等结尾),可以安全删除。
- Systemd Journal 日志:这是 CentOS 7 中常见的日志来源,会持续增长。脚本中提供的
通过结合使用这个脚本和您的判断,可以安全有效地清理 CentOS 7.4 服务器上的磁盘空间。