先把配置写清楚:两核,3.8G 内存,四十个 G 的盘,一年二百八十八。买它是因为便宜,也因为当时觉得“一个博客能用多少内存”。

后来证明,我低估了自己折腾的能力。

平时的占用是这样:Node 进程四百多兆,数据库三百兆左右,nginx 几十兆,剩下的被系统和一些乱七八糟的东西吃掉。加起来不到两个 G,看起来还挺宽裕。

宽裕是假的。

第一次出事是在服务器上直接跑 next build。那天我图省事,把代码传上去就地构建,前几分钟还好,跑到编译页面的时候 SSH 突然卡住,然后断了。我重新连,连不上。等了两分钟再连,连上了,dmesg 里一行 Out of memory: Killed process。

构建进程被系统杀了。构建的时候内存能冲到两三个 G,加上本来在跑的服务,3.8G 根本不够。

那天晚上我做了三件事。

第一,加了 2G 的 swap。这是一块硬盘上的空间,当内存用,慢,但至少不会直接被杀。设置完 free -h 里多了一行,看着心里踏实点。

第二,构建改到本地做。本地构建完,把产物传上去,服务器只负责跑。这个改动看起来土,但从此再没因为构建挂过。

第三,给 Node 加了 --max-old-space-size=1024。意思是别让进程无限制地吃内存,超过就自己回收。副作用是可能变慢,但在这种小机器上,慢一点比挂掉强。

第二次出事是 502。

凌晨三点多,我起来上厕所,顺手看了眼手机,发现站点打不开。nginx 返回 502,意思是它连不上后面的服务。

我坐在床上用手机 SSH 上去看,pm2 list 显示进程在反复重启。看日志,是数据库连接数满了——有个地方我忘了关连接,请求一多就堆积。改完重启,站点回来了,前后花了四十分钟。

那晚我躺回去以后没睡着,脑子里在想一个很蠢的问题:这个站一天就三十个人看,我为什么要为它半夜爬起来。

后来想明白了。不是为那三十个人,是因为它是我自己搭的。它挂了,只有我能修。

现在这台机器上跑着站点、数据库、一个定时备份脚本。备份是每天凌晨四点用 rsync 传到另一台更小的机器上,那台一年一百二,只存文件不跑服务。有一次我真用上了——误删了一个目录,从备份里拉回来的。

3.8G 能跑一个站吗?能。但得认怂:别在它上面编译,别开太多常驻进程,别指望它扛住突然的流量。它像一个很小的房间,东西放得下,但不能在里面转身。

我现在的做法是能省就省。图片压缩,缓存加上,日志定期清。每次加新东西之前先看一眼内存,够不够。

有点麻烦,但也挺有意思。你被限制住了,才会去想哪些东西是真的需要的。