记一次CentOS上安装Ghost

记一次CentOS上安装Ghost
文章转自 https://freekingd.com/ghost-install/ 作者:朱瑞金
建议英文好的同学直接上官网(目前只有Ubuntu的教程)。

Ghost是一个基于Node.js的开源专业发布平台,为功能、灵活性和性能而生。相比大名鼎鼎的WordPress,Ghost可以说是轻量级的博客系统,而且还做了很多优化(比如SEO);同样基于Node.js的静态博客系统Hexo性能也很强劲,有中文文档,加上插件也能实现后台管理,呃,我为什么选择Ghost呢,可能是想学英文吧...(反正我是信了。Ghost和Hexo的社区都比较活跃,GitHub上Ghost的commits是Hexo的3倍多,更新频率要高一些)

准备

  • 服务器(我的CentOS 7 x64)
  • Nginx(选择大于1.9.5的版本,以支持SSL)
  • 受支持的Node.js版本(6.x/8.x/10.x)
  • MySQL 5.5, 5.6, or 5.7 (not >= 8.0)
  • Systemd
  • 服务器至少有1GB的内存
  • 已注册的域名

安装Nginx

# 更新所有包、软件和系统内核(后面基本使用yum)
sudo yum -y update
# 安装Nginx
sudo yum -y install nginx

# 开启80端口
firewall-cmd --add-port=80/tcp --permanent
# 开启http服务
firewall-cmd --add-service=http --permanent
# 重载防火墙配置
firewall-cmd --reload

# 启动Nginx
service nginx start

不出意外,在浏览器中输入服务器IP就可以访问到Nginx的欢迎页面。

安装MySQL

这里选择的MySQL 5.7

# 下载MySQL的rpm源   
curl -LO http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm  
# 安装 mysql 源  
sudo yum localinstall mysql57-community-release-el7-11.noarch.rpm   
# 检查 yum 源是否安装成功   
sudo yum repolist enabled | grep "mysql.*-community.*"   
# 安装MySQL Server   
sudo yum install mysql-community-server  

# 安装MySQL服务   
sudo systemctl enable mysqld  
# 启动MySQL服务  
sudo systemctl start mysqld   
# 查看服务状态  
sudo systemctl status mysqld  

修改 root 默认密码

# 查找默认密码
grep 'temporary password' /var/log/mysqld.log  

# 登陆MySQL,修改密码
mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

到此MySQL安装结束,可以quit

安装Node.js

# 添加Node 8的rpm源  
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -   
# 安装Node.js  
sudo yum -y install nodejs   

# 检查安装是否成功   
node -v;npm -v;

安装Ghost-CLI

Ghost-CLI是一个命令行工具,通过它可以快速便捷地安装和配置Ghost。

官方建议使用非root用户安装和启动Ghost,所以我们先添加一个新用户(非ghost,避免和Ghost-CLI默认创建的ghost用户冲突)。

# 添加新用户
adduser <user>
# 为新用户创建密码
passwd <user>

# 为新用户添加sudo权限
# 找到“root ALL=(ALL) ALL”,复制一行到下方,将root改为新用户名
vim /etc/sudoers 

切换用户: su <user>

# 安装Ghost-CLI  
sudo npm i -g ghost-cli   

# 查看版本   
ghost version  

安装Ghost

避免在/root 或 /home/<user>下安装Ghost,应选择其他目录并适当修改权限。

创建Ghost的安装目录

# 创建目录
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

安装过程会要求填写一些信息,以便Ghost-CLI帮我们自动配置。

# 检查到Linux版本不是Ubuntu,可以跳过
? Continue anyway? y
# 如果还没有域名,可以:http://IP (参考后文Nginx配置中IP访问)
? Enter your blog URL: https://freekingd.com
? Enter your MySQL hostname: localhost
? Enter your MySQL username: root
? Enter your MySQL password: [hidden]
? Enter your Ghost database name: ghost_prod
? Do you wish to set up "ghost" mysql user? y
# 这里可能会跳过,没关系我们可以自己配置
? Do you wish to set up Nginx? y
? Do you wish to set up Systemd? y

# 如果这一步ok了就大功告成,目前为止我还没成功过
? Do you want to start Ghost? y

幸运的同学可以跳过下一步,只差配置Nginx就可以访问页面了。剩下的就只能一起先调试下了。

Debug

这里只会涉及到我遇到的问题,不过我觉得这个问题应该有一定共性。

A ProcessError occurred.

Message: Command failed: /bin/sh -c sudo -S -p '#node-sudo-passwd#'  systemctl is-active ghost_freekingd-com
...

大概就是下面第一条命令出错了,简单粗暴点可以直接再运行这条命令,然后再跑一下ghost start

# 注意替换“ghost_freekingd-com”
sudo systemctl start ghost_freekingd-com
# 谨慎点再看下状态
systemctl is-active ghost_freekingd-com
# 如果上条命令的结果为failed,那多半没用
ghost start

现在只能再挖掘一下错误信息:

  • log info:在我的案例里面没找到更多有用信息
  • 运行ghost doctor命令报同样错误

这时就必须参考官方API和故障排除,发现了一个用于调试的命令:
ghost run
这个命令会输出详细的错误信息,我遇到过数据库访问失败、目录权限、内存警告这些问题,通过Google和官方论坛都能解决。

最后,神奇的事情发生了,ghost run可以运行,我甚至能访问页面,但ghost start始终报错...依据官方文档介绍,ghost run 只是用来调试的,测试ghost是否可以成功启动(⊙﹏⊙)。我暂时用 nohup ghost run & 代替 ghost start 先把ghost开起来,在论坛上发了一个帖子,希望有大佬能看到这个问题。

配置Nginx

官方文档用Ubuntu是没有这一步的,可能Ghost-CLI在CentOS下有些配置不能自动完成。下面仅附上Ghost搭配Nginx的关键配置,不涉及Nginx+SSL的具体配置,如果是第一次接触Nginx,建议先了解一下基本原理和配置介绍。

建议使用SSL,官方文档有提到“In 2019 we intend to make SSL mandatory for all new installs.”

如果是通过yum安装的Nginx,配置文件应该在这里:/etc/nginx/nginx.conf 。这里我是用root用户操作的。

域名+SSL

server {
    listen        80;
    server_name   www.freekingd.com;
    charset       utf-8;
    #将http强制转换为https
    rewrite ^(.*) https://$server_name$1 permanent; 
}

Copy

server {
    listen 443;
    server_name www.freekingd.com;
    ssl on;
    ....

    location / {
        proxy_set_header  Host $host;  
        proxy_set_header  X-Real-IP $remote_addr;  
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;  
        proxy_set_header  X-Forwarded-Proto $scheme;  
        # 转发到ghost
        proxy_pass http://127.0.0.1:2368;
    }    
}

注意:开启443端口和https服务,重启防火墙,重新加载Nginx。

IP访问

server {
    listen 80;
    server_name localhost;
    ....

    location / {
        proxy_set_header  Host $host;  
        proxy_set_header  X-Real-IP $remote_addr;  
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;  
        proxy_set_header  X-Forwarded-Proto $scheme;  
        # 转发到ghost
        proxy_pass http://127.0.0.1:2368;
    }    
}

博客管理

# 访问页面
Blog URL(域名或者IP) 

# 访问后台 
Blog URL/ghost

后记

整个Ghost安装跨度有三天,不可谓不心累,而且还遗留了一个问题,不过还是很嗨森,特别是当一个卡很久的问题被解决的时候,相信大家都有这种体会。

为了相对客观完整地记录Ghost安装过程,我重新部署一个服务器从头踩坑。因为第一次我的服务器上已经安装了Nginx和MySQL 8.0(Ghost要求小于MySQL 8.0,为了再安装MySQL 5.6,浪费了不少时间),还有第一次基本都使用源码安装,略为繁琐,所以第二次我尽量用yum来简化安装过程。

这次经历给我带来两点思考:

  • 多主动思考,不做简单的搬运工。 刚接触Linux的时候是非常茫然的,有什么命令或者配置不懂,就直接copy网上先运行一遍,成功就算了事,报错就是运气不好。想想不知道我的服务器里面还有多少隐患...诚然,我现在还是一个NOOB,至少学会了货比三家,三思而后行,尽量多去理解命令的逻辑和配置的原理,而不是一味的copy。
  • 少钻一点牛角尖,对身体好。 期间有两个配置问题让我有两个晚上在熬夜,就是想着不搞出来就不睡觉那种,最后困得不行只能打脸,第二天冷静下动脑子多想想就搞定了。我这里的牛角尖专指不可取的解决过程。干这一行最不缺的就是bug,要是每一个bug都花这么多的时间简直就是浪费生命啊。归根结底就是基础不牢靠,没有花时间阅读文档,所以在没有bug的时候得好好打基础,就会少点牛角尖。

参考

How to install Ghost on Ubuntu
Ghost官方论坛
nginx服务器详细安装过程(使用yum 和 源码包两种安装方式,并说明其区别)
CentOS 7 下 Yum 安装 MySQL 5.7
yum安装nodejs
Centos7 防火墙 firewalld 实用操作
阿里云linux centos7安装ghost博客踩坑记
弃用 WordPress,对比 Ghost 后改用 Hexo
What is the difference between yum, apt-get, rpm, ./configure && make install?