CentOS 7 安装配置 Ghost v1.x

Ghost is a fully open source, hackable platform for building and running a modern online publication.

环境配置

环境依赖

  • 至少 1 GB 为内存(或者设置 swap 分区)
  • Systemd (CentOS 7 自带)
  • Node.js ( v8.9+, v6.9+, v4.5+ )
  • Yarn (用来代替 npm 安装 ghost-cli)
  • MySQL (或者 sqlite3)
  • nginx(如果需要配置 SSL 使用 https,则 nginx >= 1.9.5)
  • 一个非 root 且拥有 sudo 权限的用户(用户名也不能为 ghost )

设置 Swap 分区

Swap 分区的用处是当物理内存不够用的时候,系统会把数据放到 swap 中,所以 swap 起到了一个虚拟内存的作用。Ghost 需要至少 1GB 物理内存,否则会报错,可以通过设置 swap 分区解决(大于等于 1GB 可不用设置)。

查看主机物理内存和虚拟内存:

free

​ total used free shared buff/cache available

Mem: 1016168 100360 293520 356 622288 746024

Swap: 0 0 0

/var/swap 创建 1024k1k 大小的空文件:

dd if=/dev/zero of=/var/swap bs=1k count=1024k

1048576+0 records in
1048576+0 records out
1073741824 bytes (1.1 GB) copied, 18.4951 s, 58.1 MB/s

创建 swap 分区:

mkswap /var/swap

Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=9a1b4bf2-cc39-4ab7-8dd9-9e0f25d0695d

启用 swap 分区:

swapon /var/swap

swapon: /var/swap: insecure permissions 0644, 0600 suggested.

写入分区信息:

echo '/var/swap swap swap default 0 0' >> /etc/fstab

再次查看 swap 分区大小:

free

​ total used free shared buff/cache available
Mem: 1016168 100360 293520 356 622288 746024
Swap: 1048572 0 1048572

检查 Node.js

查看安装的 node.js 版本号:

node -v

v8.11.1

注意: Ghost 支持的 Node.js 的版本为 v8.9+, v6.9+, v4.5+ 。

查看 node.js 安装路径:

sudo which node

/bin/node

**注意:**Node.js 需要安装在系统路径,比如 /usr/bin/node 或者 /usr/local/bin/node 等。不推荐使用 nvm 来管理 node.js,nvm 会把 node.js 安装在 /root 或者 /home 等用户路径,依靠建立软链的方式是不行的。如果一定要用 nvm,可以使用 nvm 将 node.js 安装在系统路径中(见 Install system-wide Node.js with NVM: the painless way)。

检查 Yarn

查看 Yarn 使用的源:

yarn config get registry

https://registry.npm.taobao.org/

如果不是 taobao 或者 cnpm 的源,推荐更换:

yarn config set registry https://registry.npm.taobao.org/

检查 Yarn 全局的 bin 路径:

yarn global bin

/usr/local/bin

查看当前用户的环境变量中的 $PATH

echo $PATH

/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/avin/.local/bin:/home/avin/bin

如果 Yarn 全局的 bin 路径不在其中,需要手动加入:

echo 'export PATH="<path>:$PATH"' >> ~/.bash_profile
source ~/.bash_profile

注意:

  • <path> 为上面查到的 Yarn 全局的 bin 路径。
  • 如果 <path> 在用户的个人目录,比如在 /home/avin/.yarn/bin 或者 /root/.yarn/bin 等,需要修 Yarn 的全局 bin 路径。Ghost 服务启动时,是以 ghost 这个用户的身份启动的,这个用户没有访问其他用户个人目录下文件的权限,会导致服务启动失败。所以,必需确保 Yarn 的全局 bin 路径在一个公共的位置,且在环境变量 $PATH

修改 Yarn 全局的 bin 路径

比如要将路径改到 /usr/local/bin 位置:

yarn config set prefix /usr/local

success Set "prefix" to "/usr/local".
Done in 0.04s.

再次查看 Yarn 全局的 bin 路径:

yarn global bin

/usr/local/bin

检查 MySQL

查看 MySQL 版本:

mysqld -V

mysqld Ver 5.7.22 for Linux on x86_64 (MySQL Community Server (GPL))

注意: 推荐使用 MySQL 5.7.x 版本,不要使用 8.x 版本,否则 Ghost 将连接 MySQL 出错。

检查 MySQL 服务是否正在运行:

systemctl is-active mysqld

active

使用 MySQL root 用户登陆 MySQL:

mysql -u root -p -h localhost

输入 MySQL root 用户密码:

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.22

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

确保可以 root 用户可以正常登陆 MySQL 即可。

检查 nginx

检查 nginx 版本:

nginx -v

nginx version: nginx/1.10.2

注意: 如果需要配置 SSL 使用 https,则 nginx 版本需要大于等于 1.9.5。

检查 nginx 服务是否正在运行:

systemctl is-active nginx

active

使用 IP 地址确认可以访问到 nginx 的欢迎页面,或者自己修改后的欢迎页面。

安装 Ghost-CLI

使用 yarn 全局安装 ghost-cli

yarn global add ghost-cli

查看安装的 ghost-cli 版本:

ghost -v

Ghost-CLI version: 1.7.1

创建新用户

注意: 如果已有拥有 sudo 权限的非 root 用户,跳过此步骤。

新建一个用户:

adduser <user>

注意: <user> 为新建用户的用户名。

设置用户密码:

passwd <user>

输入两遍用户密码。

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

chmod -v u+w /etc/sudoers

编辑文件:

vim /etc/sudoers

找到:

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

在下面添加:

# 该用户在使用 sudo 命令时不需要输入密码
<user>    ALL=(ALL)       NOPASSWD:ALL
# or 该用户在使用 sudo 命令时需要输入密码
<user>    ALL=(ALL)       ALL

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

chmod -v u-w /etc/sudoers

安装配置 Ghost

创建目录

切换到一个非 root 且拥有 sudo 权限的用户,且用户名不为 ghost 的其他用户:

su - <user>

注意: ghost-cli 会创建一个用户名为 ghost 的系统用户和用户组来自动运行 Ghost。

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

sudo mkdir -p /home/wwwroot/blog.imzhengfei.com
sudo chown <user>:<user> /home/wwwroot/blog.imzhengfei.com
sudo chmod 775 /home/wwwroot/blog.imzhengfei.com

注意: <user> 为当前登陆的非 root 用的的用户名。

进入到网站目录:

cd /home/wwwroot/blog.imzhengfei.com

使用 sqlite3 作为数据库

注意: 如果使用 MySQL 作为数据库,跳过此步骤。

在当前目录跳过系统检查,使用 sqlite3 作为数据库来安装 Ghost:

ghost install --no-stack --db sqlite3

✔ Checking system Node.js version
✔ Checking logged in user
✔ Checking current folder permissions
ℹ Checking operating system compatibility [skipped]
✔ Checking memory availability
✔ Checking for latest Ghost version
✔ Setting up install directory
✔ Downloading and installing Ghost v1.22.4
✔ Finishing install process
? Enter your blog URL: (http://localhost:2368)

输入自己网站完整访问路径 http://blog.imzhengfei.com 回车:

? Enter your blog URL: http://blog.imzhengfei.com
✔ Configuring Ghost
✔ Setting up instance
Running sudo command: useradd --system --user-group ghost
Running sudo command: chown -R ghost:ghost /home/wwwroot/blog.imzhengfei.com/content
✔ Setting up "ghost" system user
? Do you wish to set up Nginx? (Y/n)

直接回车确定自动设置 nginx:

? Do you wish to set up Nginx? Yes
Nginx is not installed. Skipping Nginx setup.
ℹ Setting up Nginx [skipped]
Task ssl depends on the 'nginx' stage, which was skipped.
ℹ Setting up SSL [skipped]
? Do you wish to set up Systemd? (Y/n)

发现 Ghost-CLI 在 CentOS 上依然不识别已安装的 nginx,后面自己手动设置。

直接回车确实自动设置系统服务:

? Do you wish to set up Systemd? Yes
✔ Creating systemd service file at /home/wwwroot/blog.imzhengfei.com/system/files/ghost_blog-imzhengfei-com.service
Running sudo command: ln -sf /home/wwwroot/blog.imzhengfei.com/system/files/ghost_blog-imzhengfei-com.service /lib/systemd/system/ghost_blog-imzhengfei-com.service
Running sudo command: systemctl daemon-reload
✔ Setting up Systemd
Running sudo command: /home/wwwroot/blog.imzhengfei.com/current/node_modules/.bin/knex-migrator-migrate --init --mgpath /home/wwwroot/blog.imzhengfei.com/current
✔ Running database migrations
? Do you want to start Ghost? (Y/n)

由于 nginx 尚未设置,输入 n 暂时不启动 Ghost。

使用 MySQL 作为数据库

在当前目录跳过系统检查,使用 MySQL 作为数据库来安装 Ghost:

ghost install --no-stack

✔ Checking system Node.js version
✔ Checking logged in user
✔ Checking current folder permissions
ℹ Checking operating system compatibility [skipped]
✔ Checking for a MySQL installation
✔ Checking memory availability
✔ Checking for latest Ghost version
✔ Setting up install directory
✔ Downloading and installing Ghost v1.22.4
✔ Finishing install process
? Enter your blog URL: (http://localhost:2368)

输入自己网站完整访问路径 http://blog.imzhengfei.com 回车:

? Enter your blog URL: http://blog.imzhengfei.com
? Enter your MySQL hostname: (localhost)

输入 MySQL 的登陆地址,本机登陆就是 localhost 直接回车即可:

? Enter your MySQL hostname: localhost
? Enter your MySQL username:

输入 root:

? Enter your MySQL username: root
? Enter your MySQL password: [input is hidden]

输入 MySQL 的 root 用户密码:

? Enter your MySQL password: [hidden]
? Enter your Ghost database name: (blog_imzhengfei_com_prod)

输入要创建的数据库的名称,回车直接使用默认的:

✔ Configuring Ghost
✔ Setting up instance
Running sudo command: chown -R ghost:ghost /home/wwwroot/blog.imzhengfei.com/content
✔ Setting up "ghost" system user
? Do you wish to set up "ghost" mysql user? (Y/n)

回车确认自动创建 MySQL 用户:

? Do you wish to set up "ghost" mysql user? Yes
✔ Setting up "ghost" mysql user
? Do you wish to set up Nginx? (Y/n)

直接回车确定自动设置 nginx:

? Do you wish to set up Nginx? Yes
Nginx is not installed. Skipping Nginx setup.
ℹ Setting up Nginx [skipped]
Task ssl depends on the 'nginx' stage, which was skipped.
ℹ Setting up SSL [skipped]
? Do you wish to set up Systemd? (Y/n)

发现 Ghost-CLI 在 CentOS 上依然不识别已安装的 nginx,后面自己手动设置。

直接回车确实自动设置系统服务:

? Do you wish to set up Systemd? Yes
✔ Creating systemd service file at /home/wwwroot/blog.imzhengfei.com/system/files/ghost_blog-imzhengfei-com.service
Running sudo command: ln -sf /home/wwwroot/blog.imzhengfei.com/system/files/ghost_blog-imzhengfei-com.service /lib/systemd/system/ghost_blog-imzhengfei-com.service
Running sudo command: systemctl daemon-reload
✔ Setting up Systemd
Running sudo command: /home/wwwroot/blog.imzhengfei.com/current/node_modules/.bin/knex-migrator-migrate --init --mgpath /home/wwwroot/blog.imzhengfei.com/current
✔ Running database migrations
? Do you want to start Ghost? (Y/n)

由于 nginx 尚未设置,输入 n 暂时不启动 Ghost。

设置 nginx

新建配置文件:

sudo vim /etc/nginx/conf.d/blog.imzhengfei.com.conf

写入配置:

# blog.imzhengfei.com
server {
  listen 80;
  server_name blog.imzhengfei.com;
  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 REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

注意: 修改 server_name 字段为自己解析的域名,多个域名空格隔开。

保存退出,重启 nginx 服务:

sudo systemctl restart nginx

访问测试

启动当前网站服务:

sudo systemctl start ghost_blog-imzhengfei-com

查看服务状态:

sudo systemctl status ghost_blog-imzhengfei-com

● ghost_blog-imzhengfei-com.service - Ghost systemd service for blog: blog-imzhengfei-com
Loaded: loaded (/home/wwwroot/blog.imzhengfei.com/system/files/ghost_blog-imzhengfei-com.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2018-04-29 20:22:06 CST; 49s ago
Docs: https://docs.ghost.org
Main PID: 11166 (ghost run)
CGroup: /system.slice/ghost_blog-imzhengfei-com.service
├─11166 ghost run
└─11174 /usr/bin/node current/index.js

注意: 不要使用 ghost start 启动,该命令在 CentOS 7 上会因为服务检查返回值为 unknown 而出错。

使用绑定的域名尝试访问自己的网站,访问 http://<domain>/ghost 注册管理员账号。

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

sudo systemctl enable ghost_blog-imzhengfei-com

参考文献