近几天 blog.ustc.edu.cn 频繁发生 502 Bad Gateway 故障。之前多次发生的内存溢出(OOM Kill)是由于 php-fpm worker 内存泄漏。开始以为是有攻击者频繁访问那个特殊 URL 导致的,但事实上我频繁访问其他的 URL,也能观察到内存泄漏。频繁访问 phpinfo 没有检测到内存泄漏,因此怀疑是数据库连接部分捣的鬼。

临时解决方案是,在 php-fpm.conf 里设置了 pm.max_requests = 500,即每个 worker 处理 500 个请求后就自动退出,respawn 新的 worker,这样内存泄漏的数量就是可控的。

今天又发生了 502 Bad Gateway,不过从 status.lug.ustc.edu.cn 上看到的各项系统指标都比较正常。但 php-fpm master 所监听的 socket 就是不接受连接。

为了应对这种古怪的情况,我们添加了 cron 脚本,每分钟检查 USTC Blog 首页和一个用户 blog 首页的可用性,发现错误就立即重启 php-sandbox 服务,如果还没有恢复就再重启 mysql 和 php-sandbox 服务。希望这个自动重启服务的程序能在关键时刻起作用,缩短服务中断时间。