Ghost 博客这阵子在站长圈里讨论度确实高,很多人跑来问我:为什么放着WordPress不用,非要折腾Ghost?其实答案很简单——如果你对写作体验、页面加载速度和内容管理方式有要求,Ghost 和腾讯云CVM这个组合,几乎是目前性价比最稳的方案之一。我自己在腾讯云CVM上搭过不下十台Ghost,从最低配的1核1G到4核8G都试过,踩过的坑比大多数人见过的报错都多。今天这篇就把完整流程掰开揉碎讲清楚,新手照着做就行。
先说明一点:这儿的 Ghost 指的是开源的博客发布平台,跟老玩家常说的 Ghost 系统备份镜像完全是两码事。后者是把整块磁盘做成镜像,用来恢复系统;前者是一个基于 Node.js 的内容管理系统。如果你搜到的是"ghost系统备份"之类的教程,先退出来,确认你看的是 Ghost 官方文档,别搞混了。
这篇内容适合谁?刚买了腾讯云CVM不知道装什么的人、想从WordPress迁移出来的老站长、以及第一次接触Node.js技术栈但想快速搞定个人品牌站的新手。我会从服务器选型一直讲到HTTPS证书、日常备份,全部使用腾讯云CVM的实际操作路径,文中的命令和配置都是实测通过的版本。
1. 为什么要用 Ghost 写博客:它到底比WordPress强在哪
1.1 Ghost 解决的核心问题
WordPress 统治博客市场十几年,功能确实强大,但如果你只是老老实实写文章,WordPress 的插件机制、主题生态、数据库查询方式,会让一台1核2G的服务器跑起来有点喘。Ghost 的思路完全不一样——它只做内容发布这一件事,编辑器是类 Medium 的极简风格,后台没有任何花哨的设置项,你打开就是写文章、管理页面、看统计。
这种"少即是多"的设计带来的实际收益非常明显:页面平均响应时间比同配置下的WordPress快一个量级。我做过一个简单对比,同一台腾讯云CVM 2核4G,WordPress 带缓存插件跑分大约在 300ms 左右,Ghost 默认配置不带任何缓存插件,压测出来的平均响应在 120ms 上下。这背后的原因不复杂,Ghost 是 Node.js 写的,天然适合处理高并发 I/O,而且它默认没有 WordPress 那套插件钩子机制,每请求执行的 PHP 代码量少得多。
另一个关键点是内容存储方式。WordPress 把文章内容拆在 postmeta、posts、terms 等多张表里,数据一多查询就复杂;Ghost 用 SQLite 或 MySQL 存内容,结构更干脆。对写作者来说,Ghost 的编辑器体验更接近现代笔记软件,支持 Markdown 快捷键、拖拽上传图片,写作时不会被一堆按钮干扰。
1.2 谁适合用 Ghost,谁不适合
Ghost 的两个典型适用场景是:个人技术博客/知识付费站点,以及中小型内容团队的独立品牌站。如果你主要在微信公众号、知乎这些平台发文,但希望有一个自己的内容存档与分发出口,Ghost 足够;如果你想搭一个带会员订阅功能的新闻通讯站,Ghost 内置了会员系统,不需要额外装插件。
反过来说,如果你需要复杂的电商功能、论坛插件、在线课程系统,那 Ghost 不适合你——它就不是干这个的。这时候老老实实用 WordPress 或者直接用 SaaS 平台。别为了追求"高级感"硬上 Ghost,工具选型永远先看需求。
从成本角度算一笔账:腾讯云CVM 最便宜的轻量实例一年也就几百元,Ghost 本体开源免费,你只需付服务器和域名费用。相比之下,Ghost(Pro) 官方托管起步价一个月 11 美元,一年下来一千多人民币,自己在CVM上部署一年能省一半以上,还能顺带学一套 Node.js 部署流程,这笔账很划算。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 搭建前的服务器选型与账号准备
2.1 CVM 实例规格怎么选才不浪费钱
Ghost 官方文档给的最低配置是 1 核 512MB 内存,但这只是"能跑"的标准,实际使用会有点紧张。我给你的建议分三档:
- 纯写作、日均 UV 500 以下:1核2G,系统盘50G,带宽按量付费可调整。这个配置跑 Ghost + Nginx + MySQL 8.0,内存占用峰值大约 800MB,足够了。
- 有会员订阅、图片较多、日均 UV 2000 左右:2核4G,再加个 CDN 兜底,运行会很舒服。
- 打算做多站点或跑自动化任务:4核8G 起步,别亏待自己。
地域选择上,面向国内读者就选腾讯云的北京、上海、广州,离用户近,延迟低;如果读者主要在海外,选新加坡或硅谷节点。有一点提醒:腾讯云CVM国内节点必须完成备案才能绑定域名访问80/443端口,境外节点不用备案但访问延迟会高一些,这个要自己权衡。
腾讯云CVM购买时有个小坑——系统盘默认只有50G,Ghost 本身占用不大,但你的图片、数据库备份、Nginx 日志会慢慢膨胀。建议直接把系统盘加到100G,费用差异很小,但省掉后面扩容的麻烦。
2.2 系统镜像选哪个版本最省心
腾讯云CVM 的系统镜像有很多选择,Ghost 官方推荐的 Linux 发行版是 Ubuntu 和 Debian,我强烈建议你选 Ubuntu 22.04 LTS。原因很简单:Ghost 官方文档的安装命令全部基于 Ubuntu 测试,网上能找到的教程大部分也是 Ubuntu,真遇到问题搜索解决方案时命中率最高。CentOS 也能装,但 Ghost 的 systemd 服务配置和 Nginx 配置做起来要手动调整的地方更多,没必要为难自己。
如果你更偏好 Debian,选 Debian 12 也行,Ghost 官方同样支持,但注意 Debian 上 NodeSource 仓库的配置方式跟 Ubuntu 略有差异,后面安装 Node.js 时不要照搬 Ubuntu 命令。
购买时记得同时设置好 root 密码或密钥对。新手建议直接用密钥对,后面 SSH 登录比纯密码安全得多。腾讯云CVM控制台现在支持创建密钥对并绑定实例,操作路径在"控制台 -> 密钥对 -> 创建密钥对"。
3. 服务器基础配置:安全组、登录与域名
3.1 安全组规则:只开放必要端口
腾讯云CVM 默认的安全组策略比较保守,只允许通过 VNC 等控制台方式登录,你拿到机器后第一件事是配置安全组。这里说清楚安全组的概念:你可以把它理解成一台服务器门前的保安,决定哪些端口对外放行。端口就是门牌号,22号门是 SSH 远程登录,80号门是 HTTP 网页访问,443号门是 HTTPS 加密网页访问。
Ghost 博客场景下,我建议你在入站规则里放行以下端口:
| 端口 | 用途 | 建议策略 |
|---|---|---|
| 22 | SSH 远程管理 | 仅放行你的固定IP,或所有IP但配合密钥登录 |
| 80 | HTTP 网页访问 | 放行所有 IP |
| 443 | HTTPS 网页访问 | 放行所有 IP |
| 2368 | Ghost 默认开发端口 | 不需要对外放行,仅本机访问即可 |
| 3306 | MySQL 端口 | 绝对不要对外放行,仅限内网 |
腾讯云控制台操作路径:"云服务器 -> 安全组 -> 管理规则 -> 添加规则",协议选 TCP,端口填对应的数字,来源填 0.0.0.0/0 表示全网段。MySQL 那行来源建议填你的CVM内网IP段,千万别用 0.0.0.0/0,否则你的数据库相当于裸奔在网上。
3.2 域名解析与备案注意事项
Ghost 博客默认只支持通过域名访问,不支持直接用 IP 访问后台,所以域名是刚需。在腾讯云购买域名后,做两件事:
第一件事是 DNS 解析。在"云解析 DNS"控制台添加一条 A 记录,主机记录填 www 或 @,记录值填你CVM的公网 IP,TTL 默认 600 秒即可。解析生效时间通常几分钟到几小时不等,可以用 dig yourdomain.com 命令验证是否已经解析到你的CVM IP。
第二件事是 ICP 备案。如果你的CVM节点在中国大陆,必须备案后才能使用 80/443 端口提供服务。备案流程在腾讯云有专门的"备案"控制台入口,填写主体信息、上传证件、人脸核验,一般 10 到 20 个工作日完成。不想备案的话,把CVM区域选到中国香港或海外节点,但代价是访问延迟会升高,而且国内部分网络环境访问境外站点速度不太稳定。
有一点容易忽略:即使你只用 IP 访问 Ghost 的默认页面,Ghost CLI 在安装时也会要求你填一个域名,否则安装直接报错。所以域名这件事最好在动手安装 Ghost 之前就搞定。
4. 从零安装 Ghost 博客:完整实操记录
4.1 安装依赖环境:Node.js、MySQL、Nginx 一条龙
Ghost 的运行依赖三样东西:Node.js(运行环境)、MySQL(数据库)、Nginx(Web服务器)。我用的是 Ubuntu 22.04,下面的命令全部在这个版本下测试通过。
先更新系统包索引:
bash复制sudo apt update
sudo apt upgrade -y
然后安装 Nginx 和 MySQL:
bash复制sudo apt install nginx mysql-server -y
Ubuntu 22.04 自带的 MySQL 8.0 版本比较高,Ghost 对它支持得很完善,不需要手动改认证插件。安装完成后,MySQL 默认 root 用户使用 auth_socket 认证,Ghost 会要求创建一个专用数据库用户,后面说。
接着装 Node.js。Ghost 6.0 以后要求 Node.js 18 或 20,这里用 NodeSource 仓库来装,保证版本可控。先导入 NodeSource 的签名密钥和仓库:
bash复制curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install nodejs -y
装完后验证版本:
bash复制node -v
npm -v
正常情况下会输出 v20.x.x 和 10.x.x 之类的版本号。这一步如果网络不好导致 NodeSource 下载失败,可以试试换成国内 npm 镜像源(npm config set registry),但 NodeSource 仓库本身没有国内镜像,只能多试几次或稍后再试。
最后安装 Ghost CLI,这是部署 Ghost 的核心工具:
bash复制sudo npm install ghost-cli@latest -g
4.2 使用 Ghost CLI 初始化博客:一步步走完整个流程
Ghost CLI 会把安装过程封装得比较傻瓜化,但新手在几个交互选项上容易卡住。我先创建一个目录并分配权限:
bash复制sudo mkdir -p /var/www/ghost
sudo chown www-data:www-data /var/www/ghost
sudo su - www-data
cd /var/www/ghost
切换到 www-data 用户再去安装,这里有个重要原因:Ghost 官方明确禁止用 root 用户运行 ghost 命令,避免权限过大引发安全问题;同时 Ghost 需要以 www-data 用户运行才能与 Nginx 很好地协作。如果你用 root 直接 ghost install,安装程序会直接拒绝执行。
然后在 /var/www/ghost 目录下运行:
bash复制ghost install
安装程序会问几个问题,我按实际经验说明每个选项该怎么填:
- 输入你的博客 URL:这里要填
https://你的域名,不要填 IP。 - 是否迁移现有数据库?默认 No,我们是全新安装。
- MySQL hostname:默认 localhost 就行。
- MySQL 用户名/密码:这里需要一个能建库建表的用户,你可以在另一个 SSH 终端里提前建好:
bash复制也可以先留空给 Ghost 自动创建,但自动创建需要 root 的 auth_socket 权限,经常出问题,手动建更稳妥。sudo mysql CREATE USER 'ghost'@'localhost' IDENTIFIED BY '你自己设的强密码'; CREATE DATABASE ghost_db; GRANT ALL PRIVILEGES ON ghost_db.* TO 'ghost'@'localhost'; FLUSH PRIVILEGES; EXIT; - 是否设置 Systemd 管理 Ghost?输入 Yes。这样 Ghost 会注册成一个 systemd 服务,开机自启、崩溃自动重启,省心很多。
- 是否设置 Nginx 反向代理?这里要小心。如果你的服务器上还没有任何网站,可以输入 Yes 让 Ghost 自动配置;但如果你已经跑着其他站点,比如先搭了个 WordPress 或者静态站,建议输入 No,自己手动配 Nginx,否则 Ghost 可能会覆盖你已有的 server 块。
安装完成后,Ghost CLI 会检查所有依赖,如果有问题会给出具体提示,例如 Systemd is not running 或 MySQL is not running。我遇到的比较常见的报错是内存不足:1G 内存的机器在 npm install 阶段容易触发 OOM,解决办法是临时加一个 swap 分区:
bash复制sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
这个操作在低配CVM上很管用,装完后如果你不想保留 swap 可以再关掉,但建议留着,Node.js 进程在构建时偶尔还是会吃内存。
4.3 Ghost 配置文件的几个关键参数
安装完成后,主配置文件在 /var/www/ghost/config.production.json。我拆几个关键字段,都是之后排错经常要用到的:
json复制{
"url": "https://你的域名",
"database": {
"client": "mysql",
"connection": {
"host": "127.0.0.1",
"port": 3306,
"user": "ghost",
"password": "你设置的密码",
"database": "ghost_db"
}
},
"server": {
"host": "127.0.0.1",
"port": 2368
},
"paths": {
"contentPath": "/var/www/ghost/content"
}
}
url 字段必须跟你在浏览器里访问的地址完全一致,后面如果换域名,这个字段也要同步改,并要执行 ghost restart 生效。server.host 保持 127.0.0.1 固定监听本地,由 Nginx 做反向代理转发过去,不要改成 0.0.0.0,否则有安全风险。
如果你在配置里改了数据库密码或用户,改完不要直接重启 Ghost,先跑 ghost doctor 检查一遍配置是否有问题,这个命令会检查目录权限、配置格式、数据库连接等所有项目,比直接 restart 更能定位问题。
5. Nginx 反向代理与 SSL 证书配置
5.1 Nginx 配置详解:反向代理是怎么一回事
反向代理这个概念听起来技术感很强,用大白话解释就是:用户访问你的域名时,请求先到 Nginx 那里报到,Nginx 再把请求转给内网里的 Ghost 服务(127.0.0.1:2368)去处理。为什么要多绕这一层?因为 Nginx 处理静态文件、并发连接、HTTPS 加密都比 Node.js 直接做更专业,而且 Nginx 可以给 Ghost 挡掉很多恶意请求。
我建议关闭 Ghost 自动生成的 Nginx 配置,手写一份,这样每一步都清楚。配置文件放在 /etc/nginx/sites-available/ghost.conf,然后做软链接到 sites-enabled:
bash复制sudo ln -s /etc/nginx/sites-available/ghost.conf /etc/nginx/sites-enabled/ghost.conf
sudo nginx -t
sudo systemctl reload nginx
ghost.conf 的核心内容如下:
nginx复制server {
listen 80;
listen [::]:80;
server_name 你的域名;
client_max_body_size 50m;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.0.1:2368;
}
}
client_max_body_size 50m 是用来控制上传图片大小上限的,Ghost 后台支持直接拖拽上传图片,默认 Nginx 上传限制是 1MB,不调大这个值的话一张超过 1MB 的图片都会上传失败。Proxy 那几行是透传请求头,保证 Ghost 能拿到真实的客户端 IP 和请求协议。
如果你的 Ghost 站点还要跑 WebSocket(比如用于实时通知),需要在 location 里加一句:
nginx复制proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
不过默认 Ghost 没开 WebSocket 功能,只有你装了第三方主题或会员实时聊天插件时才有必要加。
5.2 免费 SSL 证书申请与自动续期
现在浏览器对 HTTP 站点越来越不友好,Ghost 后台本身也要求 HTTPS 才能正常使用部分功能。用腾讯云提供的免费 SSL 证书,或者用 Let's Encrypt 都行。腾讯云的免费证书有效期一年,可以手动续期,Le's Encrypt 证书有效期90天,但可以通过 acme.sh 自动续期,一劳永逸。
我更推荐用 acme.sh,因为腾讯云的免费证书审核流程虽然自动化了,但每年手动做一次也是很烦的事,acme.sh 配合 cron 自动续期,全程无感。安装 acme.sh:
bash复制curl https://get.acme.sh | sh -s email=你的邮箱
申请证书前确认 DNS 解析已经生效,然后执行:
bash复制~/.acme.sh/acme.sh --issue -d 你的域名 --nginx
这个命令会自动修改 Nginx 配置并完成域名校验,证书文件生成在 ~/.acme.sh/你的域名/ 目录下。拿到证书后,更新 Nginx 配置,加一个 443 端口的 server 块:
nginx复制server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name 你的域名;
ssl_certificate /root/.acme.sh/你的域名/fullchain.cer;
ssl_certificate_key /root/.acme.sh/你的域名/你的域名.key;
client_max_body_size 50m;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.0.1:2368;
}
}
改完配置后记得 sudo nginx -t 检查语法,然后 sudo systemctl reload nginx。同时在 80 端口的 server 块里加一句 301 跳转,把所有 HTTP 请求都转到 HTTPS:
nginx复制if ($scheme != "https") {
return 301 https://$host$request_uri;
}
acme.sh 默认会安装一个 crontab 任务来自动续期,你可以用 crontab -l 验证一下是否已经写入。基本上一劳永逸,之后不用再管证书的事。
6. 常见问题与排错套路
6.1 Ghost 安装失败的 6 个典型原因
我整理了一份高频问题速查表,都是自己在各种CVM上实际遇到过的:
| 现象 | 原因 | 解决方案 |
|---|---|---|
| 安装时提示 "Systemd is not running" | 你正在用 Docker 容器或虚拟环境 | 确认在真实CVM或虚拟机中运行,不要套 Docker |
| 安装时 npm install 卡死或报 OOM | 内存不足 | 添加 swap 分区,至少 2G |
| 安装时提示 "MySQL is not running" | MySQL 服务未启动或密码错误 | 先执行 systemctl status mysql 检查服务状态 |
| 安装时提示 "bcrypt" 或 "node-gyp" 编译失败 | Node.js 版本过新或过旧 | 用 nvm 切换到 Node.js 20 LTS,重新安装 |
| 访问网站时显示 502 Bad Gateway | Nginx 连不上 Ghost 进程 | 检查 ghost status 和 2368 端口是否在监听 |
| 后台登录显示 "This site can't be reached" | DNS 解析或安全组未放行 443 | 分别检查域名解析和安全组入站规则 |
有个新手很容易踩的坑:安全组放行了所有端口,但系统防火墙 ufw 是开启状态,没有放行 80/443。腾讯云CVM 默认 ufw 是关闭的,但如果你手动开过,记得执行:
bash复制sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
6.2 网站 502/504 的排查思路
502 是所有 Ghost 站长最常遇到的报错。先确认进程是否活着:
bash复制ghost status
如果显示 stopped,用 ghost start 启动并看日志。日志在 /var/www/ghost/content/logs/ 下,有时一个报错就能说明问题。
如果进程活着但依然 502,多半是 Nginx 配置问题。检查代理地址是否正确:
bash复制curl -I http://127.0.0.1:2368
如果这条命令返回 200,说明 Ghost 本身没问题,问题在 Nginx 到 Ghost 这段;如果返回连接拒绝,说明 Ghost 没监听在 127.0.0.1:2368。我遇到过一次改了 config.production.json 的 server.host 导致 Ghost 只监听 IPv6 地址,IPv4 的 curl 当然连不上,最后发现是配置文件里 host 写成了 ::1,改回 127.0.0.1 就好了。
504 则通常是数据库或反向代理超时,检查 MySQL 连接数和慢查询日志,看是不是数据库被大量并发请求打满了。Ghost 默认对文章没有内置缓存,如果流量突然上来,建议在 Nginx 层加一层 microcache:
nginx复制location ~* \.(html|css|js|png|jpg|jpeg|gif|ico|svg|webp)$ {
expires 7d;
add_header Cache-Control "public, no-transform";
}
图片等静态资源缓存到浏览器,能明显减轻后端压力。对于文章页,可以让 Nginx 做简单的 fastcgi 缓存或直接用 Ghost 的缓存插件,但新手阶段先把静态资源缓存配好就够了。
6.3 Ghost 后台进不去、主题上传失败怎么解决
Ghost 后台路径默认是 /ghost,登录后如果页面空白,大概率是 HTTPS 证书问题或浏览器缓存。先用无痕窗口访问一次,排除缓存干扰。
主题上传失败的情况,多数是因为 Nginx 的 client_max_body_size 没有调大,或者 Ghost 的 uploads 目录权限不对。检查一下目录权限:
bash复制sudo chown -R www-data:www-data /var/www/ghost/content
Ghost 6.x 版本还要求 Node.js 版本不低于 18,如果你用旧版系统镜像自带 Node 14,后台会出现各种诡异报错。腾讯云CVM 有些老镜像确实默认装了 Node 14,安装前务必先验证 node -v。
7. 上线后的日常维护与备份方案
7.1 Ghost 升级的正确姿势
Ghost 官方每个月都会发新版本,升级操作本身不复杂,但千万不能直接覆盖生产站点。我自己的流程是:
先登录服务器:
bash复制sudo -u www-data ghost update
Ghost CLI 会自动检查配置、备份数据库、拉取新版本、执行迁移、重启服务。但有几个细节要提前确认:
- 当前版本与目标版本之间是否跨大版本。跨大版本更新(比如 5.x 升 6.x)建议先在测试环境验证一遍,别直接生产操作。
- 确保磁盘剩余空间至少 2G,因为 npm 安装依赖时会占用较大空间。
- 升级前先手动备份一次数据库和内容目录,虽然 ghost update 会备份,但双保险总没错。
升级完如果发现首页样式乱了,先清一下浏览器缓存,因为这次升级通常伴随静态资源路径变化。如果清了缓存仍乱,可以回滚:ghost update --rollback 命令可以帮你回到上一个版本,需要提前确认目录里存在对应的备份文件。
7.2 数据备份:数据库加上 content 目录
Ghost 的数据分为两部分:内容数据存在 MySQL 里,上传的图片、主题、自定义路由配置在 /var/www/ghost/content 目录。备份方案可以分成两层:
第一层是数据库备份,用 mysqldump:
bash复制mysqldump -u ghost -p ghost_db > /var/backups/ghost_$(date +%F).sql
第二层是整个 content 目录打包:
bash复制tar -czf /var/backups/ghost_content_$(date +%F).tar.gz /var/www/ghost/content
这两条命令可以写成一个脚本,丢进 crontab 每天凌晨跑一次。备份文件最好同步到腾讯云COS对象存储,异地容灾,防止服务器磁盘坏掉导致数据全丢。腾讯云COS的 s3cmd 工具支持命令行上传,配置好密钥后几行命令就能把本地备份同步上去。
备份这件事我吃过亏:有一台测试服务器的数据库是 8.0 的,mysqldump 的 SQL 文件在恢复时因为 SQL 模式差异报错,折腾了一晚上才恢复。后来我把备份脚本加上一项——备份完成后自动执行一次恢复演练,用 mysql < backup.sql 导入到临时数据库检验文件完整性。这个习惯救了我两次,强烈建议你也加上。
7.3 日常性能调优:从内存到缓存
Ghost 的默认配置在低配机器上跑得不错,但如果你发觉后台操作变卡,可以先看内存使用情况:
bash复制free -h
如果内存长期在 90% 以上,考虑调大 swap 或升级实例。如果内存正常但访问速度上不去,瓶颈大概率在图片加载,图片优化是最简单有效的提速手段。Ghost 后台本身不对上传的图片做压缩,建议你先压缩图片再上传,或者搭配腾讯云COS做对象存储并开启图片压缩功能。
另一个值得做的优化是给 Ghost 设置一个持久连接的代理缓冲:
nginx复制proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
这几个参数控制 Nginx 缓冲后端响应的方式,在新手站点上对稳定性很有帮助。
我自己的经验是:Ghost 博客的瓶颈很少出现在 Ghost 本身,多出现在图片体积和数据库慢查询上。图片压缩做好、数据库定期清理幽灵数据,一台2核4G的CVM跑几万篇文章一点问题没有。
8. 一个容易被忽略的细节:安全加固
8.1 SSH 登录加固
腾讯云CVM 创建时如果选择了密码登录,拿到机器后第一件事就是改默认 SSH 配置。用密钥登录是最基础的一步,如果坚持用密码,至少设置一个 20 位以上的复杂密码,字符、数字、大小写混着来。另外强烈建议修改 SSH 默认端口,从 22 改成四位数以上的高位端口,能挡住绝大多数脚本扫描:
bash复制sudo vim /etc/ssh/sshd_config
# 修改 Port 2222
sudo systemctl restart sshd
改完后记得在安全组里把 2222 端口放行,然后再决定是否关闭 22 端口。这个顺序很重要,反了会把自己锁在外面。
8.2 MySQL 与 Nginx 最小权限
MySQL 只监听本机地址,不要监听外网。查看监听状态:
bash复制ss -lntp | grep 3306
如果显示 0.0.0.0:3306,必须在 MySQL 配置文件里加一行 bind-address = 127.0.0.1 然后重启 MySQL。数据库账号只给 Ghost 用的库授权,不要给 ALL PRIVILEGES 到所有库。
Nginx 的 worker 进程默认以 www-data 用户运行,这个默认已经很安全。但 Phantom 和 Ghost 的缓存目录权限要注意,不要为了省事直接 chmod 777,给 www-data 用户属主就够了,我之前见过有人把整个 /var/www/ghost 目录 chmod 777 然后被植入挖矿脚本的案例,事后处理麻烦到怀疑人生。
8.3 定期查看安全日志
最后说一个低成本高收益的习惯:每周花两分钟看一眼认证日志。
bash复制sudo grep "Failed password" /var/log/auth.log | wc -l
如果数字大得离谱,说明你的 SSH 正在被暴力破解,主要是端口被扫了。防御方式一是修改 SSH 端口,二是安装 fail2ban:
bash复制sudo apt install fail2ban -y
fail2ban 会在连续密码失败后自动封禁 IP,默认配置就能用,装上后省心很多。
说实话,Ghost 博客的安全加固不需要做到企业级,把 SSH 端口改掉、数据库不对外监听、目录权限给对,这几件事做完你已经比绝大多数博客安全了。剩下的交给时间,遇到问题翻日志就好。
9. 把 Ghost 跑起来之后的几个扩展玩法
博客搭好只是开始。Ghost 本身是个很克制的平台,但配合生态里的工具可以做不少事情。
如果你想把博客从静态站点生成器(比如 Hugo、Hexo)迁移过来,Ghost 提供完整的 Content API,可以写个脚本把 Markdown 文件批量导入后台。迁移时注意图片链接要同步搬运,否则文章里的图全会裂。
如果你不想自己维护服务器,Ghost 支持直接导出全部内容再导入 Ghost(Pro) 托管,这个过程很流畅,内容不会丢失,适合后期不想折腾服务器的人。
配合会员订阅功能,你可以把 Ghost 当 Newsletter 工具用,不用再单独买 Mailchimp 或类似服务。会员后台自带邮件发送队列,免费额度对个人站点完全够用。
如果嫌默认主题太素,到 Ghost 官方市场下载一个付费主题,或者直接自己在默认主题基础上改 CSS。Ghost 的主题文件结构比 WordPress 简单得多,一个熟悉前端的人半天就能上手改出自己风格的页面。我自己用的是默认主题加自定义字体和配色,改完效果完全不输那些几百美元的主题。
这些扩展操作有一个共同前提:先把基础站点跑稳,别在博客还没上线就折腾各种插件和主题,基础没打好后面全乱。Ghost 的优势就在于它能让你专注内容,扩展功能按需加就行。
结合我这几年用 Ghost 的体会,最深的感受是:它把"写博客"和"维护网站"这两件事彻底分开了。你不需要懂 PHP、不需要理解数据库表结构、不需要折腾插件冲突,要做的只是登录后台、写文章、点发布。技术上省下的精力,全都能花在内容本身上,这才是 Ghost 最值钱的地方。如果你正打算在腾讯云CVM上起一个自己的博客,照着这篇文章操作,一两个小时之内就能看到自己的网站跑起来。
