SPUD NEST // 001 薯窝
登录
RUNNING A SITE ON 2C / 2G

用 2 核 2G 跑一个站

这台机器的配置单很短:

项目规格说明
CPU2 核静态文件用不上,构建会 OOM
内存2 GB加 2 GB swap 兜底
带宽3 Mbps约 370 KB/s,全站共享
硬盘40 GB图片够用,日志要轮转

第一条:不要在服务器上构建

next build、vite build、npm install 跑在 2G 上基本等于自杀。构建放到本地,服务器只接收产物。

# 本地
node tools/build.mjs
# 服务器只做一件事:把目录放对位置
scp -r dist/* root@your-ip:/var/www/blog/

这样一来,服务器上除了 Nginx 和一个小 Node 进程,什么都没有。

第二条:带宽是唯一的瓶颈

3 Mbps 意味着 15 个并发用户同时打开首页,大约 1.1 秒排完队。听起来还行——前提是首页只有 26 KB。

所以我把图片全推到页面之外:首屏不放大图,列表不缩略图,文章内图片一律 loading="lazy" 并写死宽高。单页体积硬上限 80 KB。

第三条:能交给 Nginx 的不要交给 Node

下载文件时,Node 只做两件事:验证登录、计数。字节由 Nginx 直接发:

location /_dl/ {
    internal;
    alias /var/www/blog/files/;
}
res.writeHead(200, {
  "Content-Disposition": `attachment; filename="${name}"`,
  "X-Accel-Redirect": `/_dl/${id}`,
});

Node 不参与传输,内存里不会有 50 MB 的 Buffer,进程也就稳定在 50 MB 上下。

第四条:某些优化是幻觉

  • 开 brotli:Ubuntu 源里的 Nginx 1.18 没有 ngx_brotli 模块,写了 brotli_static on 直接 502。gzip 够了。
  • 开 HTTP/2:3 Mbps 下多路复用带来的收益比想象中小,反而让首屏资源竞争更复杂。先不开。
  • 上 CDN:备案没过之前,CDN 也绕不过去。等备案。

第五条:把它当成一台会坏的机器

  • keepalive_timeout 调到 15,别让空闲连接占着文件描述符。
  • 2G 内存加 2G swap,vm.swappiness=10。
  • 日志按天轮转,40G 硬盘被 access.log 写满是最蠢的死法。
  • systemd 加 Restart=always,并把 MemoryMax 设成 256M,防止某个循环把机器拖垮。

成本

一年不到一千块。它不快,但它一直在。

小机器的正确用法是:让它只干一件事,并且干得很直。

END OF ENTRY // 002

COMMENTS留言 (0)

LOGIN REQUIRED
LOADING…