千家信息网

怎么滚动docker中的nginx日志

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要介绍了怎么滚动docker中的nginx日志的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么滚动docker中的nginx日志文章都会有所收获,下面我们一起
千家信息网最后更新 2025年01月23日怎么滚动docker中的nginx日志

这篇文章主要介绍了怎么滚动docker中的nginx日志的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么滚动docker中的nginx日志文章都会有所收获,下面我们一起来看看吧。

docker使用

  1. docker ps 查看运行中的容器

  2. docker images 查看docker镜像

  3. docker rm id(容器id) 删除容器(容器id可以通过docker ps查看,容器必须停止后才能删除)

    3.1 删除全部的容器 docker rm `docker ps -a -q`

  4. docker stop id(容器id) 停止容器运行

  5. docker rmi id(镜像id) 删除镜像

  6. docker pull ubuntu:16.04(镜像名称:版本号) 下载镜像

  7. docker run -it ubuntu:16.04 创建并运行容器容器

    -t 表示在新容器内指定一个伪终端或终端

    -i 表示允许我们对容器内的 (stdin) 进行交互

    -p 指定映射端口

    -d 在后台运行容器并打印容器id

    7.1 docker run -dit ubuntu:16.04 创建并后台运行容器

    7.2 docker run -ditp 8080:8080(主机端口:容器端口) ubuntu:16.04 创建并后台运行容器且映射容器的端口

  8. docker attach id(容器id) 进入正在运行中的容器环境

  9. 退出容器

    9.1 exit 直接退出容器并终止容器运行

    9.2 [ctrl+p]+[ctrl+q](快捷键) 退出容器,但是不会终止容器运行

  10. docker commit -m'版本标识' id(容器id) ubuntu:16.04(镜像与版本号) 提交镜像且生成镜像(可以通过该命令把搭建好的容器打包成一个新的镜像或者覆盖原镜像(即是修改原镜像内容,生成的镜像名与版本号相同就可以直接覆盖))

好了,大家了解了docker,下面是本文介绍的重点,一起看看吧。

nginx 自己没有处理日志的滚动问题,它把这个球踢给了使用者。一般情况下,你可以使用 logrotate 工具来完成这个任务,或者如果你愿意,你可以写各式各样的脚本完成同样的任务。本文笔者介绍如何滚动运行在 docker 中的 nginx 日志文件(下图来自互联网)。

思路

nginx 官方其实给出了如何滚动日志的说明:

rotating log-files
in order to rotate log files, they need to be renamed first. after that usr1 signal should be sent to the master process. the master process will then re-open all currently open log files and assign them an unprivileged user under which the worker processes are running, as an owner. after successful re-opening, the master process closes all open files and sends the message to worker process to ask them to re-open files. worker processes also open new files and close old files right away. as a result, old files are almost immediately available for post processing, such as compression.

这段说明的大意是:

•先把旧的日志文件重命名
•然后给 nginx master 进程发送 usr1 信号
•nginx master 进程收到信号后会做一些处理,然后要求工作者进程重新打开日志文件
•工作者进程打开新的日志文件并关闭旧的日志文件

其实真正需要我们做的工作只有前面两点!

创建测试环境

假设你的系统中已经安装好了 docker,这里我们直接运行一个 nginx 容器:

$ docker run -d \ -p 80:80 \ -v $(pwd)/logs/nginx:/var/log/nginx \ --restart=always \ --name=mynginx \ nginx:1.11.3

注意,我们把 nginx 的日志绑定挂载到了当前目录下的 logs 目录下。

把下面的内容保存到 test.sh 文件中:

#!/bin/bashfor ((i=1;i<=100000;i++))do curl http://localhost > /dev/null sleep 1done

然后运行这个脚本,就可以模拟产生连续的日志记录。

创建滚动日志的脚本

创建 rotatelog.sh 文件,其内容如下:

#!/bin/bashgetdatestring(){ tz='asia/chongqing' date "+%y%m%d%h%m"}datestring=$(getdatestring)mv /var/log/nginx/access.log /var/log/nginx/access.${datestring}.logmv /var/log/nginx/error.log /var/log/nginx/error.${datestring}.logkill -usr1 `cat /var/run/nginx.pid`

getdatestring 函数取当前的时间并格式化为字符串,比如 "201807241310",笔者比较喜欢用日期和时间来命名文件。注意这里通过 tz='asia/chongqing' 指定了时区,因为默认情况下格式化的是 utc 时间,用起来怪怪的(要实时脑补 +8 小时)。下面的两条 mv 命令用来重命名日志文件。最后通过 kill 命令向 nginx master 进程发送 usr1 信号。

通过下面的命令为 rotatelog.sh 文件添加可执行权限并复制到 $(pwd)/logs/nginx 目录下:

$ chmod +x rotatelog.sh$ sudo cp rotatelog.sh $(pwd)/logs/nginx

定时执行滚动操作

我们的 nginx 运行在容器中,所以需要在容器中给 nginx master 进程发送 usr1 信号。因此我们需要通过 docker exec 命令在 mynginx 容器中执行 rotatelog.sh 脚本:

$ docker exec mynginx bash /var/log/nginx/rotatelog.sh

执行一次上面的命令,会如期产生一批新的日志文件:

下面我们把这个命令配置在定时任务中,让它每天早上 1 点钟执行一次。执行 crontab -e 命令,并在文件的末尾添加下面的行:

* 1 * * * docker exec mynginx bash /var/log/nginx/rotatelog.sh

保存并退出就可以了。下图是笔者测试过程中每 5 分钟滚动一次的效果:

为什么不在宿主机中直接 mv 日志文件?

理论上这么做是可以的,因为通过绑定挂载的数据卷中的内容从宿主机上看和从容器中看都是一样的。但是真正这么做的时候你很可能碰到权限问题。在宿主机中,你一般使用的是普通用户,而在容器中产生的日志文件的所有者是会是特殊的用户,并且一般不会给其它用户写和执行的权限:


当然,如果你在宿主机中使用的是 root 用户就不会有问题。

能从宿主机中发送的信号吗?

其实这个问题的全称应该是:能从宿主机中给 docker 容器中的 nginx master 进程发送信号吗?

答案是,可以的。

笔者这一文中介绍了容器中信号的捕获问题,感兴趣的朋友可以去看看。在那篇文章中我们介绍了 docker 向容器中进程发送信号的 kill 命令。我们可以通过命令:

$ docker container kill mynginx -s usr

向容器中的 1 号进程(nginx master)发送 usr1 信号(这种方式只能向 1 号进程发送信号):

结合上面的两个问题,我们可以写出另外的一种方式来滚动 docker 中的 nginx 日志。这种方式不需要通过 docker exec 命令在容器中执行命令,而完全在宿主机中完成所有的操作:

•先重命名容器数据卷中的日志文件
•给容器中的 1 号进程发送 usr1 信号

关于"怎么滚动docker中的nginx日志"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"怎么滚动docker中的nginx日志"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

容器 日志 文件 运行 命令 镜像 信号 进程 宿主 内容 宿主机 问题 面的 版本 用户 端口 笔者 脚本 任务 可以通过 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发招标属于服务采购 网络安全法对于大数据的 2022网络安全学什么内容 php 中间件 数据库 例 恢复数据库名 高中学生网络安全的活动简报 牛人学习网络安全 sd数据库查文献 sql 链接服务器 查询 m1pro 软件开发 sdk和软件开发的区别 网络技术中背板什么意思 面向智能汽车的网络安全解决方案 奉贤区品质数据库服务商销售价格 亚马逊服务器芯片是哪个国家的 联想服务器怎么进安全模式 云服务器试用30天如何注册 维护国家网络安全知识 网络安全与数字签名相关技术论文 贵州边缘计算服务器云空间 数据库查询设计参数查询步骤 云桌面签名服务器怎么删除 网络安全手抄报题材 mysql怎么添加数据库 私服的服务器端口怎么看 艾尔登法环总是与服务器断开 万企帮万村台账数据库 智能驾驶网络安全岗位信息 网络安全信息会议 针对企业上云的情况数据库
0