问题发现
本来是想要给博客加个功能的,结果访问博客时发现网站访问不了了,登录到服务器查看,发现是数据库已经挂掉了,因为整个博客都是打包在docker中运行的,三个容器就只挂了服务器,有点匪夷所思。执行docker-compose
命令时提示
[18391] INTERNAL ERROR: cannot create temporary directory!
刚开始我还以为是目录权限有问题,给足权限后发现问题还是没有解决,上谷歌搜索后有一条回答是磁盘已被用完,执行df -h
后发现根目录确实100%被占用了
继续深挖发现是/var/lib/docker/container
中的nginx
容器占用了33G
这就比较奇怪了,因为自己的docker compose
配置文件中,nginx
目录映射只有三个:nginx
配置文件,网站代码目录和证书目录,看来只有继续到目录里面查看了
竟然是一个日志文件!使用tail
命令查看该日志文件后发现是nginx
的访问日志。
顺带吐槽一下,查看过几次网站的蜘蛛日志,国内的搜索引擎也太流氓了,也不访问网站的robots.txt
文件就开始直接肆无忌惮的爬,没上线几天日志就30多G,还好几次把我的小服务器搞挂了。
解决方案
在分析完毕找到原因过后,我们就可以将该日志文件清空了,这时可以用命令 cat /var/null > file
.这里需要注意的是不能使用 rm -rf file
删除日志文件,如果你执行这个命令删除文件后,通过 df -h
会发现磁盘空间并没有释放,原因是在 Linux 或者 Unix 系统中,通过 rm -rf
或者文件管理器删除文件,将会从文件系统的目录结构上解除链接(unlink)。如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。
预防手段
虽然说这样做可以解决问题,那也只是治标不治本,难道下次再次发生这样的问题我又要来重复这样的工作吗?不,我懒,不愿意再做这样的事情了。所以我想让日志文件的大小受到限制,不让它有膨胀的机会。通过 docker 的相关文档,发现我们我们可以修改 docker 的配置来限制日志文件的大小。
全局配置
新建/etc/docker/daemon.json
文件(已存在就修改),添加 log-dirver 和 log-opts 参数,样例如下:
{
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"5"}
}
max-size=500m
,意味着一个容器日志大小上限是 500M, max-file=5
,意味着一个容器有五个日志,分别是 id+.json、id+1.json、id+2.json 等。
这样配置过后,重启 docker 的守护线程。以后新建的容器都会有效,但是如果我不想删除现在的容器重新建立一个又该怎么办?
设置一个容器服务的日志大小上限
上述方法,日志文件迟早又会涨回来。要从根本上解决问题,需要限制容器服务的日志大小上限。这个通过配置容器docker-compose
的max-size
选项来实现
logging:
driver: json-file
options:
max-size: 3g
重启容器之后,其日志文件的大小就被限制在 3GB,再也不用担心了。 建议使用第二种方法来实现日志大小的限制。
说两句