
网站白天还好好的,晚上突然打不开,重启一下又恢复了,过几天又来一次。这种「灵异事件」,多半不是被攻击,而是服务器内存不够,进程被系统杀了。
Linux有个机制叫OOM Killer,当内存耗尽,系统会挑一个占内存多的进程直接干掉,让系统活下来。它杀人的时候不会通知你,你的网站进程可能就这么被无声地处决了。
排查分三步。第一步,free -h看内存,如果可用内存长期接近零,就是内存紧张。第二步,查杀进程记录,dmesg | grep -i oom,能看到谁被杀了。第三步,top按内存排序,看看是不是PHP-FPM或MySQL吃掉了大头。
最常见的原因是PHP-FPM配置太激进。每个PHP进程占几十上百兆内存,pm.max_children设成50,一台2G内存的机器瞬间就被榨干。一般建议2G内存的机器,max_children设10到15,再配合pm.max_requests让进程定期回收。
另一个办法是加swap交换分区,让系统在内存不够时先用硬盘顶上。swap不能解决根本问题,但能防止进程被直接杀掉,相当于给网站一个缓冲。SSD上的swap速度还行,能明显减少OOM。
长期来看,加内存最省心。1G的机器跑WordPress加MySQL,基本就是天天踩钢丝。升到4G,体验完全两个世界。如果预算有限,先把PHP-FPM参数调对,再考虑加硬件。
还木有评论哦,快来抢沙发吧~