WordPress 太吃内存?用 Hugo/Astro 静态站 + Nginx 在 VPS 上极限建站:零被黑、并发上万、GitHub Actions 自动部署
2026-08-14 · DevCraft Studio
WordPress 需要 PHP+MySQL,低配 VPS 极易 OOM 与被扫木马。本文讲清静态网站生成器(Hugo/Astro/Hexo)的原理与对比,给出 Nginx 托管静态站最小配置(root/index/gzip/缓存/HTTPS 跳转),以及 GitHub Actions 自动构建+rsync 部署的完整 workflow。
很多买国外 VPS 的朋友最初是想搭个博客,照着教程装了 LNMP、再一键装上 WordPress,结果噩梦开始:1 核 1G 的机器跑俩星期就开始时不时 502,MySQL 动不动被 OOM Killer 干掉,wp-login.php 天天被人爆破,xmlrpc.php 被人拿去放大攻击把 CPU 打满。你只是想写点字,却被迫成了半个运维。这篇文章给你一条更省心的解法:把网站做成纯静态文件,用 Nginx 一托了之。占用 CPU 近乎 0、内存几 MB、每秒扛上万并发、几乎没有能被黑的动态入口。下面从头讲清楚。
延伸阅读
更多相关攻略推荐:Ollama AI系列(2):VPS上的AI推理与API应用、Ollama AI系列(2):VPS上的AI推理与API应用、【CPU选型 01】搭载 AMD Ryzen 9950X 的 VPS、ARM / Ampere 席卷 VPS:性价比真香还是兼容陷阱?、Ollama AI系列(2):VPS上的AI推理与API应用。
一、WordPress 的宿命:低配 VPS 的噩梦
WordPress 本质是"PHP 运行时 + MySQL 数据库 + 一堆主题插件"的组合。每一次页面访问,服务器都要:先起 PHP 进程、连 MySQL、跑 SQL 查文章、套模板渲染成 HTML,再吐给你。这一套对内存和 CPU 的消耗,在低配 VPS 上非常要命。
内存溢出(OOM):1 核 1G 跑 WordPress,只要装几个"相关文章""SEO""统计"插件,单页就可能多十几二十次 SQL 查询;流量一上来,PHP-FPM 子进程和 MySQL 的 innodb_buffer_pool 抢内存,系统可用内存掉到几十 MB,OOM Killer 直接杀进程,网站 502。实测在主流云上,1G 内存跑带插件的 WP 在 30+ 并发时 free -h 常显示可用内存小于 50MB。
常年被扫漏洞:WordPress 是全球占有率最高的 CMS,也是黑客眼里的肥羊。高频被盯上的入口有仨:xmlrpc.php 可被 system.multicall 做成暴力破解放大器,一天被请求近千次不是新鲜事;wp-login.php 被人字典爆破后台密码;主题和插件一旦过期就成提权后门。你哪怕什么都不做,每天也有一堆机器人来撞你。换句话说,用 WordPress 等于你租了台 VPS,还顺手在公网门口挂了把没锁好的锁。
二、什么是静态网站生成器(SSG)?
静态网站生成器(Static Site Generator)的思路完全反过来:你在本机(或 CI)用 Markdown 写内容,生成器一次性把整站编译成一堆纯 HTML / CSS / JS 文件。上线之后,服务器不再做"每次请求都查数据库 + 渲染",它只是把现成的 HTML 文件读出来发给浏览器。没有 PHP、没有 MySQL、没有运行时执行,自然也就没有那些被黑入口。
打个比方:WordPress 像餐厅现点现炒(每次访问都现场做一遍),静态站像中央厨房提前做好盒饭(提前做好,客人来直接拿)。访问量大时,"现炒"的厨房先崩,"盒饭"仓库随便扛。对博客、文档、作品集这类"内容写好就很少变"的站点,静态站几乎完美契合。
三、三大 SSG 横向对比:Hugo / Astro / Hexo
选哪个?先说结论:新手/中文生态选 Hexo,性能极客/大型站选 Hugo,前端开发者/想要组件化选 Astro。下面细说。
- Hugo:用 Go 写的单文件二进制,快到离谱——实测一万页两三秒搞定,平均每秒编译几千页。零依赖、装上就能用,内置多语言、分类标签、图片处理。模板语法(Go template)稍微有点门槛,但一旦习惯就再也回不去。适合内容多、追求极致构建速度的人。
- Astro:新兴的现代 SSG,招牌是"岛屿架构(Islands Architecture)"——默认零 JavaScript,只有你明确标注需要交互的组件才会被水合(hydrate)。你能用 React / Vue / Svelte 写组件,但整站主体是轻量静态 HTML,Core Web Vitals 极好。适合既想要现代开发体验、又不想让用户下载一堆 JS 的内容站。
- Hexo:基于 Node.js 的老牌静态博客框架,中文资料和主题最多,上手最快,
hexo new post一句话开写。缺点是架构偏旧、超大型站点构建速度不如 Hugo。对新手和中文博客圈来说依然是最稳的选择之一。
三者最终产物都是静态文件,区别只在"你怎么写"和"构建多快"。站点一旦生成,托管方式完全一样。
四、把静态文件丢给 Nginx:最小配置
买台最低配 VPS(甚至 1 核 512M 都绰绰有余),装上 Nginx,把构建产物(Hugo 的 public/、Astro 的 dist/、Hexo 的 public/)丢进 /var/www/example.com,配一段最精简的 server 块即可:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
ssl_certificate /etc/ssl/example.com.cer;
ssl_certificate_key /etc/ssl/example.com.key;
gzip on;
gzip_types text/css application/javascript image/svg+xml;
location / {
try_files $uri $uri/ =404;
}
location ~* \.(css|js|png|jpg|svg|woff2?)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
}
}这段配置干了五件关键的事:① 80 端口统一 301 跳转到 HTTPS;② root 指向你的静态目录、index 设 index.html;③ 挂上 SSL 证书(配合上一篇文章的 acme.sh 自动续签);④ 开 gzip 压缩文本;⑤ 给静态资源(图片/JS/CSS)加一年长效缓存头,浏览器第二次访问直接读本地缓存,源站压力再降一截。try_files 那行保证访问目录时自动找 index.html,找不到就 404。
五、安全与性能:为什么几乎不可能被黑
静态站相对 WordPress 的好处,怎么夸都不为过:
- 攻击面极小:服务器上只有 Nginx 和操作系统,没有 PHP、没有数据库、没有后台登录页,黑客连"下手的地方"都难找。xmlrpc.php、wp-login 爆破、插件后门这些统统不存在。
- 资源占用极低:Nginx 读文件几乎不占 CPU,常驻内存就几 MB;1 核机器轻松扛上万并发(有缓存的前提下),再也不用担心 OOM Killer 半夜把你站点干掉。
- 回滚极简单:整站就是一堆文件,出了问题
git revert重新部署即可,不像 WordPress 要恢复数据库备份那么痛苦。 - 可被任意托管:除了自己 VPS 上的 Nginx,这些静态文件也能直接丢 Cloudflare Pages、GitHub Pages、Netlify 等,甚至完全免费、还能白嫖全球 CDN。
当然静态站不是银弹:需要登录态、用户评论、实时数据的功能(论坛、商城、带后端的表单)它原生做不了。但这类需求可以用"静态主体 + 外部服务"补:评论接 Giscus/Disqus,表单接 Formspree,搜索接 Algolia。对绝大多数个人博客和文档站,静态化已经完全够用。
六、GitHub Actions 自动化部署:push 即上线
最爽的姿势是把源码放 GitHub,本地写完 git push,GitHub Actions 自动构建并把产物 rsync 到你的 VPS,全程不用手动登服务器。下面以 Hugo 为例,给一段可直接用的 workflow(放仓库 .github/workflows/deploy.yml):
name: deploy
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Hugo
uses: peaceiris/actions-hugo@v3
with:
hugo-version: 'latest'
extended: true
- name: Build
run: hugo --minify
- name: Rsync to VPS
uses: burnett01/rsync-deployments@7.0.1
with:
switches: "-avzr --delete"
path: "public/"
remote_path: "/var/www/example.com"
remote_host: ${{ secrets.HOST }}
remote_user: ${{ secrets.USER }}
remote_key: ${{ secrets.SSH_KEY }}关键点说明:on.push.branches: [main] 表示推到 main 分支才触发;hugo --minify 构建并压缩产物到 public/;rsync 那步用 --delete 保证远程目录和本地一致(删掉的旧文件会被清掉)。在仓库 Settings → Secrets 里加三个变量:HOST(VPS IP 或域名)、USER(SSH 用户名,如 root)、SSH_KEY(VPS 上 ~/.ssh/authorized_keys 对应的私钥,建议专门建一个部署用的密钥)。
如果你用 Astro,把"Setup Hugo"换成装 Node + 构建:
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci && npm run build然后把 rsync 的 path 改成 dist/ 即可。Hexo 同理:npm ci && hexo generate,产物也是 public/。一个小建议:VPS 上给部署密钥只开最低权限,最好 chroot 或限制到 /var/www 目录,别用 root 的常用密钥,省得 GitHub 那边泄露了连累整台机器。
#VPS #静态网站 #Hugo #Astro #Hexo #Nginx #GitHubActions #WordPress替代 #建站