阅读 1559

Ghost 搭建博客小记

前言

点击 我用 Ghost 搭建的博客 查看成品示例。

早就听说 Ghost 的大名了,不过一直都是处于观望状态。主要是想等 Ghost 各方面再成熟一些,所以迟迟没有行动。最近听闻 Ghost 已经放出了 v1.0.0 版本,在这一里程碑版本中加入了全新的 Ghost-CLI,不论从维护还是配置都变得非常优雅简捷。于是决定用心水了很久的 Ghost 给自己一个全新的开始。

这篇文章详细的记录了我在搭建博客时的流程以及踩到的坑。文章写得比较用心,真心希望可以给有同样需求的读者提供小小的帮助。

索引

  • Ghost 简介
  • 准备工作
  • 搭建环境
  • Ghost 安装与配置
  • 全站 Https
  • CDN 优化
  • 总结

Ghost 简介

Ghost 是一款非常出色的开源博客平台,无论是从架构、设计、易用性,它都要比 Wordpress 要好,界面简洁,专注写作,支持在线预览,在线写作,无论您是在哪里,都可以去写博客,尽情的享受写作带来的快感。

Ghost 最早于 2012 年 11 月初在项目创始人 John O'Nolan 的 博客文章 中提出。@John O'Nolan 曾任名 WordPress 的 UI 界面团队副主任,他提出 Ghost 平台的目的就是为了取缔复杂臃肿的 WordPress。

Ghost 内容默认支持 Markdown 语法书写。Markdown 是一种具有纯文本格式语法的轻量级标记语言,它可以让作者更专注于创作而不必为繁杂的格式分心。

Ghost 是动态博客,页面并非 HexoJekyll 这类静态博客那样在编译时生成。Ghost 区分站点和控制台(可以理解为前后台),我们可以在控制台进行站点配置,创作和发布文章等工作。

Ghost 的优势和劣势

找到一篇 2015 年的 sf文章 里面是这么评论 Ghost 的优劣的:

优势

  • 技术上,采用 NodeJs,在可预见的未来里,无疑比 PHP 有更多优势,并发能力远超 Wordpress,虽然 NodeJs 后期维护成本高,但是我们只是借它做博客而已。
  • 易用性上,专注写作,评论,超炫皮肤,完美支持 Markdown,没有 Wordpress 那么臃肿,回归到博客最原始的状态,传递文字最原始的力量。
  • 使用上,便捷,随时随地编辑,比 Hexo, Jekyll 这类静态博客要书写方便,特别是在不同电脑上写作时。

劣势

  • 需要配套支持 Node 环境的虚拟机,一般免费的很少支持,这时必须得掏腰包了。
  • 后台简陋,许多功能还未完善,不过写作这一块没啥大问题。

不过毕竟是 2015 年时的点评,今日 Ghost 已经放出了 v1.0.0 版本,后台功能该有的都有了,还有很多新颖的功能处于测试阶段都放在后台的 Labs 下供大家试用,不过插件比较少这倒是真的。

Ghost v1.0.0 新特性

Ghost 在 v1.0.0 中新加入了 Ghost-CLI,它可以帮助我们安装和配置 Ghost,使得 Ghost 之后的更新维护变得相当优雅简捷。

例如升级 Ghost 只需要:

  1. 备份重要数据
  2. ghost update

嘛~ 我们甚至不用去停止 Ghost 就直接可以更新了!

而且有了 Ghost-CLI 之后我们再也不需要使用 npm 命令去操作 ghost 咯,日常维护博客的命令将会变得非常优雅(比如 ghost startghost restart 等)~

补充一下,在之前的版本中,运行 Ghost 需要使用 npm start --production 命令。通过 npm 启动不仅不够优雅,而且还有一个致命缺点,即当你关闭终端窗口或者从 SSH 断开连接时,Ghost 就停止了。为了防止 Ghost 停止工作,还需要另找解决方案。

在将来,v1.0.0 之后的版本与之前的版本相差将会越来越远,墙裂建议大家用 v1.0.0 之后的 Ghost 版本搭建 Blog(通过 Ghost-CLI 安装 Ghost 哟)。

而对于之前已经使用 Ghost 的前辈们,在此献上 官方迁移指南

准备工作

Ghost 官方推荐的配置:

For installing on production, we officially recommend the following stack & server setup:

  • Ubuntu 16.04
  • MySQL
  • NGINX
  • Systemd
  • Node v6 installed via NodeSource
  • At least 1GB memory (swap can be used)
  • A non-root user for running ghost commands

Ubuntu 16.04 是唯一官方支持的操作系统。其他操作系统可能也可以运行 Ghost,但官方无法协助调试或优化。

Digital Ocean(此链接是我的个人优惠链接,通过此链接进入 DO 注册会拿到 10 刀)是官方推荐的服务器提供商,推荐大家在 Digital Ocean 上面买 VPS 搭建博客(相比于阿里云等国内服务器的优点在于访问 80 端口无需备案,可以搭建 ss 实现科学上网等)。

添加交换内存

如果你的 VPS 系统的内存不足 1GB,可能会遇到错误。为了克服这个,执行下面的命令来配置更大量的交换内存:

dd if=/dev/zero of=/var/swap bs=1k count=1024k
mkswap /var/swap
swapon /var/swap
echo '/var/swap swap swap default 0 0' >> /etc/fstab
复制代码

搭建环境

1.创建并切换到新用户

由于 Ghost 官方推荐我们不使用 root 用户直接操作,所以这里提供创建新用户并为其配置权限的命令:

$ adduser <user>
$ usermod -aG sudo <user>
$ su  -  <user>
复制代码

这是一个安全措施。如果 Ghost 遭到破坏,我们的系统将是安全的。

2.chkconfig

chkconfig 在 Linux 下管理服务/启动项在各个系统运行级别中的设置,在 Linux 中系统有 7 个运行级别,分别是:

  • 运行级别0:表示关机
  • 运行级别1:表示单用户模式
  • 运行级别2:无网络连接的多用户命令行模式
  • 运行级别3:有网络连接的多用户命令行模式
  • 运行级别4:暂不可用
  • 运行级别5:带图形界面的联网多用户模式
  • 运行级别6:重新启动

本文中我们只需要知道 chkconfig 可以帮助我们实现开启自启动就可以了。

$ sudo apt-get install sysv-rc-conf
$ sysv-rc-conf --list
$ alias chkconfig=sysv-rc-conf  
$ chkconfig --list
复制代码

3.Node.js

Node.js 是用于通用编程的 JavaScript 平台,允许用户快速构建网络应用程序。通过利用前端和后端的 JavaScript,开发可以更一致,并在同一系统中进行设计。

安装 Node.js

Ubuntu 16.04 在其默认存储库中包含一个 Node.js 版本,可用于轻松提供跨多个系统的一致体验。

输入以下命令,安装 Node.js 和 npm,即 Node.js 包管理器。

$ sudo apt-get update
$ sudo apt-get install -y nodejs
$ sudo apt-get install npm
复制代码

Note: 由于与另一个包冲突,调用 Ubuntu 存储库中的可执行文件默认为 nodejs 而不是 node。

解决方法:

$ ln -s /usr/bin/nodejs /usr/bin/node
复制代码

验证安装结果

$ node -v
复制代码

如果输出 Node.js 的版本则说明安装成功。

4.Nginx

Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及一个 IMAP / POP3 代理服务器。 Nginx 以其高性能,稳定性,丰富的功能集,简单的配置和低资源消耗而闻名。在大多数情况下,它比 Apache 更加资源友好。

安装 Nginx

输入以下命令安装 Nginx。

$ sudo apt-get update
$ sudo apt-get install nginx
复制代码

调整防火墙

UFW(Uncomplicated Firewall)是一个 iptables 的接口,旨在简化配置防火墙的过程。虽然 iptables 是一个坚实而灵活的工具,但初学者很难学习如何使用它来正确配置防火墙。

Ubuntu 默认安装了 UFW,下面的命令可以查看防火墙的状态。

$ sudo ufw status
复制代码

如果你没有也不想开启防火墙,则可以直接跳过此步骤,如果你想要开启防火墙可以通过以下命令实现。

$ sudo ufw enable
复制代码

之后再次检查防火墙状态验证是否成功开启防火墙。

在我们测试 Nginx 之前,我们需要重新配置我们的防火墙软件以允许访问该服务。安装时,Nginx 将自动在 UFW 注册,我们可以用下面的操作来查看。

$ sudo ufw app list
复制代码

不出意外会显示:

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  ...
复制代码
  • Nginx Full:此配置文件打开端口 80(正常,未加密的Web流量)和端口 443(TLS / SSL加密流量)
  • Nginx HTTP:此配置文件仅打开端口 80(正常,未加密的Web流量)
  • Nginx HTTPS:此配置文件仅打开端口 443(TLS / SSL加密流量)

我们需要确保防火墙允许 HTTP 和 HTTPS 连接。

$ sudo ufw allow 'Nginx Full'
复制代码

Note: 如果你有在 VPS 上搭建 SS 进行科学上网,那么需要 sudo ufw allow <ss port> 来允许科学上网,里面的 <ss port> 就是你之前配置 ss 的端口号。

验证 Nginx 是否正常工作

最简单有效的检验方式就是在浏览器中通过域名或者 IP 地址访问你的 VPS,如果 Nginx 正常启动则会打开 Welcome to nginx 的欢迎页面。

开启自启动 Nginx

$ chkconfig nginx on
复制代码

熟悉 Nginx 重要的文件和目录

我觉得我有必要在这里列出 Nginx 比较重要的文件和目录,而你也应该花几分钟来熟悉一下它们。

内容:

  • /var/www/html: Web 内容(默认情况下仅包含我们之前看到的默认 Nginx 页面),可以通过更改 Nginx 配置文件来更改。

服务器配置:

  • /etc/nginx: Nginx 配置目录,所有 Nginx 配置文件都在这里了。
  • /etc/nginx/nginx.conf: 主要的 Nginx 配置文件,对 Nginx 全局配置进行更改。
  • /etc/nginx/sites-available/: 可以存储每个站点“服务器块”的目录。Nginx 不会使用此目录中找到的配置文件,除非它们链接到 sites-enabled 目录(见下文)。通常,所有服务器块配置都在此目录中完成,然后通过链接到另一个目录来启用。
  • /etc/nginx/sites-enabled/: 存储启用每个站点“服务器块”的目录。通常,这些是通过链接到目录中找到的配置文件创建的 sites-available。
  • /etc/nginx/snippets: 此目录包含 Nginx 配置中可以包含的配置片段。

服务器日志:

  • /var/log/nginx/access.log: 对于您的 Web 服务器的每个请求记录都会保存在此日志文件中,除非 Nginx 配置为其他方式。
  • /var/log/nginx/error.log: 任何 Nginx 错误都将记录在此日志中。

配置 Nginx

$ vi /etc/nginx/conf.d/ghost.conf
复制代码

配置内容可以参考我的:

server {
    listen 80; # 如果你配置了 SSL 就用 443,否则就写 80
    server_name lision.me; #这里写你的域名或者ip地址

    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_pass         http://127.0.0.1:2368;
    }
}
复制代码

5.MySql

MySQL 是一种开源数据库管理系统,通常作为流行的 LAMP(Linux,Apache,MySQL,PHP / Python / Perl)堆栈的一部分安装。它使用关系数据库和 SQL(结构化查询语言)来管理其数据。

安装 MySql

安装的步骤很简单:更新软件包索引,安装 mysql-server 软件包。

$ sudo apt-get update
$ sudo apt-get install mysql-server
复制代码

Note: 安装过程中会要求你给 MySql 的 root 用户配置密码,配完请妥善保存。

配置 MySQL

对于新安装的 MySql,需要运行附带的安全脚本。这会更改一些不太安全的默认选项,例如远程 root 登录和示例用户。在旧版本的 MySQL 上,您还需要手动初始化数据目录,但现在已经可以自动完成。

$ mysql_secure_installation
复制代码

Note: 运行安全脚本需要 root 密码,输入密码后配置各项。这里推荐大家第一项选 1,后面的按 “Enter” 做默认选择就好。

测试 MySql

输入以下命令来查看 MySql 的服务状态:

$ systemctl status mysql.service
复制代码

结果正常会提示:

● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: en
   Active: active (running) since Thu 2017-10-19 14:27:24 CST; 7min ago
 Main PID: 17694 (mysqld)
   CGroup: /system.slice/mysql.service
           └─17694 /usr/sbin/mysqld
复制代码

开机自启动 MySql

$ chkconfig mysql on
复制代码

扩展配置

为了避免数据库存放的中文是乱码,我们还需要设置 Mysql 的编码:

$ vi /etc/my.cnf
复制代码

复制粘贴以下内容:

[client]
default-character-set=utf8  
[mysql]
default-character-set=utf8  
[mysqld]
character-set-server=utf8  
collation-server=utf8_general_ci
复制代码

保存退出,重启 Mysql 生效:

$ service mysql restart
复制代码

建立 Ghost 数据库

以 root 身份登录 MySql,然后创建一个名为 ghost 的数据库并验证创建结果:

$ mysql -u root -p;
mysql> create database ghost;
mysql> show databases;
mysql> exit
复制代码

Ghost 安装与配置

上文提到 Ghost v1.0.0 之后加入了 Ghost-CLI,用它来安装维护 Ghost 可以更加优雅简捷。

1.安装 Ghost-CLI

$ sudo npm i -g ghost-cli
复制代码

安装成功的话会提示一个安装完毕的目录结构(树形图)。

下一步我们需要创建一个文件夹,之前介绍过 Nginx 的重要文件结构 /var/www/ 就是我们将要创建文件夹的地方:

$ sudo mkdir -p /var/www/ghost
复制代码

Note: 在 /root 文件夹中安装 Ghost 将无法正常工作,导致设置错误!

之后配置权限:

# [user] 是我们在安装阶段创建的用户
$ sudo chown [user]:[user] /var/www/ghost
复制代码

然后进入我们刚才创建的文件夹:

$ cd /var/www/ghost/
复制代码

Note: 请确保 /var/www/ghost/ 这个文件目录是空的。

2.用 Ghost-CLI 安装 Ghost

$ ghost install
复制代码

更多命令请查阅 Ghost-CLI 命令

Node.js 版本不符

Node.js 的版本不符,我目前的 Ghost 由于是最新版本,需求的 Node.js 版本与我环境中的不符合。

解决办法:使用 nvm 替换 Node.js 版本。

安装 nvm

除了 apt 之外,安装 Node.js 的另一种方法是使用一个专门设计的工具 nvm(Node.js Version Manager)。

通过使用 nvm,我们可以安装多个独立版本的 Node.js,这将允许我们更轻松地控制我们的环境。它可以让我们按需访问 Node.js 的最新版本,同时也可以使用应用程序可能依赖的先前版本。

$ sudo apt-get update
$ sudo apt-get install build-essential libssl-dev
复制代码

安装必备软件包后,可以从项目的 GitHub 页面下拉 nvm 安装脚本。版本号可能不同,但一般来说,可以通过 curl 下载脚本并运行:

$ curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh -o install_nvm.sh
$ bash install_nvm.sh
复制代码

要访问 nvm 的功能,需要重新注销并登录,或者我们可以导出 ~/.profile 文件,以便当前的会话更新:

source ~/.profile
复制代码

现在有了 nvm,可以开始管理 Node.js 版本。

管理 Node.js 版本

要查找可用于安装的 Node.js 的版本,可以键入:

$ nvm ls-remote
复制代码

会 OutPut 出来茫茫多的 Node.js 可用版本:

         ...
         v8.5.0
         v8.6.0
         v8.7.0
复制代码

按照刚才的错误提示安装符合要求的 Node.js 版本,设置为默认版本并切换过去(我这里是 4.8.4):

$ nvm install 4.8.4
$ nvm alias default 4.8.4
$ nvm use default
复制代码
验证 Node.js 版本
$ node -v
复制代码

之后可以回到 /var/www/ghost/ 目录重新安装 Ghost。

“two version of Node” 错误

如果提示 two version of Node 这个问题在 Ghost 的 Github 中有人提到了 throws two version of Node error,我在写这篇文章的时候作者还没有解决,不过回退到 Ghost-CLI v1.0.3 可以解决。

$ sudo npm i -g ghost-cli@1.0.3
复制代码

安装过程中失败怎么办

如果安装错误,我们可以使用 ghost uninstall 指令来删除它,然后重试。

3.配置 Ghost

如果上面在 /var/www/ghost/ 目录下运行 ghost install 成功的话,会让你配置一些东西:

你可以根据需要进行简单的配置。如果配置之后后悔了也不要紧,我们可以去文件中进行配置:

$ vi config.production.json 
复制代码

打开之后就是我们的生产环境配置内容了。

Note: 对应于 production 环境还有一个文件是 config.development.json 文件,该文件是配置开发环境的。我们如果拿 Ghost 作为博客来写就无需理会这个文件了,它主要用于调试 Ghost。

配置对照表

Name Required Description
url only in production Set the public URL for your blog
admin no Set the protocol and hostname for your admin panel to be different.
mail only in production Add a mail service so that Ghost can send emails such as forgotten password and user invite emails
database only in production The type of database that Ghost uses. This is configured to sqlite3 by default and does not need editing
server no Host and port, or socket for Ghost to listen on
privacy no Disable the Ghost features listed in PRIVACY.md, e.g. update check, rpc ping, and google fonts
paths no Customise Ghost's internal paths, e.g. to the content directory
maintenance no Transform your blog into maintenance mode.
referrerPolicy no Control the content attribute of the meta referrer tag.
useMinFiles no Generate assets url with .min notation.
storage no Set a custom storage adapter, read more here Using a custom storage module
scheduling no Set a custom scheduling adapter, read more here Using a custom scheduling module
logging no Configure logging for Ghost.
spam no Configure spam settings.
caching no Configure caching settings.

配置内容

大家可以先参考我的配置来配(请无视我的 SPLATOON2 壁纸),等以后熟悉了再去按照自己的需求对照上面的配置表进行深度配置。

{
  "url": "http://lision.me/",
  "server": {
    "port": 2368,
    "host": "127.0.0.1"
  },
  "database": {
    "client": "mysql",
    "connection": {
      "host": "127.0.0.1",
      "user": "root",
      "password": "lision",
      "database": "ghost",
      "charset": "utf8"
    }
  },
  "mail": {
    "transport": "Direct"
  },
  "logging": {
    "transports": [
      "file",
      "stdout"
    ]
  },
  "process": "systemd",
  "paths": {
    "contentPath": "/var/www/ghost/content"
  }
}
复制代码

如果大家想按照自己的需求去做配置,建议大家去 官方配置文档。这里面东西比较细,且不一定每个人都适用,考虑到篇幅原因这里不过多介绍。

4.测试 Ghost

如果成功的安装 Ghost 之后,我们就可以通过域名访问到我们的博客了,第一次进入博客时会要求做一些简单的配置。

配置完毕再次访问域名就可以进入我们的博客了,里面已经预置了一些帮助你快速上手 Ghost 的文章。

我们可以通过域名后面接 /ghost/ 来进入控制台,这里可以对博客进行配置(主题等),也可以创作、管理文章,enjoy!

全站 Https

这一部分内容在 官方文档有提及。上面指明 CLI 可以通过 Let's Encrypt 生成一个免费的证书。CLI 还将生成第二个 NGINX 配置文件,以通过端口 443 提供 https 流量。

Let's Encrypt

Let's Encrypt 提供浏览器免费接受的SSL证书!这是由非盈利性互联网安全研究小组(ISRG)提供的。

获取 Let's Encrypt 提供的 SSL 免费证书

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto
复制代码

执行之后会让你输入邮箱,并且选择一些选项。我搭建博客时选项分别是:

  • 是否同意把一些邮件信息共享
  • 为哪些域名生成 SSL
  • 是否把 Http 请求重定向到 Https

不知道会不会变,总之根据自己的需要一个接一个选完就可以了。

如果一切顺利,会提示:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/lision.me/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/lision.me/privkey.pem
   Your cert will expire on 2018-01-17. To obtain a new or tweaked
   version of this certificate in the future, simply run
   letsencrypt-auto again with the "certonly" option. To
   non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
复制代码

脚本自动获取 SSL 证书

嘛~ SSL 是申请配置好了,但是很快就过期了(90 天),有什么办法能延长期限呢?

lets-encrypt Github 地址

里面有中文使用说明。

CDN 优化

CDN (content delivery network or content distribution network) 是代理服务器及其数据中心的地理分布式网络。目标是相对于最终用户在空间上分配服务,以提供高可用性和高性能服务。 CDN 服务于当今互联网的大部分内容,包括网络对象(文字,图形和脚本),可下载对象(媒体文件,软件,文档),应用程序(电子商务,门户网站),直播流媒体,点播流媒体和社交网络。

如果我们的博客有很多质量很高的图片或者其他多媒体(比如教程视频等)就会拖慢我们的网站访问速度,这时可以通过 CDN 优化来加快我们的站点访问速度。

我这里使用了七牛 CDN 云服务,因为考虑到七牛 CDN 对国内支持比较友好,加上它还自带一些我比较需要的服务(比如图片水印和原图保护)。

  • 申请七牛 CDN 账号
  • 建立存储对象
  • 配置图片样式(压缩,水印,原图保护)
  • 上传自己文章中用到的精选配图
  • 输出外链
  • 引入到自己的 Markdown 文章中

检测网站载入速度

配置好 CDN 服务之后建议使用 Google PageSpeed Insights(支持模拟移动设备测试)跑分,它不仅可以检测你的站点打开速度,还可以给你提供改善的建议。

总结

在浩瀚无垠的互联网中,终于有了一个属于我们自己的空间。

用心创作每一篇文章,是我对这个空间的温柔。

参考文章


补充~ 我建了一个技术交流微信群,想在里面认识更多的朋友!如果各位同学对文章有什么疑问或者工作之中遇到一些小问题都可以在群里找到我或者其他群友交流讨论,期待你的加入哟~

Emmmmm..由于微信群人数过百导致不可以扫码入群,所以请扫描上面的二维码关注公众号进群。

关注下面的标签,发现更多相似文章
评论