记一次CentOS上安装Ghost

转载 Jan 20, 2020
文章转自 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?
知识共享许可协议
本站文章除特别声明外,均采用 知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际许可协议 进行许可。
您的支持将鼓励我们继续创作!

Who Am I STEM Club

博罗中学 WAI 科技社官方账号

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.