编写和管理在容器中运行的 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.conf
VirtualHost 指令中设置了以下几行:
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