docker 中的 apache:管理写入已安装卷的日志的最佳实践?

docker 中的 apache:管理写入已安装卷的日志的最佳实践?

编写和管理在容器中运行的 Apache HTTPD 写入的日志文件的最佳实践是什么?

我们使用 docker 基础镜像运行 Apache HTTPD httpd:2.4-bullseye。目前 HTTPD 配置为将其日志写入 stdout 和 stderr。Docker 捕获该容器输出,我可以通过 查看日志内容docker logs <containerId>

我想重新配置 HTTPD,以便访问、错误和其他 HTTPD 日志输出进入文件,这将以明显的方式保存/发布该输出。我可以处理修改 httpd.conf 和 httpd-ssl.conf,我绝对可以将卷安装到容器,并且我将与进程和目录权限作斗争,直到运行 docker 的 HTTPD 进程可以写入。

我关心的是定期轮换日志文件。相关的 apache 文档:https://httpd.apache.org/docs/2.4/logs.html#rotation

我想到过 logrotate,但不确定它是否适合这里。仅供参考,在旧的单机无 docker 部署方法中,HTTPD 用其进程 ID 写入一个文件,然后 logrotate 读取该文件并向 httpd 进程发送信号 (HUP),后者又重新读取其配置,重做其日志文件等。

请告诉我,对于 logrotate 无法向正在运行的 HTTPD 发送信号的 apache-in-docker 部署,正确的方法是什么?将日志输出管道传输到 apache 提供的可执行文件是rotatelogs最佳选择吗?

更新:成功创建了一个用户,在中配置了该用户httpd.conf,安装了卷,并在httpd-ssl.confVirtualHost 指令中设置了以下几行:

ErrorLog    "|bin/rotatelogs -n 14 /opt/data/logs/httpd-error.log 86400"
TransferLog "|bin/rotatelogs -n 14 /opt/data/logs/httpd-transfer.log 86400"
CustomLog   "|bin/rotatelogs -n 14 /opt/data/logs/httpd-ssl.log 86400" \
      "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

还是想听听专家的意见,先谢谢了

答案1

我不是专家,但是我在主机端运行 logrotate,它是一个 postrotate 脚本,负责向 apache 发送正确的信号以重新打开日志文件:

我在旋转脚本中添加了这个/etc/init.d/logrotate.d/

postrotate
   /root/postrotate.sh $1
endscript

在我的测试脚本中,/root/postrotate.sh我进入堆栈文件夹并在我的 docker 容器内运行 kill 命令:

cd `echo $1 | cut -d '/' -f '1-4' `
docker-compose exec my_container sudo pkill -HUP apache2 

相关内容