如何使用 Ghost 搭建博客网站


序言

自从微博、微信成为大家主要的沟通工具,并随着 Web 3.0 概念的产品不断出现,博客作为 Web 2.0 初期的产物早已不再是大家分享信息的首选工具了。但是博客作为形式更正规和内容更丰富的内容载体,仍旧不失为记录和分享的好地方。喜欢记录和分享内容的人应该不会拒绝自己拥有一个美观的博客网站。

支撑一个博客网站可以有很多种方式和工具。其中,现在有一些平台可以提供博客服务。对于不想折腾的人来说,应该首选使用这种开箱可用的 PaaS 服务。对于另外的有一定技术实力并想要更多个性化服务和内容的人来说,自建网站是个不错的选择。本文旨在带领您按步骤使用 Ghost Blog 开源项目自建博客网站。

Ghost 程序基于 Node.js 编写,采用 MIT 许可证开放源代码,用户可以在它的官方网站自由下载和使用它。Ghost 的设计主旨是简化个人网站发布以及网上出版的过程。 它的网站上列出了与其它博客系统的区别,在响应速度、Markdown 语法支持度、付费会员功能和内容订阅功能等方面它有一些优势。虽然 Ghost 的插件和主题并没有最热门的 WordPress 项目那样的丰富普及,但是相信仍旧可以找到一些优雅的主题来展示您的内容。Ghost 的安装过程相对有一定的难度,如果您仍旧想要安装使用 Ghost,那么请确认满足下面的前提条件并在本站和其官方网站的指引下开始安装设置吧。

前提

知识储备

  • Linux 基本操作命令
  • NGINX 安装和配置文件编写
  • MySQL 数据库安装和维护
  • Javascript 基本语法(非必要)

运行环境

  • 1G 以上内存的独立主机(可以是 VPS)
  • Linux(建议为 Ubuntu 16.04 / 18.04 / 20.04)
  • NGINX(1.9.5 以上版本)
  • Node.js (16.x 版本)
  • MySQL(5.7 / 8.0 版本)
  • 可以自定义 DNS A(AAAA)记录的域名

部署方式

官方的安装指南列出了多种方法,它们分别是:

  1. 在 Linux ( Ubuntu )上部署生产环境
  2. 使用 Docker 容器部署生产环境
  3. 在本地计算机上部署开发环境
  4. 使用源代码部署开发环境
  5. 在云平台上部署预制生产或开发环境

我的目标是将 Ghost 部署在生产环境下,并可以做一些轻量的代码修改。第二种方式使用 Docker 部署相对比较简单和安全,但是运行性能会受影响,并且不方便做代码修改。因此,我选择了第一种方式。

步骤

安装 Ubuntu 操作系统

官方建议使用 16.04、18.04 和 20.04 三个版本。我选择安装了 20.04 版。如果当前不方便重新安装操作系统,其它版本的 Linux 多数也是可以使用的,只是在后期的使用过程中可能会出现部分功能不兼容的问题。我使用 Debian 安装过 Ghost,除了在安装过程中受到兼容性提示以外,使用中未遇到异常情况。

安装 Linux 运维面板

为了更方便地安装和管理 NGINX、MySQL 和 Node.js,我安装了宝塔服务器运维面板,并通过运维面板安装了:

  • NGINX 1.20.2 (当时最新版)
  • MySQL 8.0.24 (当时最新版)
  • Node.js 16.15.0 (官方推荐版本当时最新版)
  • 系统防火墙 3.1 (当时最新版)
  • NGINX 免费防火墙 6.6 (当时最新版)

新建 Ghost 安装运维专用用户

为了系统安全,Ghost 不允许使用系统最高权限 ROOT 用户来安装,需要通过以下命令另设用户,

# 通过 SSH 登录服务器
ssh root@your_server_ip

# 根据提示新建用户
adduser <user>

# 为新建用户增加管理员权限
usermod -aG sudo <user>

# 通过新建用户登录服务器
su - <user>

注意:新用户不要起名为 ghost,这样会和 Ghost 自行建立用来运行实例进程的用户名冲突。

确认 Node.js 环境变量添加正确

使用新用户登录后,

echo $PATH

如果环境变量中没有类似 /www/server/nodejs/v16.15.0/bin/ 的内容,则需要编辑环境变量文件为新用户添加(注意修改相应位置为实际的路径),

vim /etc/environment

提示:Vim 操作命令

安装 Ghost-CLI

使用新建用户安装和运行 Ghost-CLI,今后 Ghost 的运维主要依靠 Ghost-CLI 的命令实现。

sudo npm install ghost-cli@latest -g

安装完成后可以使用 ghost 命令测试一下安装是否正确,

如果看到 Run 'ghost help' for usage ,则安装正常。

使用 MySQL 建立数据库

在宝塔的数据库栏目中,使用添加数据库功能,

  • 数据库名:根据自己的需要设置。
  • 用户名:根据自己的需要设置。
  • 密码:根据自己的需要设置,可以用系统自动生成的密码。
  • 类型:MySQL。
  • 访问权限:本地服务器。
  • 添加至:本地服务器(127.0.0.1)。

安装 Ghost

使用新用户登录,并创建用来安装 Ghost 的目录,

# 创建目录: 可根据需要修改 `sitename` 为期望的名称
sudo mkdir -p /www/wwwroot/sitename

# 设置目录所有者: 将 <user> 修改为先前创建的用户名
sudo chown <user>:<user> /www/wwwroot/sitename

# 设置目录权限
sudo chmod 775 /www/wwwroot/sitename

# 进入目录
cd /www/wwwroot/sitename

开始安装 Ghost,

ghost install

根据提示,输入相应参数,

  • Blog URL:博客的网址,格式为 http://yourdomain.com。如果希望使用使用更安全的 SSL 访问方式(本站使用此方式),则需要填写为 https://yourdomain.com。(yourdomain.com 修改为实际网站的域名)
  • MySQL hostname:数据库地址,填入localhost
  • MySQL username / password:数据库用户名和密码,填入先前新建的数据库相关信息。
  • Ghost database name:数据库名,填入先前新建的数据库相关信息。
  • Set up a ghost MySQL user? :是否新建数据库独立用户,输入否 no
  • Set up NGINX?:是否设置 NGINX,输入否 no
  • Set up SSL?:是否设置 SSL,如果遇到这条也输入否no
  • Set up systemd?:是否设置 systemd,输入是yes
  • Start Ghost?:是否启动 Ghost,输入是yes

如果一切顺利,此时 Ghost 实例已经成功运行了。根据默认配置,实例开放了 2368 或 2369 端口。可以通过 Ghost-CLI 确认下实例的运行状态,

ghost ls

正常情况下应该得到类似下面的反馈表格,

NameLocationVersionStatusURLPortProcess Manager
yourdomain-com/www/wwwroot/ghost5.2.3running (production)https://yourdomain.com2368systemd

此时,虽然 Ghost 已经成功运行起来了,但是我们在设置好 NGINX 前还没法访问它。

使用 NGINX 配置网站

在宝塔的网站栏目中,使用添加网站功能(PHP 项目分页),

  • 域名:填入yourdomain.com,与 Blog URL 中的名称一致。
  • 备注:网站备注,可为空。
  • 根目录:可接受系统默认生成的目录,如/www/wwwroot/yourdomain.com
  • FTP:不创建。
  • 数据库:不创建。
  • PHP 版本:纯静态。
  • 网站分类:默认分类,或自行设置。

创建成功后,点击网站名称进入站点修改界面,修改 SSL 配置,选择合适的证书签发机构并按照提示完成证书申请部署。宝塔 SSL 和 Let's Encrypt 都可以免费申请。

完成 SSL 配置后,修改配置文件,在server语句前添加反向代理需要的流,

upstream ghostcms {
  server 127.0.0.1:2368;
}

删除以下内容,

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log /dev/null;
        access_log /dev/null;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log /dev/null;
        access_log /dev/null;
    }

保存修改后,在反向代理界面继续添加反向代理

  • 代理名称:ghostcms,或其它期望的名称。
  • 目标 URL:http://127.0.0.1:2369(端口号须与实例发布端口一致)。
  • 发送域名:$host。
  • 内容替换:留空。

添加成功后,进入该反向代理的配置文件编辑界面,使用以下代码完整替换界面中的内容并保存,

#PROXY-START/
location ^~ /
{
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header HOST $host;
  proxy_set_header X-NginX-Proxy true;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://ghostcms;
}
#PROXY-END/

现在,使用浏览器访问 https://youdomain.com/ghost 就可以看到 Ghost Admin 管理页面了。

后记

  • 为了网站的安全,在成功完成 Ghost 安装运行后,应使用宝塔提供的防火墙限制不安全的访问请求,仅向外部开放有限的、必需的端口。
  • 在 NGINX 的反向代理设置中使用 upstream 方式可以解决部分浏览器在访问 Ghost 时循环跳转的问题。
  • 在安装 Ghost-CLI 前务必确认 Node.js 的模块目录已添加入新用户的环境变量中。
  • 一些主题模板在处理帖子发布时间时使用了toLocaleDateString方法,通过判断document.documentElement.lang变量来决定输出内容,该变量由本地化文件的文件名决定并在管理页面的Settings > General > Publication Language中设置。对于中文,此变量应为zh-CN
  • NGINX 免费防火墙可能会拦截一些后台管理页面的请求,如果遇到访问某个页面总是造成整个网站无法访问的情况,请检查防火墙日志并把符合这个请求的 URL 添加进入 URL 白名单中。