详解 nginx日志分割和 nginx 日志安全分割

业余杂谈 herman 159浏览
公告:“业余草”微信公众号提供免费CSDN下载服务,关注业余草微信公众号,添加作者微信:xmtxtt,发送下载链接帮助你免费下载!
本博客日IP超过1300,PV 1800 左右,急需赞助商。
打开支付宝首页搜“567452957”领红包,间接赞助博主,谢谢!

Nginx 有一个问题就是它的日志不会自动分割。所有的日志都会累积起来,导致日志文件非常的大,不是硬盘空间占满就是文件太大无法打开。因此,我们需要对 Nginx 的日志进行切割,分割成每天一个日志文件,并且要进行安全的日志分割,不能影响到 Nginx 的正常运行。

nginx 的日志分割可以分为手动分割和自动分割。所谓手动分割就是,通过命令行,自己执行命令去备份,分割日志,这种用法通常用于突发情况。自动分割 Nginx 日志,就是借助 crontab 定时认为,通过自动执行 shell 脚本去分割 Nginx 日志。

首先,我们通过 mv 命令,把日志文件移动到其他位置。

mv access.log access_bak_20190111.log
mv error.log error_bak_20190111.log

备份完成后,我们可以使用 nginx -s reopen 命令重新打开日志文件。

nginx -s reopen

或者执行 kill -USR1 $(cat /usr/local/openresty/nginx/logs/nginx.pid) 命令也可以。

kill -USR1 nginx_pid # 当前 nginx 的 pid,主进程号

需要注意的是,在没有执行 nginx -s reopen 或 kill -USR1 `cat ${pid_path}` 之前,即便已经对文件执行了 mv 命令也只是改变了文件的名称,nginx 还是会向新命名的文件 access_bak_20190111.log 中照常写入日志数据。原因在于 linux 系统中,内核是根据文件描述符来找文件的。

USR1 是自定义信号,也就是进程编写者自己确定收到这个信号该干什么。而在 nginx 中它自己编写了代码当接到 USR1 信号的时候让 nginx 重新打开日志文件(重新打开的日志就是配置文件中设置的位置和名称)。

但在每次都这样操作就显得太麻烦了,能不能每天生成一个日志文件呢?

当然可以,我们借助 shell 脚本来实现。

#!/bin/bash
#分割 nginx 日志以防止单个日志文件占用太多磁盘空间
LOGS_PATH=/usr/local/nginx/logs
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
mv ${LOGS_PATH}/error.log ${LOGS_PATH}/error_${YESTERDAY}.log
## 向 Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

然后将上面这个 xttblog_nginx_log.sh 脚本加入到 crontab 中。

vi /etc/crontab

然后输入下面的内容:

0 0 * * * root /usr/local/nginx/logs/xttblog_nginx_log.sh

然后保存,这样每天就会有一个 root 身份去执行脚本 /usr/local/nginx/logs/xttblog_nginx_log.sh,从而实现定时自动分割 Nginx 日志(包括访问日志和错误日志)。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,可以微信搜索:xmtxtt,备注:“xttblog”,添加助理微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 详解 nginx日志分割和 nginx 日志安全分割