Ghost 博客搭建踩坑记录

之前买的阿里云只跑了几个简单的脚本,实在是有点亏,了解 Ghost 也有一段时间了,正好趁着这个机会折腾一下。之前的博客系统是用的 Bitcron,一个专注写作的平台,你不需要配置服务器之类的,甚至可以不买域名,emmm......这次踩的坑还是有点多的,好在最后成功了,舒服~

索引

  1. 前期准备
  2. 购买服务器
  3. 申请域名
  4. 安装Nginx
  5. 安装Mysql
  6. 安装Node.js
  7. 安装Ghost-CLI
  8. 安装Ghost
  9. 其他设置
  10. 我遇到过的问题
  11. 参考资料

前期准备

截止到本文发布时间,Ghost 版本为 2.9.1,Ghost-CLI 版本为 1.9.8,Ghost 官方建议的前期准备是:

  • Ubuntu 16.04 or Ubuntu 18.04
  • NGINX (minimum of 1.9.5 for SSL)
  • A supported version of Node.js
  • MySQL 5.5, 5.6, or 5.7 (not >= 8.0)
    Systemd
  • A server with at least 1GB memory
  • A registered domain name

其中要求最少 1G 内存,如果不够用的话,可以通过设置 Swap 分区来解决这个问题。因为我是够用的,所以就没设置这个。设置 Swap 分区可参考这篇文章。
以下顺序并不是唯一正确顺序。

购买服务器

官方建议的服务器是Ubuntu 16.04或者Ubuntu 18.04,这样 Ghost-CLI 可以帮你配置好所有的东西。我买的是阿里云服务器 ECS,系统是centos_7_04_64。经过测试,除了 Nginx 不能自动配置外,其他的也是可以自动配置的,所以只要手动配置好 Nginx 就可以了。

申请域名

有很多域名服务商都可以购买域名,比如我之前在 Namesilo 上买过一个,优点是.com很便宜,这次是在阿里云上买的。域名购买成功之后需要进行域名解析,工信部域名备案、公安网备案等操作。其中工信部备案时间比较久,这一步在阿里云上操作就可以了,这期间可以先进行域名解析和其他的配置工作。其中公安网备案需要你的网站能成功访问之后才能备案成功,所以这一步是最后做的。最后备案成功之后要把两个备案号放到网站底部。这里面有个安全组规则一定配置一下,登录阿里云后台 -> 云服务器 ECS,在网络与安全里面,有个安全组,点击配置规则,之后点击添加安全组规则。把 443 和 80 端口配置进去,要不然外部无法访问这个域名。

安装Nginx

官方建议的 Nginx 版本最小为 1.9.5,因为配置 SSL 必须要 >= 这个版本。首先进入自己购买的服务器。以下所有操作无特别说明都是在自己服务器操作。

ssh root@ip

在 /etc/yum.repos.d/ 目录下创建一个源配置文件 nginx.repo

vi /etc/yum.repos.d/nginx.repo

写入以下内容:

[nginx] 
name=nginx repo 
baseurl= http://nginx.org/packages/centos/$releasever/$basearch/ 
gpgcheck=0 
enabled=1

centos 用的是yum,yum 是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。如果是其他系统,要使用相应的包管理工具,比如Ubuntu用的是apt-get

yum install nginx -y

启动 Nginx,这里 systemctl 是一个 systemd 工具,主要负责控制 systemd 系统和服务管理器。在 Linux 生态系统中,systemd 被部署到了大多数的标准 Linux 发行版中,只有为数不多的几个发行版尚未部署。

systemctl start nginx

这个时候在浏览器中输入你的服务器的IP地址可以看到提示:“Welcome to Nginx!”,成功之后设置开机启动 Nginx

Nginx chkconfig nginx on 

安装Mysql

官方建议的版本是 5.5, 5.6, or 5.7,但是不要大于 8.0。我这里安装的是 5.7,其中有个修改密码的问题可自行搜索解决。

安装Node.js

安装 Node 有多种方法,最好是安装官方推荐的版本

安装Ghost-CLI

Ghost-CLI 可以帮你更好的管理 Ghost。

sudo npm i -g ghost-cli

安装Ghost

创建用户

创建一个非 root 的用户是必须的,Ghost-CLI 将在这个用户下工作。用户名不能为 ghost,否则会冲突。

adduser <user>

设置密码

passwd <user>

赋予 /etc/sudoers 文件写权限:

chmod -v u+w /etc/sudoers

编辑文件:

vim /etc/sudoers

为了使该用户在使用 sudo 命令时需要不需要输入密码:找到下面这一句并添加:

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

<user>    ALL=(ALL)       NOPASSWD:ALL

保存退出,并恢复 /etc/sudoers 文件权限:

chmod -v u-w /etc/sudoers

配置

切换到上面创建好的那个用户:

su - <user>

创建网站目录并设置权限:

sudo mkdir -p /var/www/ghost
sudo chown <user>:<user> /var/www/ghost
sudo chmod 775 /var/www/ghost

之后进入到网站目录

cd /var/www/ghost

安装

直接执行:

ghost install

等待过后会问几个问题,URL 为购买成功的域名

? Enter your blog URL: https://lzcdev.xyz

MySQL hostname 就写 localhost即可

? Enter your MySQL hostname: (localhost)

MySQL username 写 root

? Enter your MySQL username: root

之后输入密码

? Enter your MySQL password: 

直接回车使用默认的数据库名称

? Enter your Ghost database name:

创建 mysql 用户填 n

? Do you wish to set up "ghost" mysql user? n

设置 nginx 也填否,之后会手动配置。如果是 Ubuntu 这里填 Y

? Do you wish to set up Nginx? n

设置系统服务填 Y

? Do you wish to set up Systemd? Y

启动 Ghost 暂时填 n,等之后配置好了 Nginx 再启动

? Do you want to start Ghost? (Y/n)

配置 Nginx

新建 Ghost 配置文件:

sudo vim /etc/nginx/conf.d/ghost.conf

写入配置,下面是我的配置,其中带有# managed by Certbot是通过 Certbot 自动配置的,为的是配置Https

server {
    server_name lzcdev.xyz www.lzcdev.xyz;

    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_pass         http://127.0.0.1:2368;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
    }

    listen 443 ssl http2 default_server; # managed by Certbot
    ssl on;
    ssl_certificate /etc/letsencrypt/live/lzcdev.xyz/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/lzcdev.xyz/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = www.lzcdev.xyz) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = lzcdev.xyz) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name lzcdev.xyz www.lzcdev.xyz;
    return 404; # managed by Certbot
}

保存退出,重启 nginx 服务:

sudo systemctl restart nginx

启动 Ghost

sudo systemctl start ghost_lzcdev-xyz

假如启动失败,可通过 ghost doctor 以及 ghost log 根据提示查看日志。如果有解决不了的问题,首先去社区查看有没有类似的问题,没有的话可以发帖提问。我也是踩了无数次坑才成功。

可正常访问,则将该服务设置为开机启动:

sudo systemctl enable ghost_lzcdev-xyz

其他设置

更换主题

登录网站后台 https://xxx.xxx/ghost,SEETINGS -> Design,点击 Upload a theme 把主题的压缩包传进去,点击 active 激活就可以了。我目前用的主题是 kaldorei

优化等设置

Ghost 高级设置
博客跑分优化

我遇到过的问题

新版本与旧版本冲突

我最早是安装的 0.x 版本的 Ghost,那个时候还没有 Ghost-CLI 这么方便的工具。当时启动 Ghost是手动控制的,假如断开 SSH 连接 Ghost 就挂掉了,所以使用了 pm2。pm2 可以一直使绑定的 Ghost 保活。这就埋下了一个坑,后来我安装了新版的 Ghost 后起冲突了。后来卸载掉 pm2 就好了

更换主题又卸载重新安装后缓存问题

更换主题后出现了一些错误,没法解决的情况下把 Ghost 卸载了重新安装了一遍,但是重新安装后默认的主题竟然是之前更换那个,但是那个主题的文件已经删掉了,所以就一直启动不起来。最终的解决方案是重新安装了 Mysql(有点暴力),怀疑是 Ghost 把部分东西存到了数据库。

301重定向

这个问题折腾了很久,差点想要放弃。后台显示是正常在跑的,但是一访问就报 301 重定向过多的问题,后来终于找到这个 issue ,这是 Ghost 的一个 bug,解决方案就是在 Nginx 配置里加上下面这两句。不过这个 bug 似乎不稳定,为了不出问题还是加上比较好。

# 2 lines below are to avoid Ghost https redirect bug
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;

参考资料

Ghost 博客搭建日记
Ghost 博客升级指南
博客跑分优化
在CentOS 7上安装Node.js的4种方法(包含npm)
CentOS7安装Let’s Encrypt客户端Certbot获取Https证书
Ghost 博客主题 Kaldorei 2.0 发布
Ghost 高级设置

comments powered by Disqus