WordPress 太吃内存?用 Hugo/Astro 静态站 + Nginx 在 VPS 上极限建站:零被黑、并发上万、GitHub Actions 自动部署

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 的 VPSARM / 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替代 #建站