原文链接:https://www.chenweiliang.com/cwl-34000.html
文章目录
一个socket路径引发的血案
故事是这样的。
我有一个朋友,上个月服务器又双叒叕挂了。
他跑来跟我说,monit一直在那里报错,说找不到php-fpm的socket文件,然后服务就开始频繁重启,负载一路飙升,凌晨三点他被报警电话叫起来修服务器。
我说你先别慌,把monit的日志贴给我看看。
贴过来一看,好家伙,全是这种错误:
error: Unix socket /run/php/php8.4-fpm.sock connection error — No such file or directory error: ‘php8.4-fpm' failed protocol test [DEFAULT] at /run/php/php8.4-fpm.sock — Cannot create unix socket for /run/php/php8.4-fpm.sock
我问他,你现在socket文件在哪?
他说不知道啊,我就按默认装的。
我说你等着,我帮你查。
然后我 ssh 上去一看,他实际的socket文件叫 /run/php/php8.4-fpm-etufo.org.sock。
我说哥们的socket路径是两个东西,这能通信才见鬼了。
今天我就把这个事儿掰开揉碎讲讲,顺便给个能解决问题的方案。
你以为监控在保护你,其实它在搞你
先说说monit日志里最常见的那种错误。
当你看到这种:
error: Unix socket /run/php/php8.4-fpm.sock connection error — No such file or directory
这说明monit在试着通过这个socket去检测php-fpm服务,但它找不到这个文件。
紧接着会发生什么,monit会尝试重启服务,日志里会出现:
info: ‘php8.4-fpm' trying to restart info: ‘php8.4-fpm' stop: ‘/usr/sbin/service php8.4-fpm stop' info: ‘php8.4-fpm' start: ‘/usr/sbin/service php8.4-fpm start'
看起来挺智能的对吧,自动修复。
但问题就在于,这种频繁重启才是真正的灾难。
你想想看,php-fpm重启的时候,所有正在处理的请求全部中断,所有session可能丢失,所有连接要重新建立。如果它在短时间内反复重启反复失败,服务器负载会瞬间飙高。
而日志里还会暴露更多信息,比如这种:
error: ‘etufo.org' loadavg (15min) of 8.8 matches resource limit [loadavg (15min) > 8.0] error: ‘etufo.org' cpu system usage of 33.9% matches resource limit [cpu system usage > 30.0%]
服务器已经高负载了,结果监控系统还在那里反复重启服务,这不是在救火,这是在火上浇油。
问题的本质:钥匙和锁不匹配
深入分析一下,问题其实很简单。
monit配置文件里写的socket路径是:/run/php/php8.4-fpm.sock
但php-fpm实际运行的socket路径是:/run/php/php8.4-fpm-etufo.org.sock
一个要检测A文件,一个实际是B文件,检测当然会失败。
这就像什么。
你有一把钥匙,锁在另外一个房间里。
你天天拿着钥匙开门,每次都发现开不开,然后你说这个锁坏了。
其实锁没坏,是你的钥匙跟锁不匹配。
解决Monit监控配置与PHP-FPM不一致的方案

方案一:把monit的配置改过来
如果你想保留php-fpm现有的socket配置,那就去改monit的配置。
找到monit的配置文件,把里面的:
if failed unixsocket /run/php/php8.4-fpm.sock then restart
改成:
if failed unixsocket /run/php/php8.4-fpm-chenweiliang.com.sock then restart
然后执行重新加载:
sudo monit reload
完事儿。
方案二:把php-fpm的配置改过去
如果你就想用默认路径,那去改php-fpm的pool配置。
编辑 /etc/php/8.4/fpm/pool.d/chenweiliang.com.conf,把listen指令改成:
listen = /run/php/php8.4-fpm.sock
然后重启php-fpm:
sudo systemctl restart php8.4-fpm
完事儿。
两个方案都能解决,选哪个取决于你的实际环境。
你服务器上托管了多少个站点,每个站点是不是独立socket,如果只有一个站点,默认路径会更简洁。
说点掏心窝的话
我是真的觉得,这类配置问题,是服务器运维里最容易被忽视但又最影响稳定性的一类问题。
一个socket路径写错了,表面上风平浪静,但实际上监控系统一直在那里误报,服务一直在那里乱重启,负载一直在那里莫名奇妙地飙高。
你以为是服务器太老了该升级了,其实可能就是配置文件里路径写错了。
就如一位前辈说的:“监控的准确性,是保障服务稳定的第一道防火墙。”
细节决定成败,在服务器环境里,这话一点不假。
从今天开始,检查一下你的监控配置,别让这种看似简单的问题把你的服务器搞崩了。
谢谢你看我的文章,我们,下次再见。om
欢迎转载《解决Monit监控配置与PHP-FPM不一致 No such file or directory错误》
欢迎分享本文链接:https://www.chenweiliang.com/cwl-34000.html
网站地址:https://www.chenweiliang.com/
欲获取更多资讯内幕和秘技,欢迎进入Telegram频道:https://www.chenweiliang.com/go/tgchannel
没有评论:
发表评论