京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

docker摆设nginx下日记主动切割方法实现

2024-11-4 03:36| 发布者: f5db4| 查看: 97| 评论: 0

摘要: 目录前言1 nginx配置map日期2 脚本切割3 配置 logrotate末了总结:前言 nginx采用docker摆设,简单方便,但出现一个问题,就是日记没有主动切割,导致access.log 无限增大。如果非docker安装,则nginx的日记默认有切
目录

前言

nginx采用docker摆设,简单方便,但出现一个问题,就是日记没有主动切割,导致access.log 无限增大。如果非docker安装,则nginx的日记默认有切割的,那docker为何没有呢,末了发现,nginx容器里面没有 logrotate 服务(logrotate: command not found)

服务器情况:centos 7
nginx的docker运行下令:

[code]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 TZ="Asia/Shanghai" nginx:1.24.0 [/code]

其中服务器当地日记映射目录是 /opt/common/nginx/logs

以下搜集了几种日记切割方式:

  • 1 nginx配置map日期
  • 2 脚本切割
  • 3 配置 logrotate

1 nginx配置map日期

在 nginx/conf.d 目录下,新建 logdate.conf 文件(nginx重启会主动加载的)
内容是:

[code]map $time_iso8601 $logdate { default 'date-not-found'; '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd; } [/code]

然后在 nginx.conf 的日记配置如下:

[code]access_log /var/log/nginx/access-$logdate.log main; [/code]

原来的默认配置是:

access_log /var/log/nginx/access.log main;

这时到了第二天就会主动天生新的log文件
留意:映射 出来的存log的文件夹logs必要配一下权限,因为nginx要创建文件必要权限

比方:赋给nginx权限

[code]chown -R nginx:nginx logs [/code]

天生之后,文件长这样:

在这里插入图片描述

该方法是按天天归整,缺点是每次打日记会走map一越日期,会捐躯一点点性能,别的,定期清算日记,必要再额外写个清算脚本(只生存N天,腾出存储空间),切割日记目的之一就是为了方便清算日记

2 脚本切割

该方法是写个脚本,定时凌晨12点将日记切割归档,这个方法相对比较简单

[code]#!/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 [/code]

将该脚本生存到 cut_nginx_log.sh,找个地方放,比方放在
/opt/common/nginx/logs/cut_nginx_log.sh

给该文件增长执行权限:
chmod +x /opt/common/nginx/logs/cut_nginx_log.sh

然后编辑定时任务:
crontab -e

编辑写入:

[code]01 00 * * * /opt/common/nginx/logs/cut_nginx_log.sh /opt/common/nginx/logs/ 120 [/code]

这个定时任务是,天天凌晨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,然后将以下脚本复制进去)

[code]/opt/common/nginx/logs/*.log { daily missingok rotate 52 compress delaycompress notifempty create 640 nginx adm sharedscripts postrotate kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'` endscript } [/code]

然后添加定时任务:

[code]echo “59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx >/dev/null 2>&1” > /etc/crontab [/code]

大概执行 crontab -e ,然后将以下编辑写入

[code]59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx >/dev/null 2>&1[/code]

这个定时任务是,天天23:59 开始切割,并做压缩
效果是:

在这里插入图片描述

别的,error.log 也会切割,其中脚本详细参数意义在此不做详述

末了总结:

以上三种,脚本方式是比较简单,可根据情况进行配置,选其一即可,更多干系docker nginx日记主动切割内容请搜刮脚本之家以前的文章或继续欣赏下面的干系文章希望大家以后多多支持脚本之家!


来源:https://www.jb51.net/server/328940lbr.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-1 18:49 , Processed in 0.032854 second(s), 19 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部