机器配置概览

项 值
云厂商 阿里云轻量应用服务器
公网 IP 118.31.186.200
规格 2 vCPU / 2 GiB 内存 / 40 GiB ESSD
带宽 200M 峰值(不限流量)
价格 68 元/年(双11新客活动价)
系统 Ubuntu 22.04 LTS

说实话,2核2G 不算大。一般博客跑 WordPress 这配置刚好。但我要跑 3 个项目:

  1. 文本笔记站(note.mccok.cn)—— 极简记事本,可图文混排
  2. OpenList 网盘管理(5244 端口)—— 聚合百度网盘 + 夸克
  3. 本博客(mccok.cn)—— 本文的 Hexo

策略的核心就 4 个字:能静不动态。


策略一:静态化一切能静态的

博客和笔记站,必须静态。

笔记站是我选的 minimalist-web-notepad 项目,本身纯 PHP + 文本文件读写(不装 MySQL,不装 Redis)。笔记保存为磁盘上的 .txt。博客更简单,Hexo 生成纯 HTML,跑博客 = 跑 Nginx 读文件,Nginx 自己就是静态文件服务器。

静态化之后,博客 + 笔记两个项目合计的常驻内存占用:

Nginx master+worker 合计  ~18 MB
PHP-FPM (笔记站)          ~45 MB
----------------------------
合计                      ~63 MB

而 2 GB 内存总共有约 1800 MB 可用(系统内核占去 200MB)。63 MB 跟没有一样。


策略二:Docker 资源硬限制

唯一需要吃资源的是 OpenList(原 AList),它是 Go 写的单体程序,但内存会随文件缓存涨到 300-500MB。我直接在 Docker Compose 上硬限制:

# /srv/www/AList网盘管理/docker-compose.yml
services:
  openlist:
    image: ghcr.io/openlist-org/openlist:latest
    container_name: openlist
    restart: unless-stopped
    ports:
      - "5244:5244"
    volumes:
      - ./data:/opt/alist/data
    # ↓ 关键:限制死资源上限
    deploy:
      resources:
        limits:
          cpus: '0.60'        # 最多用 60% 的单核(≈ 总 CPU 的 30%)
          memory: 256M        # 内存上限 256MB,超了就 OOMKill 自动重启
        reservations:
          cpus: '0.10'
          memory: 64M
    memswap_limit: 256M      # 禁止 Swap 溢出到磁盘

这样 OpenList 就算内存泄漏(实际上没泄漏),最多占 256MB + 30% CPU,系统不会被拖死。


策略三:Nginx 反向代理 + 中文目录规范

三个项目都放在 /srv/www/ 下,文件夹必须中文命名(个人偏好,查找方便):

/srv/www/
├── 文本笔记/          → 目录名中文,Nginx root 路径记得加双引号
├── AList网盘管理/     → Docker Compose 跑在 5244,Nginx 反代到这里
└── 博客/              ← 我们的 Hexo 静态产物

Nginx 配置举例(关键点:中文路径用双引号包起来):

server {
    listen 80;
    server_name mccok.cn;

    # ↓ 中文路径必须加双引号,否则 Nginx 解析失败
    root "/srv/www/博客";
    index index.html;

    location / {
        try_files $uri $uri/ $uri.html =404;
    }

    # 静态资源强缓存
    location ~* \.(css|js|jpg|jpeg|png|svg|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

策略四:Swap 兜底 + Swappiness 调低

2GB 内存理论上够,但三个项目同时有访问峰值(比如网盘下载大文件)时,内存会突然飘到 1.6~1.8 GB。这个边缘情况下如果没有 Swap,Linux OOM Killer 会随机杀一个进程(通常是占内存最大的 OpenList),导致网盘服务掉线。

所以加 2GB Swap 文件,并调低可抢占性:

# 创建 2G swap
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab

# swappiness = 10(默认 60,太高会过早用 swap 拖慢速度)
echo 'vm.swappiness=10' >> /etc/sysctl.conf
echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf
sysctl -p

这样内存紧张时先用 Swap,但不会太早用(避免性能下降)。


策略五:UFW 只开 3 个端口

防火墙别手软:

ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp comment 'SSH'
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'
ufw --force enable

其余全部拒绝。OpenList 的 5244 端口不对外开放,只允许本机 Nginx 反代访问(127.0.0.1:5244)。要访问网盘走 note.mccok.cn/dav/ 之类的路径,Nginx 内部转发——这样所有流量统一走 HTTPS 加密,也少暴露攻击面。


最终运行状态

# free -h
              total        used        free      shared  buff/cache   available
Mem:          1.9Gi       742Mi       430Mi        18Mi       850Mi       1.1Gi
Swap:         2.0Gi       0Ki        2.0Gi        -            -

# docker stats --no-stream
NAME        CPU %     MEM USAGE
openlist    2.15%     92.3MiB / 256MiB

# curl -s -o /dev/null -w "%{http_code}\n" https://mccok.cn
200

内存只用了 742MB(含系统 + Nginx + PHP-FPM + Docker + OpenList),Swap 完全没动。CPU 常年 <5%。

结论:68 块跑三个项目?绰绰有余。关键不是硬件,是把钱和资源都花在刀刃上。

(完)