在Github和VPS上部署Hexo

本文是对此次建站过程的一个记录与小结,或许可以对他人有所启发,于是写在这里。

1. 前言

Hexo 是一个快速、简洁且高效的博客框架,支持丰富的插件和主题。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。本文主要介绍 Hexo 在 Github 和 VPS 上的搭建过程,操作系统环境为 Windows 10。

2. Github 上的搭建过程

2.1 创建仓库

在你的 Github 账号下新建一个名为 你的用户名.github.io 的仓库。例如,你的 Github 用户名为 xxx,则创建 xxx.github.io,将来你的网站访问地址就是 https://xxx.github.io。可见一个 Github 账号最多只能有一个这样的仓库。

2.2 环境搭建

在本地安装以下工具:

注意事项:安装 Git for Windows 时要选择添加到系统环境变量中,方便以后的操作。安装完成后,打开 Git Bash,以下所有命令将在 Git Bash 中执行。

2.3 配置 SSH key

提交代码需要拥有你的 Github 权限才可以,但是直接使用用户名和密码不够安全,所以我们使用 SSH key 来解决本地和服务器的连接问题。
用 Git Bash 执行如下命令:

$ cd ~/.ssh     //检查本机已存在的 SSH 密钥

如果提示: No such file or directory 说明你是第一次使用 git 。

$ ssh-keygen -t rsa -C "你的 Github 邮件地址"

然后连续三次回车,最终会在用户目录下生成一个文件夹,打开 C:\Users\你的用户名,找到 .ssh\id_rsa.pub 文件,使用记事本打开并复制里面的内容,然后打开你的 Github 主页,进入个人设置 -> SSH and GPG keys -> New SSH key -> 将刚复制的内容粘贴到 key 那里,title 随意填,保存。

2.4 测试

$ ssh -T git@github.com     //注意邮箱地址不用改

如果提示 Are you sure you want to continue connecting (yes/no)?,输入 yes,然后会看到:

Hi XXX! You’ve successfully authenticated, but GitHub does not provide shell access.

看到这个信息说明 SSH 已配置成功。
接下来,执行配置:

$ git config --global user.name "xxx"   //你的 Github 用户名
$ git config --global user.email "xxx@mail.com"     //填写你的 Github 邮箱地址

2.5 Hexo 的安装与配置

此部分建议参考官方说明文档,有详细的指导和解释。

2.5.1 安装及初始化

安装:

$ npm install -g hexo-cli

安装完成后,在电脑某个地方新建一个名为 hexo 的文件夹(名称可自定义),如 D:\hexo,将来这个文件夹会作为存放代码的地方。完成后执行:

$ cd /d/hexo
$ hexo init

Hexo 会自动下载一些文件到这个文件夹中,目录如下:

.
├── _config.yml
├── package.json
├── scaffolds
├── source
|   ├── _drafts
|   └── _posts
└── themes

2.5.2 配置

请看这篇说明文档:

2.5.3 修改主题

访问 Hexo 网站上提供的主题:

然后根据各个主题的说明操作。

注意 Hexo 根目录下的 _config.ymlthemes 目录下的 _config.yml 这两者的区别。

2.5.4 写作

参考:

2.5.5 上传到 Github

首先,SSH key 肯定要配置好。
其次,配置 _config.yml 中有关 deploy 的部分:

deploy:
 type: git
 repository: git@github.com:xxx/xxx.github.io.git   //注意冒号和 xxx 之间没有空格
 branch: master

执行:

$ hexo clean    //非必须。清除缓存文件 (db.json) 和已生成的静态文件 (public)。在某些情况(尤其是更换主题后),如果发现对站点的更改无论如何也不生效,需要运行该命令。
$ hexo g    //生成静态文件

此时如果直接部署可能会报错,原因是缺少插件:

$ npm install hexo-deployer-git --save

安装完成后,执行:

$ hexo d

完成部署。
此时,如果打开你的网页 https://xxx.github.io 应该能看到你发表的内容。
附:常用 Hexo 指令

关于 Markdown 编辑器,个人推荐 VS Code 或者 Atom,用起来赏心悦目,本文即是由 VS Code 撰写的。

3. VPS 上的搭建过程

在进行这一部分之前,建议先完成本文前述的所有步骤,并确保正确无误,这将节省一部分步骤与时间。

3.1 域名解析

  • 如果你还没有域名,那么你将需要购买一个,可以前往 GoDaddy 或其他域名销售网站购买。
  • 然后前往 DNSPod,选择 域名解析,填入你的域名,可以看到应该有 4 条记录类型,两条 NS 类型,一条 A 类型,一条 CNAME 类型。其中两条 NS 的记录类型是 DNSPod 默认配置的,无法修改,你需要在 A 记录类型中将记录值改为你的 VPS 的 IP 地址。
  • 前往你的域名购买网站,将域名的 DNS 解析服务器设置为 f1g1ns1.dnspod.net f1g1ns2.dnspod.net。注意填写为两栏,一栏填写一个。
  • 点击保存,等待全球递归DNS服务器刷新(最多72小时)。
  • 在等待生效过程中,你正好可以开始配置你的 VPS 。

3.2 建立本地端和 VPS 端的 SSH 连接

首先,在本地端安装 SSH 工具,这类工具有很多,使用方法也大同小异。本文将以 Xshell 为例进行操作。
在网页上登录你的 VPS 控制台,记录下 IP 地址,SSH 连接端口号,以及 root 用户的密码。

  • 打开 Xshell,选择 新建连接,在 Host 一栏中填写 VPS 的 IP 地址,在 Port Number 一栏中填写 VPS 的 SSH 连接端口号,填好保存,建立连接。

  • 连接过程中 Xshell 会弹框要求输入用户名和密码,用户名输入 root,密码输入你刚才记录的密码。

  • 连接成功建立后,会在 Xshell 上显示:

    Connection established.
    [root@localhost ~]#

3.3 VPS 端的配置

3.3.1 创建用户

  1. 创建用户用于服务器端站点管理,如下:
# adduser hexo  //创建用户
# passwd hexo   //设置密码,可能看不见输入的字符,正常输入即可
  1. 安装 Sudo:
# yum install sudo
  1. 赋予 hexo 用户 root 权限,以便接下来的操作:
# vi /etc/sudoers

找到这一行并添加:

root        ALL=(ALL)       ALL
hexo        ALL=(ALL)       ALL     //这个是添加的

编辑这个文件需要用到一些 Vim 命令和键位,这里只介绍要用到的部分,其他详情建议自行搜索:
「i」进入插入模式
「ESC」退出插入模式
:wq! 保存并退出
:q! 不保存并退出

注意:服务器端代码如果是 # 开头代表 root 用户的命令, $ 开头代表 hexo 用户的命令。

3.3.2 配置本地端无密码 SSH 登录服务器端

在前述步骤中我们已经在本地生成了 SSH 密钥,这里可以直接拿来使用而无需再次生成。

  1. 服务器端查看是否有安装 SSH :
# rpm -qa |grep ssh

如果返回有 openssh 开头的信息,则代表已安装。
没有的话使用 yum 安装:

# yum install ssh
  1. 启动服务:
# service sshd start
# service sshd status
  1. 服务器端在用户主目录下新建 .ssh 文件夹并拷贝本地端公钥内容到 .ssh 目录下的 authorized_keys:
# su hexo
$ cd ~
$ mkdir .ssh
$ cd .ssh
$ echo "本地端 SSH 密钥(全部内容)" > authorized_keys  //密钥在 C:\Users\你的用户名\.ssh\id_rsa.pub 中

修改权限:

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
  1. 进行验证:
    打开 Git Bash,执行:
$ ssh hexo@你的VPS的IP地址 -p 端口号 //@前是你创建的站点管理用户,本文中是 hexo

第一次连接可能需要输入密码,此后不再需要,可直接连接。

3.3.3 安装配置 nginx

简单来说, nginx 是代理服务器,有了它我们就能按照域名或IP地址访问网页。

  1. 添加 nginx 源,在 /etc/yum.repos.d 目录下创建一个 yum 源文件nginx.repo
$ su root
# vi /etc/yum.repos.d/nginx.repo

写入如下内容:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
  1. 安装 nginx :
# cd ~
# yum install nginx -y
# nginx -v  //查看版本号验证
  1. 删除原配置文件:
# rm /etc/nginx/conf.d/*
  1. 重新配置:
# vi /etc/nginx/conf.d/hexo.conf

添加以下内容:

server {
  root /home/hexo/www;  #网站根目录,用来存储网站文件,后面会创建
  index index.html index.htm;
  server_name foversty.com;   #你的域名
  location / {
    try_files $uri $uri/ /index.html;
  }
}

需要注意,这一步较为关键,因为将你的域名和服务器下的网站根目录挂钩,主页是根目录下的 index.html
5. 修改 nginx 配置文件:

# vi /etc/nginx/nginx.conf

将其中 user 的值改为 hexo。并在 http 段落中添加以下内容以开启 GZIP 压缩,加快网站访问速度。

# 开启gzip
gzip on;
# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
# gzip 压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明
gzip_comp_level 2;
# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
# 禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";
  1. 切换到 hexo 用户,用户主目录下新建 www 文件夹作为网站根目录:
# su hexo
$ cd ~
$ mkdir www
  1. 验证配置是否正确:
$ sudo nginx -t

如果显示如下信息,说明配置正确。

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

  1. 启动 nginx 服务并测试:
$ sudo service nginx start
$ echo "hello nginx!" > /home/hexo/www/index.html   //站点根目录下新建 index.html

在浏览器中输入你的域名或者 VPS 的 IP 地址(取决于域名解析是否已经生效),出现 hello nginx! 字样表示 nginx 代理服务器搭建成功。然后删除 index.html 吧。

$ rm /home/hexo/www/index.html

3.3.4 安装和配置 Git

  1. 安装 Git
$ sudo yum install git
  1. 初始化 Git 仓库
    用户主目录下新建 hexo.git 文件夹用作 Git 仓库并初始化:
$ cd ~
$ mkdir hexo.git
$ cd hexo.git
$ git init --bare   //初始化 Git 仓库
  1. 配置 Git 仓库的 hooks
    hooks 可以将不同目录的数据实现同步。具体如下,在 Git 仓库 hooks 目录下创建文件 post-receive 并修改权限:
$ cd hooks
$ touch post-receive
$ chmod 755 post-receive
$ vi post-receive

将以下内容添加到 post-receive 中:

#!/bin/bash
GIT_REPO=/home/hexo/hexo.git
TMP_GIT_CLONE=/tmp/HexoBlog
PUBLIC_WWW=/home/hexo/www
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}

3.4 本地端部署验证

由于前述步骤中本地端已经安装好了 Hexo,所以只需要修改 _config.yml 文件,即可进行部署到 VPS 。
url 项配置:

# URL
## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
url: http://foversty.com    #你的博客网址
root: /

deployment 项配置:

# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
 - type: git  
   repository: git@github.com:xxx/xxx.github.io.git  
   branch: master   #之前配置的部署到 Github 的有关信息  
 - type: git  
   repo: ssh://hexo@你的VPS的IP地址:端口号/home/hexo/hexo.git   #新增部署到VPS的有关信息,注意冒号不可省去且冒号前后没有空格  
   branch: master

这样设置好以后,使用 hexo d 命令可以同时部署到 Github 和 VPS,如果你只想部署到其中一个,那么将另一个删掉或者注释掉即可。
部署验证,打开 Git Bash,执行以下命令:

$ hexo clean
$ hexo g
$ hexo d

至此,配置过程完全结束,你可以打开浏览器,输入你的域名,查看你发布的内容。

完结撒花!