Java基础、中级、高级、架构面试资料

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

业余杂谈 herman 2687浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

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)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

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