在1核1G1M带宽的香港服务器上建站的思路

白嫖了一台学生机:

  • CPU:1核(Intel Xeon E5-2696 v2 @ 2.50GHz,古董级)
  • 内存:960MB(连1G都没给满)
  • 带宽:1M(没错,就是那个1M)
  • 硬盘:20G系统盘 + 20G数据盘

运行的是 Debian 12 (bookworm),内核 6.1.0

现状检查:这台机器能干什么?

root@cvm-3k2fzhq25i225:~# free -h
               total        used        free      shared  buff/cache   available
Mem:           960Mi       279Mi       472Mi       2.1Mi       348Mi       681Mi
Swap:          2.0Gi       2.3Mi       2.0Gi

root@cvm-3k2fzhq25i225:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            462M     0  462M   0% /dev
tmpfs            97M  588K   96M   1% /run
/dev/vda1        20G  4.4G   15G  24% /
/dev/vdb1        20G   24K   19G   1% /data

root@cvm-3k2fzhq25i225:~# top
top - 12:08:52 up 20 days, 13:18,  1 user,  load average: 0.01, 0.01, 0.00
Tasks:  83 total,   2 running,  81 sleeping,   0 stopped,   0 zombie
%Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :    960.7 total,     66.0 free,    277.1 used,    765.8 buff/cache
MiB Swap:   2048.0 total,   2045.7 free,      2.3 used.    683.6 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    213 root      20   0  201096 151096 145996 S   0.0  15.4   5:00.79 systemd-journal
    428 root      20   0   28744  18452  10552 S   0.0   1.9   3:53.83 unattended-upgr

已经跑着 Nginx 1.28.2,还开了 BBR 加速(tcp_congestion_control = bbr),这点倒是挺良心。

问题来了:就这配置,想做个网站,怎么搞?

常规路线

WordPress?

想都别想。PHP + MySQL + WordPress 这套组合拳下来,1G内存连启动都费劲。就算强行装上,随便来几个请求就能把机器卡死。

其他动态框架?

Django、Rails、Laravel……任何一个都是"内存杀手"。跑起来是可以,但并发?不存在的。

数据库?

MySQL 默认配置就要占几百兆,MariaDB 好一点但也够呛。SQLite 倒是个选择,但在 Web 场景下并发写入是硬伤。

我的思路:本地预处理 + 线上纯静态

既然服务器跑不动动态内容,那就把"动态"的部分挪到本地。

核心思想:在本地完成所有消耗资源的工作,上传到服务器的只有原生 HTML。

具体怎么做?

1. 本地搭建开发环境

  • 本地跑 MySQL
  • 本地跑 Python(或者其他你顺手的脚本语言)
  • 本地完成所有数据处理、模板渲染、内容生成

2. 组件化思维管理

把网站拆成组件:

  • 头部导航(header)
  • 底部版权(footer)
  • 侧边栏(sidebar)
  • 文章列表
  • 评论模块

每个组件单独维护,修改时只改一处。

3. 构建脚本做三件事

写一个本地构建脚本(Python/Shell/Node 都行),每次更新时:

① 内联化

把所有组件塞进最终的 HTML 文件里,不依赖任何外部文件。CSS 内联、JS 内联,甚至字体图标都转成 DataURI。

② 图片优化

  • 转 WebP 格式(比 PNG/JPG 小30%以上)
  • 压缩质量(80% 通常够用)
  • 调整分辨率(移动端不需要4K大图)
  • 能转 CSS 绘制的就不要用图片

③ 资源压缩

  • HTML 去空格、去注释
  • CSS/JS 压缩
  • 能合并的请求尽量合并

4. 增量上传

每次更新只上传被修改的文件,不需要重复上传整个站点。

用 rsync 或者写个简单的同步脚本:

rsync -avz --delete ./public/ root@your-server:/www/wwwroot/

这套方案的优势

维度 传统动态网站 本地方案
服务器内存占用 几百兆起步 几十兆
CPU消耗 每次请求都要渲染 只读静态文件
带宽占用 动态生成+多次请求 单次请求,极致压缩
并发能力 受限于后端 受限于Nginx,轻松10倍
更新方式 在线修改 本地构建+同步

实际效果

我的站点目前就是这么跑的:

  • Nginx 只负责 serve 静态文件
  • 内存占用:9.1M(Nginx进程)
  • CPU:几乎为0
  • 1M带宽跑起来也够用,因为我的首页才不到500kb

待优化

  • 评论/搜索等需要后端的场景:可以用第三方服务(如 GitHub Issues 做评论、Algolia 做搜索),或者本地生成时就把搜索索引做好
  • 不适合频繁更新的站点:每次更新都需要重新构建,如果一天改几十次内容会有点烦
  • 动态内容怎么办:如果真的需要动态数据,可以留一个小接口(比如用 Flask 写一个轻量 API),但绝大多数场景其实不需要

这个方法就是"用时间换空间"——用本地构建的时间,换服务器有限的资源。

对于个人博客、作品集、小型项目来说,够用、省心、还省钱。

代码暂时不贴了,目前写得很混乱(自己用嘛,能跑就行)。等有空整理一下,再单独写一篇把构建脚本放出来。

配置不够,脑子来凑。共勉。

*当前服务器已稳定运行至今,Nginx + BBR + 纯静态,稳如老狗。*