好的宝安网站建设,如何搭建公司官网,郑州网站排,做网络推广选择哪个网站好前言#xff1a;nginx采用docker部署#xff0c;简单方便#xff0c;但出现一个问题#xff0c;就是日志没有自动切割#xff0c;导致access.log 无限增大。如果非docker安装#xff0c;则nginx的日志默认有切割的#xff0c;那docker为何没有呢#xff0c;最后发现nginx采用docker部署简单方便但出现一个问题就是日志没有自动切割导致access.log 无限增大。如果非docker安装则nginx的日志默认有切割的那docker为何没有呢最后发现nginx容器里面没有 logrotate 服务logrotate: command not found
服务器环境centos 7 nginx的docker运行命令
docker run -d --name nginx --restart always --net host -v /opt/common/nginx/nginx.conf:/etc/nginx/nginx.conf -v /opt/common/nginx/html:/usr/share/nginx/html -v /opt/common/nginx/logs:/var/log/nginx -v /opt/common/nginx/conf.d:/etc/nginx/conf.d -e TZAsia/Shanghai nginx:1.24.0其中服务器本地日志映射目录是 /opt/common/nginx/logs
以下搜集了几种日志切割方式
1 nginx配置map日期2 脚本切割3 配置 logrotate
1 nginx配置map日期
在 nginx/conf.d 目录下新建 logdate.conf 文件nginx重启会自动加载的 内容是
map $time_iso8601 $logdate {default date-not-found;~^(?ymd\d{4}-\d{2}-\d{2}) $ymd;
}然后在 nginx.conf 的日志配置如下
access_log /var/log/nginx/access-$logdate.log main;原来的默认配置是 access_log /var/log/nginx/access.log main;
这时到了第二天就会自动生成新的log文件 注意映射出来的存log的文件夹logs需要配一下权限因为nginx要创建文件需要权限 例如赋给nginx权限 chown -R nginx:nginx logs 生成之后文件长这样
该方法是按每天归整缺点是每次打日志会走map一次日期会牺牲一点点性能此外定期清理日志需要再额外写个清理脚本只保留N天腾出存储空间切割日志目的之一就是为了方便清理日志
2 脚本切割
该方法是写个脚本定时凌晨12点将日志切割归档这个方法相对比较简单
#!/bin/bash
LOGS_PATH$1
DAYS$2
YESTERDAY$(date -d yesterday %Y-%m-%d)
#按天切割日志
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
#向 Nginx 主进程发送 USR1 信号重新打开日志文件否则会继续往mv后的文件写内容导致切割失败.
kill -USR1 ps axu | grep nginx: master process | grep -v grep | awk {print $2}
#删除配置的N天前的日志
cd ${LOGS_PATH}
find . -mtime ${DAYS} -name *20[1-9][3-9]* | xargs rm -f
exit 0将该脚本保存到 cut_nginx_log.sh找个地方放例如放在 /opt/common/nginx/logs/cut_nginx_log.sh
给该文件增加执行权限 chmod x /opt/common/nginx/logs/cut_nginx_log.sh
然后编辑定时任务: crontab -e
编辑写入
01 00 * * * /opt/common/nginx/logs/cut_nginx_log.sh /opt/common/nginx/logs/ 120这个定时任务是每天凌晨01秒开始执行该脚本脚本第一个参数 /opt/common/nginx/logs/ 表示日志的目录第二个参数120表示日志保留120天即清理120天之前的日志
这个方法是切割与定期清理一起比较简单方便
3 配置 logrotate
既然nginx容器里面的 logrotate 服务不可用那么就利用docker宿主机的 logrotate 服务这个服务是 centos7 默认安装的即利用服务器本地的 logrotate。 将以下脚本保存在 /etc/logrotate.d/nginx vi /etc/logrotate.d/nginx然后将以下脚本复制进去
/opt/common/nginx/logs/*.log {dailymissingokrotate 52compressdelaycompressnotifemptycreate 640 nginx admsharedscriptspostrotatekill -USR1 ps axu | grep nginx: master process | grep -v grep | awk {print $2}endscript
}然后添加定时任务 echo “59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx /dev/null 21” /etc/crontab 或者执行 crontab -e 然后将以下编辑写入 59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx /dev/null 21
这个定时任务是每天23:59 开始切割并做压缩 结果是 此外error.log 也会切割其中脚本具体参数意义在此不做详述
最后总结 以上三种脚本方式是比较简单可根据情况进行配置选其一即可