昨日,阿里云发来一条消息,磁盘监控报警。

开始没有在意,以为是当时请求量过高导致的,直到晚上的时候,发现站点无法打开,数据库也无法连接,查看监控信息发现系统磁盘全部满了。。

开始以为:

原因就是,当一个文件正在被一个进程使用时,用户删除此文件,文件只会从目录结构中删除,但并没有从磁盘删除。当使用这个文件的进程结束后,文件才会真正的从磁盘删除,释放占有的空间。

尝试kill掉进程,清空/tmp目录,无解。磁盘仍然是占满的状态。
然后检查目录大小,发现我的web站点目录26G。服务器被注入文件了?

可以看到图中runtime目录,占用了26G的储存。runtime目录是thinkphp框架的缓存和日志目录。
进这个目录后,发现里面有N个日志文件,每个文件2M。
打开某个日志后查看详细信息后,里面全是数据库连接失败的错误日志,到这里已经知道是什么原因导致thinkphp5生成了这么多的日志文件了。

由于站点使用了队列来处理一些代码,为了方便,队列使用数据库作为驱动,而队列会持续查询数据库队列表,来处理任务。
而队列执行时是在cli模式下的,在thinkphp5.1文档里连接数据库一章有提到:

如果你使用的是长连接或者命令行,在超出一定时间后,数据库连接会断开,这个时候你需要开启断线重连才能确保应用不中断。

正是因为没有开始断线重连,数据库断开后但是队列一直在轮询着,才导致了框架一直生成错误日志,正好框架日志生成,默认没有自动删除日志配置,日志文件会一直累加。

接下来知道原因,解决方法就简单了。

  1. 框架开启数据库断线重连
  2. 开启日志自动清理(thinkphp V5.1.6+)
说点什么吧~ 取消回复
共有 4 条评论
  • 演员 Windows 7 x64Google Chrome

    12月8日 22:01

    回复
    来看看
  • 森纯博客 Windows 10 x64Google Chrome

    12月5日 23:21

    回复
    服务器爆炸真麻烦~
  • 牌牌琦 Windows 8.1 x64QQBrowser

    11月25日 19:45

    回复
    www.yjxhl.com申请友情链接谢谢
  • kubaoya Windows 7 x64Google Chrome

    11月19日 17:42

    回复
    学习了,谢谢分享
Wisp X

不妄自菲薄,不矫枉过正; 不随波逐流,不固步自封。