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 日志(包括访问日志和错误日志)。
: » 详解 nginx日志分割和 nginx 日志安全分割
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/252758.html