在阿里云 CentOS 7 系统上部署 Ghost 博客

2016 年 2 月 4 日更新:

  • 增加“生产环境下 Linux 用户权限控制”;
  • 增加“使用 Git 为 Ghost 进行版本控制”;
  • 修改部分错误内容。

2016 年 9 月 11 日更新:

  • 由于 Ghost 中文网迟迟未跟进 Ghost 官方的升级节奏,导致 Ghost 中文版一直停留在旧版。所以,建议直接使用 Ghost 官方的 Ghost 英文版;
  • Ghost 官方英文版下载地址:https://github.com/TryGhost/Ghost/releases

2016 年 12 月 26 日更新:

  • 服务器不再推荐使用阿里云。推荐使用美国 VPS 提供商 Vultr。价格实惠,最低只需每个月 5 美元,支持 PayPal 支付(国内银行储蓄卡可充值);
  • 这是我的 Vultr 优惠链接,点击注册并首次购买服务器,可获得 20 美元代金券(有效期一年):点击领取优惠
  • 推荐更加好用的命令行软件 Cmder;
  • 更新并简化操作步骤。

记录生活、学习、工作的方式有很多,有逼格的记事本 Moleskine 搭配颜值爆表的 LAMY、优秀的笔记软件如 Evernote (印象笔记),还有专属自己的一片自留地——部落格,俗称“网络日志”、“博客”……

博客平台简要介绍

博客平台分为几个流派:

  • WordPress 似乎是一个人尽皆知的博客程序,以至于“有点追求”的“爱折腾人士”都嫌弃它太大众化了……特点:群众基础好,所以单独出来写。
  • 独立博客:自己买服务器,自己折腾,搭建环境。优点是:自由度最大,可随意选择自己喜欢的博客程序,任意自定义。
  • 托管博客:使用第三方博客托管服务,省去管理服务器的麻烦。常见的有:
    • 新浪博客、网易 LOFTER、微信订阅号、知乎专栏、简书、Farbox 等传统博客平台、轻博客、新型传媒平台、文字创作类平台。
    • 国内技术社区如 SegmentFaultCSDN 等提供的博客服务,技术人员常用。优点是:依靠网站很好的 SEO 和内容推荐、背后庞大的开发者社区,博客曝光度相对较大,易于传播。
    • Github Pages:可用于搭建 JekyllOctopressHexo 等国外技术界流行的静态博客,技术人员常用。特点是:跟国际接轨。
  • 博客共创平台 Medium:所有人都可以在这个平台上撰写文章,是一个基于标签的内容创作和传播平台。Medium 是这样自我定义的:

    Medium is a community of readers and writers offering unique perspectives on ideas large and small.

    Medium 是一个社区,它为读者和作者提供独一无二的视角,其中的想法或伟大或细微,但这都不要紧。

更详细的博客平台对比,可以浏览这个知乎问答:《FarBox、Jekyll、Octopress、ghost、marboo、Hexo、Medium、Logdown、prose.io,这些博客程序有什么特点?》


Why Ghost?

正如之前的博文 《“前端养成记”博客上线历程》 中说的:

跟静态博客不同的是,Ghost 这种轻量级的动态博客,有一个管理后台,可以直接写作和管理博客。本质上,跟 WordPress 是相通的,只是 Ghost 搭建在 Node.js 环境上,轻量,快速,简洁。

不可否认的是,Ghost 的颜值是我相当看重的一点,也确实打动我了。

总而言之,就是喜欢 Ghost 的默认主题 Casper,不喜欢 Hexo 和 Jekyll 的写作方式。


Why 阿里云?

阅读过之前的博文 《“前端养成记”博客上线历程》 的朋友应该都知道,“前端养成记”原本是用 Buster 静态化后托管在 Github Pages 上的。无奈由于 Buster 太不稳定,常常无法工作,遂最终决定还是按照官方建议的方法,部署在服务器上。

Ghost 可以直接部署在 Node.js 环境上,也可以用 Docker 部署。

国内云服务器供应商有:阿里云、腾讯云、百度云、美团云、京东云等;Docker 服务供应商有:灵雀云、DaoCloud、时速云。

云服务器对比下来,选择最多最灵活、综合最便宜的是阿里云,而且方案和规模比国内其他云服务提供商要成熟。

Docker 服务因为一般针对企业用户,所以相对云服务器会贵一点点。另外,考虑到 Docker 有学习成本,所以最终选择了阿里云 ECS 云服务器作为本博客的部署平台。


服务器配置

  • 1 核 CPU
  • 1G RAM(一个 Ghost 实例大约占用 150M RAM)
  • CentOS 7 64 位
  • 40G 硬盘空间(购买 Linux 时附带)
  • 100M 按量计费宽带
  • 位置:美国硅谷区(为了避开 GFW 且无需备案)
  • 价钱:45 元/月 + 0.5 元/G 流量费
  • PV ≈ 150/天,流量费 ≈ 1元/天

额外准备

  • 一个你喜欢的域名,如 .me.io
  • 建议使用阿里云的朋友,在阿里云的万网购买域名,很方便

开始部署

说明:本博文不将 Linux 安全作为重点讲解,对生产环境安全性特别注重的朋友,请自行查阅资料。

具体步骤:
  1. SSH 登录阿里云服务器
  2. 添加 yum 源并安装开发套件:为 yum 提供更多 Linux 软件安装渠道,并安装常用开发套件
  3. 更新 CentOS 7 内核和内置软件
  4. 安装 Nginx:为 Ghost 提供反向代理
  5. 添加用于运行博客的 Linux 用户 www
  6. 安装 Node.js:为 Ghost 提供环境支持
  7. 安装并测试 Ghost 博客程序中文版:由 Ghost 中文网提供
  8. 安装 PM2:使 Ghost 永久在线
  9. 用 Git 为 Ghost 博客进行版本控制
  10. 升级 Ghost 到最新版本
  11. 绑定个性化域名
  12. 福利

步骤 1、2、3 属于项目运行前的服务器环境准备,如果服务器已经有项目在运行,那么可以省略,因为之前应该已经弄好了。


1. SSH 登录服务器

2016 年 12 月 26 日更新:

不再推荐使用 Chocolatey 和 Putty。推荐使用 Cmder 完整版,集成了 Gitsshssh-copy-id 以及 scp 等有用的软件和工具,请自行查阅使用方式。

建议 Windows 用户使用 Chocolatey 管理开发类软件,OS X 用户对应使用 Homebrew

Windows 安装 Chocolatey
  • 用 Windows 管理员身份打开命令行提示符:Win + R,输入 cmd,确定;
  • 粘贴这段代码到命令行提示符,按 Enter 回车:
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
  • 重新打开命令行提示符,输入choco -v,如果有反应,说明 Chocolatey 安装成功。
用 Chocolatey 安装并运行 Putty

Putty 是 Windows 平台上一个 SSH 客户端,用于远程登录服务器。

  1. 在命令行提示符输入choco install putty -y,等待安装完毕;
  2. 一切就绪后,输入putty 命令启动 Putty;
  3. 在 Putty 中输入购买的阿里云服务器的公网 IP 地址,并点击 open 按钮,如图:

    ssh登录服务器

  4. 接着会打开一个 SSH 终端窗口,问你 login as: (以什么用户身份登录服务器),我们以 root 身份登录,输入root,并回车;如图:

  5. 最后输入阿里云服务器登录密码,回车,登录成功。

接下来所有步骤的所有操作均在 SSH 终端窗口进行。


2. 添加 yum 源并安装开发套件

  • yum install https://centos7.iuscommunity.org/ius-release.rpm -y:安装 ius-release 源;
  • yum repolist:更新 yum 源缓存
  • yum groupinstall "development tools" -y:安装常用开发套件

3. 更新 CentOS 7 内核和内置软件

就一句命令:yum update -y,等待完成。

完成后,登录阿里云控制台,重启服务器(如果服务器有其他项目在运行,重启要慎重)。


4. 安装 Nginx

安装 Nginx
  • yum install nginx -y:安装 Nginx
  • systemctl enable nginx:设置 Nginx 随服务器自动启动
  • systemctl start nginx:启动 Nginx
  • systemctl status nginx:查看 Nginx 状态,看到如图enabledactive 状态,则说明 Nginx 设置成功:

    nginx状态

  • 在浏览器访问阿里云服务器 IP 地址,如果可以看到 Nginx 的 Welcome to Nginx! 欢迎信息,说明 Nginx 配置成功。

使用 Nginx 反向代理 Ghost

众所周知,网站基本都以 80 端口作为默认端口(除非你不想让别人访问你的网站),也就是说:访问域名或服务器 IP 地址,实际上是在访问该服务器的 80 端口。而 Ghost 博客默认运行在 2368 端口上。

为了输入域名或服务器 IP 地址就可以访问到你的 Ghost 博客,需要将访问 80 端口的请求,反向代理到 Ghost 的 2368 端口上:

  • 进入 Nginx 配置目录:cd /etc/nginx/conf.d
  • 新建 Ghost 博客的 Nginx 配置文件:vim ghost.conf,按 i 输入以下内容:
server {  
    listen 80;
    server_name loyalsoldier.me // 这里修改为你的域名;如果没有域名,则改为服务器 IP 地址;

    gzip on;
    gzip_types text/plain application/xml text/css application/javascript application/json application/font-woff application/font-woff2 application/vnd.ms-fontobject application/x-font-ttf font/opentype application/pdf image/png image/bmp image/gif image/jpeg image/webp image/svg+xml audio/mp4 audio/mpeg audio/x-wav;
    gzip_proxied no-cache no-store private expired auth;
    gzip_vary on;
    gzip_min_length 1024;

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

    location ~* .*\.(jpg|jpeg|bmp|png|gif|ico|js|css|eot|woff|woff2|svg|ttf|otf)$ {
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_pass         http://127.0.0.1:2368;

        add_header Cache-Control max-age=2592000;
        expires    30d;
        etag       on;
    }
}
  • ESC 键结束编辑,输入 :wq 保存文件并退出编辑
  • 使用 nginx -t 测试 Nginx 配置文件是否语法正确:若输出的结果有 oksuccessful 等字样,表示配置正确
  • 重启 Nginx:systemctl restart nginx

5. 添加用于管理博客的用户 www

Linux 系统有一套完整方便的用户权限控制方法。在生产环境部署应用时,使用 root 这个拥有服务器最高权限的用户是有风险的,而应该遵循最小权限原则,也就是说:只需要使用能满足应用正常运行的最低权限的用户即可。我们应该保持这样的良好习惯。

  • 添加用户 www 并指定其默认用户目录为 /var/wwwuseradd -d /var/www www
  • 为用户 www 设置密码:passwd www
  • 把用户 www 添加到 wheel 用户组(方便用户 www 使用 sudo 命令):usermod -aG wheel www
  • 可以使用命令 groups www 查看用户 www 的用户组,此时输出的结果应该是:www : www wheel,表明用户 www 位于 wwwwheel 两个用户组

下面所有操作均在用户 www 下完成


6. 安装 Node.js

建议 Linux 和 OS X 用户使用 n 管理 Node.js 版本,Windows 用户使用 Nodist

安装 n 和 Node.js
  • 切换至用户 wwwsu www
  • 安装 n:curl -L http://git.io/n-install | N_PREFIX=/var/www bash
  • 重启 SSH 窗口,即可使用 n
  • 安装 Node.js v0.10.*Node.js LTSn 0.10n lts,等待完成
  • 切换 Node.js 版本到 v0.10:输入n,用键盘方向键选择版本,如图:

    切换node.js版本

温馨提示:严重建议使用 Node.js v0.10.* 运行 Ghost,其他版本暂时有各种大大小小的问题。


7. 安装 Ghost 中文版

将 Ghost 安装在 /var/www/ghost 目录下:

  • 创建目录并进入:mkdir /var/www && cd /var/www

使用 Ghost 中文网提供的 Ghost 中文版:

  • 下载 Ghost v0.7.4 中文版:wget http://dl.ghostchina.com/Ghost-0.7.4-zh.zip
  • 解压 Ghost 中文版压缩包到 ghost 文件夹:unzip Ghost-0.7.4-zh.zip -d ghost
  • 进入 ghost 文件夹:cd ghost
  • 从示例配置文件复制并新建 Ghost 配置文件 config.js:cp config.example.js config.js
  • 编辑 config.js 配置文件:vim config.js;找到其中的 production 字段,也就是生产环境下的配置项,按 i 进入编辑模式,修改其中的 url 为自己的域名或服务器 IP 地址即可
  • ESC 键结束编辑,输入 :wq 保存文件并退出编辑。
  • 我的 config.js 配置文件如下:
production: {  
        url: 'http://loyalsoldier.me',
        mail: {},
        database: {
            client: 'sqlite3',
            connection: {
                filename: path.join(__dirname, '/content/data/ghost.db')
            },
            debug: false
        },

        server: {
            host: '127.0.0.1',
            port: '2368'
        },

        storage: {
            provider: 'local-file-store'
        }
    },
  • 安装 Ghost 依赖:npm install --production,等待完成
测试 Ghost
  • 启动开发模式下的 Ghost,以测试 Ghost 是否安装成功:npm start
  • 浏览器输入购买的域名或服务器 IP 地址,如果能看到 Ghost 博客,说明 Ghost 安装成功
  • 关闭 Ghost:按 Ctrl + C

8. PM2 使 Ghost 永久运行

开发模式下的 Ghost 在你退出 SSH 终端窗口后,便会自动关闭。如果要让 Ghost 一直运行,需要使用进程守护软件守护 Ghost 进程,Node.js 社区比较火的两款进程守护软件为 ForeverPM2。这里使用 PM2 作为演示。

  • 用 npm 全局安装 PM2:npm install -g pm2
  • 必须进入 Ghost 博客目录:cd /var/www/ghost
  • 在 Ghost 博客目录下,让 Ghost 以 Production 模式(生产模式)运行,指定程序入口文件为 index.js,并且将此进程命名为 ghost:NODE_ENV=production pm2 start index.js --name "ghost"
  • 使 Ghost 开机自启动:pm2 startup centos
  • 保存目前的 PM2 配置:pm2 save

    温馨提示:PM2 重启进程的命令是 pm2 restart 进程名

恭喜你!现在,浏览器中输入你的域名或服务器 IP 地址,就可以访问你的 Ghost 博客啦!浏览器地址栏增加 /ghost,如 http://loyalsoldier.me/ghost 即可访问 Ghost 博客管理后台。

第一次访问 Ghost 博客管理后台,需要按照流程注册一个账号,这个账号用于登录和管理 Ghost。以后,只需要访问 http://你的域名或服务器 IP 地址/ghost 即可撰写、发表博文!


9. 用 Git 为 Ghost 博客进行版本控制

使用版本控制是一个技术人员必备的技能,也是一个好习惯。每次对内容的修改,推送到远程的版本库进行版本控制,有几个好处:

  • 这些修改永远不会丢失(相当于内容备份);
  • 万一修改出错,可以随时切换回旧版本的内容(相当于修改容错功能);
  • 记录应用的改版历程……

下面让我们以 Github 为例,看看怎么为 Ghost 博客使用 Git 版本控制服务(国内类似服务有 Git@OsChina):

  1. 注册 Github 账号
  2. 浏览器打开 https://github.com/new 新建 Github 仓库(git repo):如图填写仓库名称描述,点击Create Repository(创建仓库)

    创建Github仓库

  3. 进入 Ghost 博客目录:cd /var/www/ghost
  4. 添加 Github 账号到 Git 中:git config --global user.email "you@example.com"you@example.com 替换为注册 Github 的邮箱账号),然后添加 Github 用户名:git config --global user.name "Your Name"(Your Name 替换为你的 Github 账号昵称)
  5. 初始化 Git 仓库:git init
  6. 将刚刚新建的 Github 仓库地址添加到 Ghost 目录:git remote add origin https://github.com/你的 Github 用户名/你的仓库名称.git,如图红色方框所示:

    添加远程仓库

  7. 把 Ghost 博客目录下所有文件改动添加到 Git 暂存区(Git Index):git add .(这里确实有个英文句号)
  8. 提交更改到 Git 本地仓库(Local Repository):git commit -m "XXXX"XXX 部分替换为本次提交修改的内容,如“发布博文《在阿里云 CentOS 7 系统上部署 Ghost 博客》”
  9. 把本次更改推送到远程仓库(Upstream Repository):git push -u origin master
  10. 每次对 Ghost 博客目录的文件或内容进行了修改,或发布了新博文,都可以重复步骤 7~9,将修改推送到 Github,称之为版本控制。

10. 升级 Ghost 到最新版本

  • 最新版 Ghost 中文版可以在 Ghost 中文网 找到
  • Ghost 中文版更新方法参照 这个说明 中的“如何升级”部分

11. 绑定个性化域名

如果你购买了域名,但不会绑定域名,可以参照我的博文《“前端养成记”博客上线历程》 中的 “绑定个性化域名” 部分


12. 福利

  1. 本博客所有内容已在我的 Github 开源: Loyalsoldier.github.io
  2. 针对 Ghost 官方的 Casper 主题,我进行了主题样式的修改,使之在 PC 端、移动端上有更好的表现,排版上更符合国人的审美和习惯。使用步骤如下:
    • 我修改的主题下载下来,放在服务器的 /var/www/ghost/content/themes 目录;
    • 进入 Ghost 博客管理后台,在全局设置中,将博客主题选择为 casper 即可成功切换为我修改的主题。

Good luck and Have fun !


Loyalsoldier

死飞,设计,编码,音乐……美物都值得善待。