最近在维护一台 2G 内存的轻量云服务器,上面挂了两个小网站。前阵子发现站点偶尔会出现 502 Bad Gateway,登录面板一看,MySQL 居然悄无声息地挂了。
排查了一下 /var/log/messages,典型的小机器物理内存耗尽,Linux 内核的 OOM killer 顺手把最吃内存的 mysqld 给干掉了。趁着这次排查,把这套跑得相对稳定的参数调整记录下来,方便以后自己开新机器备忘,也给配置相仿的朋友留个参考。
1. 必须先给小机器挂上 Swap
很多人租了轻量服务器,装完系统默认是没有启用虚拟内存(Swap)的。1G 或 2G 内存的机器,一旦后台有计划任务、或者偶尔来几只蜘蛛同时抓取,内存峰值瞬间就顶满了。
没有 Swap 作为缓冲,内核只能强杀进程保命。解决 OOM 最有效的第一步就是开 Swap:
在宝塔面板的「软件商店」里搜「Linux 工具箱」,里面可以直接添加 Swap。2G 内存的机器,建议直接分 2048MB(即 2G)的 Swap;如果是 1G 机器,也分配 1G 到 2G。这块空间主要是作为防击穿的安全气囊,避免内存短时间内被突发请求挤爆。
2. PHP 与 MySQL 核心参数改动
小服务器卡死,绝大部分时候是 PHP 子进程开多了,或者 MySQL 的缓冲池给得太大。宝塔默认的推荐方案对 2G 机器来说还是略显激进。
PHP-FPM 配置调整
打开对应 PHP 版本的设置面板(建议 7.4 或 8.0+),找到「性能调整」:- 运行模式:选择
ondemand(按需分配)或者控制严格的dynamic。如果站点访问量零散,ondemand非常省内存,没有请求时子进程会自动释放。 - max_children(最大子进程数):2G 内存机器通常跑 2~3 个站点,建议设置在 10 到 15 之间。一个 PHP 进程大概占 25~45MB 内存,如果设成 30,几个爬虫一来,光 PHP 就能吃掉 1G 以上内存。
- start_servers:建议设为 2 到 3。
- min_spare_servers:设为 2。
- max_spare_servers:设为 5。
MySQL 配置微调
进入 MySQL 设置里的「性能调整」:- 宝塔自带的内存优化方案里,2G 机器直接选「1-2G 内存方案」即可。
- 重点确认
innodb_buffer_pool_size,建议不要超过 256MB(如果是 1G 机器,设成 64MB 或 128MB 即可)。很多博客站数据量不大,没必要给数据库留太大的缓存池。
3. 不同内存规格参数参考
下面是我在实际折腾不同配置服务器时,测试出来相对不容易出事的参数区间:
| 服务器内存 | Swap 建议大小 | PHP max_children | InnoDB Buffer Pool | 推荐 PHP 模式 |
|---|---|---|---|---|
| 1 核 1G | 2048 MB | 5 - 8 | 64 MB - 128 MB | ondemand |
| 1 核 2G | 2048 MB | 10 - 15 | 128 MB - 256 MB | dynamic / ondemand |
| 2 核 4G | 4096 MB | 25 - 40 | 512 MB - 1024 MB | dynamic |
这些参数的思路很明确:宁愿让瞬时高并发排队稍微慢一点,也绝不能让物理内存爆掉导致服务挂掉。
4. 为什么改完参数后还是会被打崩?
把上面的配置改完之后,机器在日常情况下基本不会再莫名其妙死机了。但如果你的小站开了评论,或者用的是 WordPress 这类常见程序,经常还是会遇到突然卡顿甚至假死的情况。
翻看 Nginx 的访问日志就会发现,很多时候根本不是正常访客把站点跑崩的,而是境外的扫描脚本在批量撞后台(比如狂刷 /wp-login.php、xmlrpc.php),或者各种恶意的野爬虫在疯狂抓取动态页面。对 1核2G 的小机器来说,哪怕 PHP 进程限制在 10 个,这种并发打过来,也会瞬间把 CPU 和 PHP 队列占满,正常用户自然就打不开了。
光靠改底层配置,解决不了应用层的恶意消耗,最有效的办法还是在入口处直接把它们拦下来。宝塔自带的「Nginx 防火墙」插件在这方面确实省心,可以直接过滤掉很多恶意 User-Agent、限制单 IP 并发,以及拦截针对 WordPress 常见入口的高频暴破。
不过大家也知道,宝塔官方的专业版和防火墙插件按年续费算下来是一笔不小的开支。如果打算长期用、又不想每年折腾续费的,我们站现在提供了正版终身授权方案(一次买断、支持后台随时免费换绑服务器 IP)。价格比官方年付划算很多,有长线建站需求的朋友可以去首页了解一下。
小机器建站讲究的就是精打细算,改好限制参数加上 Swap,再配合入口处的请求过滤,1核2G 稳稳当当跑几个日常博客完全绰绰有余。