博客服务器内存不够?看完这篇你就知道怎么救了

我之前用的是1G内存的VPS,跑个WordPress博客还算流畅。但后来装了一堆插件,突然有一天网站直接502了。打开服务器后台一看,内存使用率99%,Swap区也满了,整个系统卡得像死机一样。

后来花了三晚上研究,总算把这个问题解决了。今天把我踩的坑和解决方案全部写出来,1G、2G内存的博客服务器都可以参考。


内存为什么会不够?

先说个冷知识:Linux系统会把空闲内存用来做缓存(Cache),这部分"占用"其实是可以快速释放的。真正的内存告急指的是可用内存(free + available)接近0。

常见原因我列了个表:

原因典型表现危险程度
PHP-FPM进程数太多内存占用逐渐升高直到崩溃⭐⭐⭐⭐
MySQL/马redis内存配置过大一启动就占用大量内存⭐⭐⭐⭐
Swap太小或没开内存一满直接OOM⭐⭐⭐
图片/备份文件占用/tmp临时文件撑爆内存⭐⭐
异常进程/被挖矿CPU和内存同时爆高⭐⭐⭐⭐⭐

第一步:先诊断到底是哪里出了问题

别急着改配置,先看清楚。SSH连上服务器,执行:

```bash

看内存使用情况

free -h

看哪些进程最吃内存

ps aux --sort=-%mem | head -10

看实时内存变化

watch -n 2 free -h

```

我第一次看的时候吓一跳,php-fpm进程居然占了700多MB!一台1G内存的机器,PHP就吞了一半。

再看MySQL,单独又占了200MB。这俩货加起来,1G内存基本就没剩多少了。


第二步:PHP-FPM配置优化(关键!)

PHP-FPM是内存消耗的大头,配置不合理的话,一个请求就可能fork出好几个进程,每个都带一份PHP的内存占用。

打开你的php-fpm配置文件:

```bash

一般在宝塔面板里直接改,或者找这个路径

/etc/php-fpm.d/www.conf

```

关键参数改这几个:

```

pm = dynamic # 改成动态模式,比ondemand更稳定

pm.max_children = 10 # 最大子进程数,1G内存建议不超过10

pm.start_servers = 3 # 启动时建立的进程数

pm.min_spare_servers = 2 # 最小空闲进程

pm.max_spare_servers = 5 # 最大空闲进程,超过就杀掉

pm.max_requests = 500 # 每个进程处理500个请求后自动回收,防止内存泄漏

```

改完重启PHP-FPM:

```bash

systemctl restart php-fpm

```

我改完之后,内存从原来占用900MB降到了500MB左右,立竿见影。


第三步:MySQL/MariaDB内存配置

数据库也是内存消耗大户,默认配置通常偏高。找到my.cnf:

```bash

宝塔用户一般在 /etc/my.cnf 或者 /www/server/mysql/my.cnf

```

在[mysqld]区域加这些:

```

看内存使用情况-第1张图片-无双博客

innodb_buffer_pool_size = 128M # InnoDB缓存,1G内存机器建议128-256M

max_connections = 50 # 最大连接数,博客站50足够了

query_cache_size = 0 # MySQL5.7以上已禁用,不用管

key_buffer_size = 32M # MyISAM索引缓存,32M够用

```

注意:如果你是MariaDB,buffer_pool可以适当大一点,但不要超过物理内存的50%。


第四步:给服务器加个Swap,防止OOM

Swap相当于把硬盘当内存用,速度慢但不会让系统直接崩溃。

```bash

创建一个2G的Swap文件

fallocate -l 2G /swapfile

chmod 600 /swapfile

mkswap /swapfile

swapon /swapfile

设置开机自动启用

echo '/swapfile none swap sw 0 0' >> /etc/fstab

设置Swap使用倾向(数值越低越倾向使用Swap)

echo 'vm.swappiness=10' >> /etc/sysctl.conf

sysctl -p

```

我加了2G Swap之后,即使PHP偶尔内存占用过高,系统也不会直接502了,会先用Swap顶着,给你反应时间。


第五步:定期监控,做运维值班员

问题解决了还不够,得防止复发。我在宝塔面板设置了内存使用率超过80%自动重启PHP-FPM的脚本:

```bash

#!/bin/bash

used=$(free | grep Mem | awk '{print ($3/$2)*100}')

if [ $used -gt 80 ]; then

systemctl restart php-fpm

echo "$(date): Memory used $used%, restarted php-fpm" >> /var/log/mem_restart.log

fi

```

然后加到宝塔的计划任务里,每10分钟执行一次。配合监控宝的免费告警,内存超了就给我发短信。


效果对比

调优前后我做了个对比:

指标优化前优化后
内存占用率95%+(经常告警)50%-60%(稳定)
平均响应时间3-8秒0.5-1.5秒
502次数/周3-5次0次
Swap使用经常占满基本不用

效果还是很明显的。


常见问题

Q:我的服务器只有512M内存,跑WordPress够用吗?

说实话,512M跑WordPress会比较吃力。建议用Typecho或者Z-Blog这类轻量级程序,内存占用只有WordPress的1/5。我有一台512M的测试机跑Typecho,内存使用率长期在40%左右。

Q:加内存和优化配置哪个更值得?

先优化配置,基本免费。实在优化不动了再加内存。一般1G优化后够用,2G就很舒服了。

Q:宝塔一键优化脚本有用吗?

有用,但不够精准。那个脚本是通用配置,具体到你的博客还是得自己调PHP-FPM和MySQL这两个核心。


推荐阅读


有问题或者想聊聊你服务器的配置?微信:15207283116,加我备注"博客"

标签:服务器优化,PHP-FPM,MySQL优化,博客搭建,内存优化