在 VPS 上搭建博客:Hexo 静态部署与宝塔、1Panel 安装 WordPress

拥有一台 VPS 之后,最适合用来练手的项目之一就是个人博客。它既能帮助我们理解域名、DNS、Linux、Nginx 和 HTTPS,又能真正得到一个长期可用的网站。

但“在 VPS 上搭博客”并不是只有一种方法。最常见的两条路线是:

  • Hexo 静态博客:在本地把 Markdown 生成 HTML,再由 VPS 上的 Nginx 提供访问;
  • WordPress 动态博客:在 VPS 上运行 Web 服务器、PHP 和数据库,通过浏览器后台写作和管理网站。

如果你还不清楚 VPS、虚拟机、KVM 和云服务器之间的关系,可以先阅读上一篇:

VPS、虚拟机与云服务器:从虚拟化原理看懂云产品

本文先帮助你在 Hexo 和 WordPress 之间做选择,再分别介绍两条部署路线。WordPress 部分会重点说明如何使用宝塔或 1Panel 降低操作门槛,以及使用服务器面板时不能忽略的安全责任。

一、先决定:静态博客还是动态博客

选择建站方式之前,先问自己一个问题:你更需要简单、快速和易备份,还是更需要浏览器后台和丰富的扩展功能?

1. Hexo:提前生成所有网页

Hexo 是静态站点生成器。文章以 Markdown 文件保存,构建时被转换成 HTML、CSS 和 JavaScript。访客打开文章时,Nginx 直接返回已经生成好的文件,不需要临时执行 PHP,也不需要查询数据库。

优点:

  • 结构简单,资源占用低;
  • 攻击面相对较小;
  • 文章是普通文件,配合 Git 很容易备份和回滚;
  • 静态页面非常适合浏览器缓存和 CDN;
  • 同一份源码可以部署到 VPS、GitHub Pages 或 Cloudflare Pages。

限制:

  • 写作和发布通常依赖本地编辑器、Git 和构建流程;
  • 搜索、评论、表单和会员功能往往需要第三方服务;
  • 不太适合多位作者直接在网页后台协作写作。

2. WordPress:访问时由程序生成页面

WordPress 是内容管理系统(CMS)。文章和设置通常保存在 MySQL 或 MariaDB 中,PHP 根据访问请求读取数据并生成页面。管理员可以直接登录网页后台写文章、上传图片、安装主题和插件。

优点:

  • 可视化后台成熟,可以随时在线写作;
  • 主题和插件生态丰富;
  • 更容易增加评论、搜索、表单、会员和电商功能;
  • 适合多人编辑和传统内容网站。

限制:

  • 需要维护 PHP、数据库、WordPress、主题和插件;
  • 动态程序的攻击面更大,必须持续更新和备份;
  • 插件堆叠可能带来性能、兼容和安全问题;
  • 迁移时不仅要复制文件,还要正确处理数据库和域名替换。

3. 四种常见部署方案对比

方案 运维难度 自由度 动态功能 适合谁
GitHub Pages / Cloudflare Pages + Hexo 依赖外部服务 纯内容博客、熟悉 Git 的用户
VPS + Nginx + Hexo 依赖外部服务 想掌控服务器和发布流程
VPS + WordPress 手动部署 很高 完整 熟悉 Linux、PHP 和数据库
VPS + 面板 + WordPress 完整 希望图形化管理服务器的新手

只发布文章,并且愿意使用 Markdown 和 Git,优先考虑 Hexo;需要网页后台、多人协作或丰富插件,选择 WordPress。管理面板不是第三种博客程序,它只是帮助你管理 VPS 和安装 WordPress 的工具。

二、开始之前:VPS、域名与本地环境

无论选择哪条路线,都建议提前准备:

  • 一台拥有公网 IP 的 KVM VPS;
  • 一个可以修改 DNS 记录的域名;
  • 可正常登录服务器的 SSH 客户端;
  • 新安装的、受维护的 Linux 系统;
  • 一份服务器登录信息和恢复方式的离线记录。

VPS 配置怎么选

单个低流量 Hexo 静态博客对服务器要求很低,1 vCPU + 1 GB 往往可以起步。WordPress 还需要 PHP、数据库,安装管理面板后也会多一些常驻服务,因此 2 vCPU + 2 GB 或更高配置通常更从容。

这只是起步参考,不是硬性标准。复杂主题、图片处理、统计插件、搜索插件和访问量增长都会提高资源占用。除了 CPU 和内存,还要关注机房线路、磁盘 I/O、月流量、备份和公网 IPv4 费用。

域名要先做什么

在 DNS 服务商处添加 A 记录,将准备使用的域名指向 VPS 公网 IPv4:

1
2
3
类型:A
名称:blog
目标:你的 VPS 公网 IPv4

这样最终访问地址就是 blog.example.com。只有服务器已经正确配置 IPv6 时才添加 AAAA 记录;错误的 AAAA 记录可能导致一部分访客连接失败,也会影响证书验证。

三、路线 A:使用 Nginx 部署 Hexo 静态博客

推荐让本地电脑或 CI 负责构建,让 VPS 只负责提供生成后的静态文件。

1
2
3
4
5
6
7
本地 Markdown / Git 仓库
↓ 构建
Hexo public 目录
↓ 发布
VPS 上的 Nginx
↓ HTTPS
访问者

这种结构的好处是职责清晰:文章源码由 Git 保护,VPS 即使损坏,也可以从仓库重新生成和发布网站。

1. 初始化服务器

下面以 Ubuntu 或 Debian 为例, CentOS 的配置一样,只是语法不同。首次登录后更新系统,创建日常管理用户:

1
2
3
apt update && apt upgrade -y
adduser blogadmin
usermod -aG sudo blogadmin

把本地 SSH 公钥加入 blogadmin~/.ssh/authorized_keys,如果没有该文件,使用以下命令创建:

1
2
sudo mkdir -p /home/blogadmin/.ssh
sudo nano /home/blogadmin/.ssh/authorized_keys

设置权限:

1
2
3
sudo chmod 700 /home/blogadmin/.ssh
sudo chmod 600 /home/blogadmin/.ssh/authorized_keys
sudo chown -R blogadmin:blogadmin /home/blogadmin/.ssh

然后修改 /etc/ssh/sshd_config 文件,将登录策略由密码登录变为通过密钥对登录:

1
2
3
4
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes # 先保持 yes,避免锁死自己
PermitRootLogin no # 可选,建议关闭 root 登录
PubkeyAuthentication yes # 使用密钥对进行登录

如果只是对 blogadmin 用户修改登录策略,可在文件中追加:

1
2
3
Match User blogadmin
PasswordAuthentication no
PubkeyAuthentication yes

完成之后,重启 sshd 服务 sudo systemctl restart ssh 即可生效。

确认新用户可以使用密钥登录后,再考虑关闭 root 远程登录和密码认证。不要在密钥尚未验证时直接关闭密码登录,否则可能把自己锁在服务器外。如果对Linux系统不熟悉,就使用系统默认设置即可,不要修改配置。

安装 Nginx 和防火墙:

1
2
3
4
sudo apt install -y nginx ufw
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

云服务器用户还需要检查服务商控制台中的安全组。安全组和系统防火墙是两层规则,任意一层没有放行都会导致无法访问。

2. 在本地生成 Hexo 静态文件

在 Hexo 项目根目录运行:

1
2
3
4
npm ci
npx hexo clean
npx hexo generate
npx hexo server

浏览器打开 http://localhost:4000,确认文章、主题、链接和图片正常。构建结果位于 public 目录。

如果项目没有锁文件或 npm ci 报错,可以先运行 npm install 生成或更新 package-lock.json,确认构建成功后把锁文件一起提交到 Git 仓库。

3. 在 VPS 创建站点目录

1
2
sudo mkdir -p /var/www/myblog
sudo chown -R blogadmin:blogadmin /var/www/myblog

从 Windows PowerShell 上传 public 中的文件(注意:这里只包括 public 中的文件,不要包括 public 自身):

1
scp -r .\public\* blogadmin@服务器IP:/var/www/myblog/

这条命令适合首次发布。频繁更新时,可以改用 rsync、GitHub Actions 或其他 CI/CD 做增量和自动发布。不要把 SSH 私钥、云平台密钥或环境变量提交到公开仓库。

4. 配置 Nginx (以下内容只针对静态网页)

创建 /etc/nginx/sites-available/myblog.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80;
listen [::]:80;
server_name blog.example.com;

root /var/www/myblog;
index index.html;

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

location ~* \.(css|js|svg|png|jpg|jpeg|webp|ico|woff2?)$ {
expires 7d;
add_header Cache-Control "public";
try_files $uri =404;
}
}

将新配置文件添加到 nginx 中,启用配置并检查语法:

1
2
3
sudo ln -s /etc/nginx/sites-available/myblog.conf /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl reload nginx

注意:上面的 myblog.conf 文件可以随意命名,但是 /etc/nginx/sites-available 和 /etc/nginx/sites-enabled 这两个路径是固定的
如果默认站点与域名冲突,可以在确认自定义站点配置正确后,移除默认站点的启用链接。

5. 申请 HTTPS 证书

确认域名已经解析到 VPS,并且 80、443 端口可以从公网访问,然后安装 Certbot:

1
2
3
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d blog.example.com
sudo certbot renew --dry-run

Certbot 会申请证书并修改 Nginx 配置。完成后访问正式域名,检查 HTTPS、文章路径、图片和静态资源是否正常。自动续期也应定期检查,不能只看首次申请成功。

6. Hexo 的日常更新流程

以后发布文章时,可以按下面的顺序操作:

1
2
3
4
npx hexo clean
npx hexo generate
npx hexo server
scp -r .\public\* blogadmin@服务器IP:/var/www/myblog/

正式维护时,最好把上传步骤改成自动化部署,并确保删除旧文章后服务器上不会残留过期文件。源 Markdown、主题配置和依赖锁文件应持续保存在 Git 仓库中。

四、为什么还会有人选择 WordPress

Hexo 很轻,但它的“轻”来自于把工作放到了本地构建阶段。当你希望随时在浏览器中写作、让多位作者登录后台、通过插件增加搜索和表单,或者不愿意每次修改文章都执行构建和上传时,WordPress 会更符合传统内容管理系统的使用习惯。

手动部署 WordPress 需要安装和配置 Nginx 或 Apache、PHP、MySQL 或 MariaDB、HTTPS、计划任务、缓存与备份。对于熟悉 Linux 的用户,这些工作并不困难;但是对第一次使用 VPS 的用户而言,任何一层配置错误都可能让网站无法访问。

这正是服务器管理面板存在的意义:它没有消除运维,而是把大量命令行操作包装成图形界面。

五、宝塔和 1Panel 分别是什么

使用过 3x-ui 的朋友应该能够了解,3x-ui 其实就是图形化配置 sing-box 或 x-ray 的面板,这里的宝塔和 1Panel 其实也就是图形化配置 Linux 操作系统的图形化面板。

1. 宝塔面板

宝塔是国内使用较广的 Linux 服务器管理面板。它可以在网页中管理网站、Nginx 或 Apache、PHP、MySQL、文件、证书、计划任务和防火墙。官方文档提供了 LNMP 环境安装以及 WordPress 自动部署流程。

它的优势是中文资料多,传统 PHP 网站管理方式直观;需要注意的是,不同功能可能分布在免费版、付费版或插件中,安装前应查看当前版本说明和用户协议。

2. 1Panel

1Panel 同样提供中文可视化服务器管理。网站功能以 OpenResty 等组件为基础,应用商店可以部署 WordPress、数据库以及其他常见应用。WordPress 应用通常以容器方式组织,便于查看运行状态、参数和备份。

它的优势是界面现代、容器与应用编排思路清晰;代价是你仍需要理解容器端口、数据卷、数据库和反向代理,否则排错时容易只看到“应用运行中”,却不知道访问链路的哪一层出现了问题。

3. 面板怎么选

对比项 宝塔面板 1Panel
常见部署思路 传统 LNMP / LAMP、PHP 项目 OpenResty、运行环境、容器化应用
WordPress 方式 建站环境或自动部署 应用商店安装并创建网站
使用习惯 接近传统虚拟主机管理 接近现代应用与容器管理
适合用户 熟悉 PHP 建站概念、看重中文教程 希望统一管理容器和多类应用
共同责任 更新、备份、权限、安全和恢复仍由站长负责 更新、备份、权限、安全和恢复仍由站长负责

只搭一个 WordPress 博客时,两者都可以胜任。最好根据自己更容易理解的管理方式选择一个,不要在同一台服务器上同时安装宝塔、1Panel 或另一套预装 Web 环境,否则端口、数据库和配置可能互相冲突。

六、路线 B:使用面板安装 WordPress

面板版本会更新,按钮名称也可能变化,但从域名到网站上线的实际链路基本不会改变。

第 1 步:准备纯净系统

优先选择面板官方支持的 Linux 发行版,并从新装系统开始。先确认:

  • 域名可以修改 DNS;
  • VPS 拥有公网 IP;
  • SSH 可以正常登录;
  • 80 和 443 端口没有被其他服务占用;
  • 服务器内存和磁盘留有余量;
  • 已经创建首次快照或准备好重装方案。

不要在已经运行重要网站或手动配置了复杂 Web 环境的服务器上直接试装面板。

第 2 步:从官方文档安装面板

安装命令可能随版本和操作系统变化,应始终从官方网站复制,不要使用论坛、网盘或不明脚本中的“一键安装命令”。

安装完成后,终端通常会显示面板地址、端口、安全入口和初始登录信息。把这些信息保存在安全位置,不要截图公开分享。

第 3 步:先保护管理面板

第一次登录后,不要急着安装 WordPress。先完成面板自身的安全设置:

  1. 修改管理员用户名和高强度密码;
  2. 开启多因素认证(如果当前版本支持);
  3. 修改默认端口和安全入口;
  4. 使用防火墙或云安全组限制面板端口来源;
  5. 为面板本身启用可信 HTTPS 证书;
  6. 保留可用的 SSH 密钥登录,防止面板故障后无法维护服务器。

修改端口和隐藏入口只能减少自动扫描噪声,不能替代系统更新、强密码、访问控制和多因素认证。

第 4 步:安装 WordPress 运行环境

使用宝塔

宝塔通常有两种思路:

  • 安装 LNMP 或 LAMP 环境,再创建 PHP 站点、数据库并部署 WordPress;
  • 使用官方提供的 WordPress 自动部署流程,同时准备网站和运行环境。

第一次操作时,优先选择稳定版本的 Nginx、PHP 和 MySQL/MariaDB,不要仅为了追求版本数字而选择测试环境。具体步骤参考:宝塔 WordPress 自动部署教程

使用 1Panel

在应用商店中搜索并安装 WordPress,按页面设置应用名称、数据库服务、数据库名称、用户、密码和内部端口。然后在“网站”中通过一键部署或已安装应用创建站点,绑定正式域名。

除非有明确调试需要,不要把 WordPress 应用端口或数据库端口直接暴露到公网;正常访问应经过面板管理的 OpenResty 和 HTTPS 网站入口。具体步骤参考:1Panel 可视化安装 WordPress

无论使用哪个面板,最终都包含这些部分:

1
2
3
4
5
6
7
8
9
域名与 HTTPS

Nginx / OpenResty / Apache

PHP 运行环境

WordPress 程序

MySQL / MariaDB 数据库

WordPress 官方推荐使用受支持的现代 PHP、MariaDB 或 MySQL,并为站点启用 HTTPS。不要为了兼容来历不明的旧主题或插件,长期停留在已经停止安全维护的运行环境版本。

第 5 步:绑定域名并开启 HTTPS

确保域名已经解析到 VPS,然后在面板中创建网站或绑定 WordPress 应用。域名生效后,再通过面板的 ACME/Let’s Encrypt 功能申请证书,并开启 HTTP 到 HTTPS 跳转。

证书申请失败时依次检查:

  1. A/AAAA 记录是否指向当前服务器;
  2. 80 和 443 是否同时被云安全组与系统防火墙放行;
  3. 是否存在错误的 IPv6 记录;
  4. CDN 代理是否影响当前验证方式;
  5. 域名是否达到证书签发频率限制。

不要把 WordPress 的应用端口、PHP-FPM 端口或数据库端口当作网站公网端口开放。公网通常只需要 80、443,以及经过限制的 SSH 和面板管理端口。

第 6 步:完成 WordPress 初始化

打开正式域名,根据向导设置站点标题、管理员账号、密码和邮箱。管理员用户名不要使用容易猜到的 admin,密码不要与面板、数据库或其他网站重复。

进入 WordPress 后台后先完成固定链接、时区、站点地址等基础设置,再逐步安装主题和插件。一个插件能解决问题,不代表十个同类插件会让网站更好;插件越多,更新、性能和兼容风险通常越高。

第 7 步:配置缓存和图片优化

博客速度不只取决于 VPS 配置。通常应先处理:

  • 把大尺寸图片压缩为 WebP 或 AVIF 等适合网页的格式;
  • 避免同一功能安装多个缓存或优化插件;
  • 为静态文件设置合理的浏览器缓存;
  • 访问者距离机房较远时再考虑 CDN;
  • 优化前记录加载时间,避免只凭感觉调整。

CDN 可以缓存图片和静态资源,也能隐藏部分源站流量,但它不能修复慢查询、插件冲突或已经被入侵的服务器。

七、先配置备份,再开始写文章

Hexo 和 WordPress 的备份对象不同。

Hexo 需要备份什么

  • Markdown 文章;
  • source 中的图片和附件;
  • 主题与 _config.yml 配置;
  • package.jsonpackage-lock.json
  • 自定义脚本和部署配置。

这些内容适合使用 Git 仓库保存。public 是可重新生成的构建产物,不应成为唯一副本。

WordPress 需要备份什么

  • 数据库:文章、用户、设置和插件数据;
  • wp-content:图片、主题和插件;
  • Web 服务器与站点配置;
  • 必要时包含整个应用或面板快照。

WordPress 不能只复制网站目录而忽略数据库,也不能只导出数据库而遗漏上传图片。

备份的三条底线

  1. 不要只保存在同一台 VPS。 磁盘损坏、误删或账号问题可能同时毁掉网站和本地备份;
  2. 设置保留周期。 至少保留多个时间点,避免最新备份已经包含误操作或恶意代码;
  3. 定期恢复验证。 面板显示“备份成功”不等于文件一定完整可用。

可以把备份同步到对象存储、另一台服务器、WebDAV 或本地设备。云快照适合快速回滚,但不应成为唯一的异地备份。

八、使用宝塔或 1Panel 时的安全清单

管理面板拥有控制网站、文件、数据库甚至终端的高权限。一旦面板账号失守,影响通常比单个 WordPress 账号失守更大。

上线前至少完成下面这些设置:

  • 只从宝塔、1Panel 和 WordPress 官方渠道下载与更新;
  • 系统、面板、WordPress、主题和插件保持更新;
  • 面板端口尽量限制为自己的固定 IP、VPN 或可信网络访问;
  • SSH 使用密钥,确认密钥可用后再限制密码和 root 登录;
  • 面板、WordPress、数据库使用不同的强密码;
  • 删除不用的主题、插件、测试站点和数据库账号;
  • WordPress 后台和服务器面板都使用 HTTPS;
  • 数据库不直接暴露到公网;
  • 定期检查登录日志、磁盘空间、证书状态和异常进程;
  • 更新或安装插件前先备份,并确保备份能够恢复。

图形界面里的“安装成功”,只代表服务开始运行,不代表服务器已经安全、网站已经优化或者备份一定可靠。

九、常见问题排查

1. 域名解析正确,但网站打不开

依次检查:

  • 服务商安全组是否放行 80 和 443;
  • Linux 防火墙是否放行 80 和 443;
  • Nginx、OpenResty 或 Apache 是否正在运行;
  • 网站是否绑定了正确域名;
  • AAAA 记录是否指向不可用的 IPv6 地址。

2. Hexo 首页能打开,文章或图片 404

确认 Hexo _config.yml 中的 urlroot,检查 public 是否包含相应文件,并确认上传时没有多套一层 public 目录。

3. WordPress 提示数据库连接失败

检查数据库容器或服务是否运行,数据库名称、用户名、密码和主机地址是否一致。容器部署中数据库主机经常是服务名,而不是 localhost,应以面板生成的配置为准。

4. 修改站点地址后无法进入 WordPress 后台

通常是 WordPress 地址、站点地址、反向代理或 HTTPS 配置不一致。修改前先备份数据库,不要在不理解影响时同时更改域名、目录和 HTTPS 设置。

5. 安装插件后网站白屏或报错

先停用刚安装的插件,查看 PHP 和 Web 服务器日志;恢复失败时使用安装前备份。不要通过反复刷新或继续安装其他插件来碰运气。

6. 点击文章链接不生效

通常修改配置文件 /etc/nginx/sites-available/myblog.conf 能够解决,但根源在于本地 hexo 生成静态页面的配置文件 _config.yml 的设置问题。

1
2
3
4
5
permalink: posts/:abbrlink.html

pretty_urls:
trailing_index: false
trailing_html: false

十、到底应该选择哪条路线

可以按下面的方式判断:

  • 只写文章、熟悉 Markdown 和 Git:优先选择 Hexo + GitHub Pages / Cloudflare Pages;
  • 想学习 Linux,并完全掌控静态站点:选择 VPS + Nginx + Hexo;
  • 希望直接在网页后台写作,需要评论、表单或多人协作:选择 WordPress;
  • 想用 WordPress,但暂时不熟悉命令行运维:选择一台 KVM VPS,再使用宝塔或 1Panel;
  • 不愿维护服务器、数据库和安全更新:选择托管型 WordPress,而不是自建 VPS;
  • 博客已经产生稳定收入或有明确可用性目标:再考虑托管数据库、对象存储、CDN、多节点或专业运维。

最终选择的不是“最先进”的架构,而是你愿意长期维护的架构。

十一、结语

Hexo 把主要复杂度放在构建和发布流程,WordPress 把复杂度放在运行环境、数据库、更新和安全上。宝塔与 1Panel 能降低操作门槛,却不会消除服务器管理责任。

对个人站长而言,稳妥的成长路线往往是:先用 Pages 平台熟悉域名和内容发布,再用 VPS + Nginx 理解服务器,最后根据实际功能需求决定是否使用面板安装 WordPress。每一次升级架构,都应该解决一个真实问题,而不是为了让技术栈看起来更复杂。

参考资料