nginx - 使用 logrotate 容器化 nginx 日志轮换

Nginx 没有原生的日志轮换,所以需要一个外部工具,比如 logrotate。 Nginx 提出了一个挑战,因为日志必须在轮换后重新打开。如果 pid 在/var/run 中可用,您可以向它发送 USR1 信号。

但是在 docker 容器中运行时,/var/run 中缺少 pid 文件(并且 pid 实际上属于主机,因为它在技术上是一个主机进程)。

如果您不重新打开日志,则 nginx 根本不会记录任何内容,尽管它会继续作为 Web 服务器、反向代理等运行。

最佳答案

您可以使用 docker inspect 从 Pid 属性中获取进程 ID,并使用 kill -USR1 {pid} 让 nginx 重新打开日志。

这是我创建的/etc/logrotate.d/nginx 文件:

/var/log/nginx/access.log
{
    size 2M
    rotate 10
    missingok
    notifempty
    compress
    delaycompress
    postrotate
        docker inspect -f '{{ .State.Pid }}' nginx | xargs kill -USR1
    endscript
}

https://stackoverflow.com/questions/43745844/

相关文章:

haxe - 是否有 atexit() 等同于 Haxe?

pandas - Pyspark - 如何回填 DataFrame?

javascript - 在哪里发布代码以供开源使用?

wifi - Arduino 非阻塞 Wifi 连接

sql - 有条件的平均值

centos7 - 在 LVM 之上扩展 GlusterFS

visual-c++ - 访问 CBitmap 对象中的单个像素

ibm-midrange - 在 AS400 中的程序之间传递可选参数

haskell - 在 where 子句中指定函数的类型

list - 类型 ('a -> ' b) list 的函数 -> OCaml 中的 'a -> '