前几天我不是发了一篇《1.9G 小内存 VPS 的极限生存指南》嘛,里面还教大家怎么用 Docker 限制内存。结果没过几天,我直接把 Docker 给卸了 😅
事情是这样的——我翻了一下 htop,发现 Nginx Proxy Manager 那个容器,啥也不干就占 250M+ 内存。我那个 NPM 就配了五六个域名,SSL 自动续签,反向代理几个服务,这功能说大不大,但内存吃得比谁都多。
再看 nginx:alpine 容器,跑静态博客,128M 限制下也用了 100M 左右。加起来光容器就吃了 400M+。而我 1.9G 的机器,还要跑 Hermes Agent、定时任务、各种脚本,内存常年只剩 200M 左右。
然后我就在想——我特么真的需要 Docker 吗?
先说说为什么当初要上 Docker
当时刚搞博客的时候,图省事。docker compose up -d 一把梭,Nginx 配置自动生成,SSL 证书自动续签,域名管理有 Web UI,确实香。
但后来我发现一个问题:我博客的流量其实很小,日均 UV 也就几十到一百出头。静态博客,Nginx 直接 serve 文件,根本不需要什么容器编排、负载均衡、滚动更新。这些 Docker 带来的附加价值,我一个都没用到,反而白白吃了内存。
迁移过程
说干就干。
第一步,把 Nginx 直接装到系统上。Ubuntu 24.04 的 apt 源里 nginx 版本挺新的,直接 apt install nginx 搞定。
第二步,配置。以前 NPM 自动生成的配置我全删了,自己手写。其实一个静态博客的 nginx 配置很简单,就几个关键点:
| |
SSL 证书我是从之前 NPM 的 acme 目录里直接拷过来的,省得重新申请。后来发现 certbot 其实更简单,但既然证书还能用,就不折腾了。
第三步,把 Hugo 构建的静态文件丢到 /var/www/jiangym.top/。
第四步,nginx -t && nginx -s reload,完事。
踩的坑
当然不是一帆风顺。说说几个坑。
权限问题:Nginx 默认以 www-data 用户运行,而我 Hugo 构建出来的文件是 root 的。结果第一次访问直接 403 Forbidden。查了半天,发现是 /var/www/jiangym.top/ 目录的权限不对。chown -R www-data:www-data /var/www/jiangym.top/ 搞定。
路径问题:之前 Docker 里 nginx 的 root 路径映射的是容器的 /usr/share/nginx/html,现在改成系统路径,一开始忘了改,结果 404 了半天。后来直接在 nginx config 里指定 root /var/www/jiangym.top;,又是低级错误。
SSL 证书路径:从 NPM 容器里拷出来的证书路径我忘了,最后用 find / -name "fullchain.pem" 2>/dev/null 才找到。原来 NPM 把证书存在一个 Docker volume 里,路径是 /var/lib/docker/volumes/... 这种鬼地方。
现在怎么样?
卸掉 Docker 之后,内存占用从 1.6G 降到了 1.1G 左右,省了 500M。这 500M 对我来说就是质的飞跃——之前经常到 90% 内存占用,现在稳定在 60-70%。
而且裸机 nginx 的启动速度比容器快多了,毕竟少了一层 Docker 的 overhead。systemctl restart nginx 基本秒起,而 docker restart 总得等几秒。
当然,代价就是以后配新域名得手动写 nginx config 了,没有 NPM 那种 Web UI 点一点就完事的爽快了。但说实话,我域名也就那几个,配一次管一年,不差这点功夫。
给同样在用的兄弟们
如果你也是小内存 VPS 跑博客,真心建议你评估一下:你的 Docker 真的有必要吗?
- 如果你跑的是微服务、多容器编排、需要滚动更新 → 留着 Docker
- 如果你只是跑一两个静态网站 + 反向代理 → 裸机部署更省资源
- 如果你用 Docker 只是因为"大家都用" → 想想自己到底需不需要
反正我是卸了。Docker 是好东西,但好东西不一定适合所有人。就像鲁迪的魔法虽然强,但有时候剑术更管用一样(强行二次元比喻)。
好了,下一篇讲讲迁移之后我顺便把博客的 HTTPS 配置优化了一下,加了 HSTS、OCSP Stapling 什么的。不过以我的拖延症,可能下周才写。
就这样吧,拜拜 👋