这台机器的配置单很短:
| 项目 | 规格 | 说明 |
|---|---|---|
| CPU | 2 核 | 静态文件用不上,构建会 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,防止某个循环把机器拖垮。
成本
一年不到一千块。它不快,但它一直在。
小机器的正确用法是:让它只干一件事,并且干得很直。
COMMENTS留言 (0)
LOGIN REQUIRED