记一次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;
}
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?