Hexo初次使用及部署到云服务器详细指南

前言

之前使用WordPress来搭建个人博客。最近看到许多博客使用hexo并配合Next主题,效果还挺好的。而且Next主题几乎将我需要使用到的功能点包含进去了。
还有一个关键性因素是:hexo是使用Markdown来撰写文章的。
所以最近几天研究了一下hexo+next主题,便将博客从WordPress迁移了。

Hexo简介

Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。
由于Hexo最终生成静态网页,所以云服务器端只需要有web服务器(小编使用的是Centos7+Apache)就可以了,另加git,用于将网页从本地发布到云服务器上。
关于Hexo的操作都放在本地。

设备

  • Mac pro
  • 阿里云服务器(Centos7+Apache)

Mac Hexo安装

安装前提

  • Node.js
  • Git

    Git

    本机上自带有git,就不啰嗦了,推荐可用:Homebrew :brew install git

安装 Homebrew 将以下命令粘贴至终端

1
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装完成后 我们可以用 brew install 命令来安装我们需要安装的软件(Git)

1
➜  ~ brew install git

可以用 git --version来检测是否安装了Git

1
2
➜  ~ git --version
git version 2.14.3 (Apple Git-98)

哈哈,结果还是啰嗦了!!

Node.js

NVM

安装 nvm
终端输入:

1
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

1
2
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

判断nvm是否安装

1
2
➜  ~ command -v nvm
nvm

或者

1
2
3
➜  ~ nvm --version
0.33.2
nvm

command -v命令适用于判断所有应用是否安装,若未安装,则会输出空。

安装Node

1
nvm install stable

判断node是否安装

1
2
➜  ~ node -v
v9.2.0

node 安装完成后 npm 自然也就有了

安装 Hexo

所有必备的应用程序安装完成后,即可使用 npm 安装 Hexo。

1
➜  ~ npm install -g hexo-cli

由于通过npm安装的资源在国外,用npm 安装就非常费时。
好在伟大的淘宝团队推出了 “淘宝 NPM 镜像”,解决了这个问题。
使用淘宝团队定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:

1
➜  ~  npm install -g cnpm --registry=https://registry.npm.taobao.org

支持 npm 除了 publish 之外的所有命令。

所以安装Hexo可以替换为:

1
➜  ~ cnpm install -g hexo-cli

-g 或 –global 表示全局安装模块,如果没有这个参数,会安装在当前目录的node_modules子目录下。

建站

安装 Hexo 完成后,请执行下列命令,Hexo 将会在指定文件夹中新建所需要的文件。

1
2
3
$ hexo init <folder>
$ cd <folder>
$ npm install

若未指定<folder>,则将在当前目录下建站(设为博客文件的根目录)。

新建完成后,指定文件夹的目录如下:

1
2
3
4
5
6
7
8
.
├── _config.yml
├── package.json
├── scaffolds
├── source
| ├── _drafts
| └── _posts
└── themes

其中_config.yml为站点配置文件,_posts为文章目录。
其他目录介绍可查看官方文档建站

修改_config.yml配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# Site 站点信息配置
title: 海的那边
subtitle: 小小码农
description: Android开发过程中的经验积累
keywords: Android,app开发
author: haitao
language: zh-Hans
timezone:

# URL
## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
url: http://www.nhtzj.com
root: /

运行 Hexo

现在,一个 Hexo 本地博客已经搭建起来了,你可以在本地运行

生成文件

使用 Hexo 生成静态文件

1
➜  ~ hexo generate

hexo generate可简写为hexo g
下述中提到有hexo generate的都可简写为hexo g

监视文件变动

Hexo 能够监视文件变动并立即重新生成静态文件,在生成时会比对文件的 SHA1 checksum,只有变动的文件才会写入。

1
➜  ~ hexo generate --watch

本地运行

1
2
3
4
5
6
7
8
9
10
11
➜  hexo server
INFO Start processing
INFO Generate link 798806741 for post [Hexo初次使用及部署到云服务器详细指南.md]
WARN ===============================================================
WARN ========================= ATTENTION! ==========================
WARN ===============================================================
WARN NexT repository is moving here: https://github.com/theme-next
WARN ===============================================================
WARN It's rebase to v6.0.0 and future maintenance will resume there
WARN ===============================================================
INFO Hexo is running at http://localhost:4000/. Press Ctrl+C to stop.

最后一行可知道:

hexo server可简写为hexo s

WordPress迁移

首先,安装 hexo-migrator-wordpress 插件。

1
➜  ~ cnpm install hexo-migrator-wordpress --save

在 WordPress 仪表盘中导出数据(“Tools” → “Export” → “WordPress”)(详情参考WP支持页面)。

插件安装完成后,执行下列命令来迁移所有文章。source 可以是 WordPress 导出的文件路径或网址。

1
➜  ~ hexo migrate wordpress <source>

注意
这个插件并不能完美地实现WordPress->Hexo的数据转换,尤其是在处理WordPress的分类方面存在问题(见Front-matter中的分类与标签)。因此,建议您在迁移完成后,手工审阅所有生成的markdown文件,检查其中是否有错误。对于文章数量较大的WordPress站点,这项工作可能要花很长的时间。

其他博客平台的迁移情参考官方文档
迁移

部署

Hexo 提供了快速方便的一键部署功能,让您只需一条命令就能将网站部署到服务器上。

1
➜  ~ hexo deploy

hexo deploy可简写为hexo d

在开始之前,您必须先在 _config.yml 中修改参数,一个正确的部署配置中至少要有 type 参数,例如:

1
2
deploy:
type: git

您可同时使用多个 deployer,Hexo 会依照顺序执行每个 deployer。

1
2
3
4
5
deploy:
- type: git
repo:
- type: heroku
repo:

在部署之前尽量先运行hexo clean,将本地清空,再hexo generatehexo deploy
这三条命令可用&&符号连接,结果如下:

1
➜  ~ hexo clean && hexo generate && hexo deploy

简写后为

1
➜  ~ hexo cl && hexo g && hexo d

hexo g && hexo d还可简写为hexo g -d

Hexo 插件hexo-deployer-git

由于我使用的是git管理,所以Hexo需要安装hexo-deployer-git

1
➜  ~ cnpm install hexo-deployer-git --save

修改配置

1
2
3
4
deploy:
type: git
repository: <git 仓库地址>
branch: master

其中<git 仓库地址>在下一章节创建git仓库目录中产生。

其他方式的部署,请参考官方文档部署

云服务器端配置Git

安装Git

一般云服务器是装有Git的,也可用yum install git命令安装git。
也可参考CentOS下搭建Git服务器(基于SSH协议)手动下载最新版git,再进行配置安装。

创建一个 GIT 用户,用来运行 GIT 服务

* 创建用户:`adduser git`
* 设置密码:`passwd git`

添加证书

* 切换到git用户:`su git`
* 进入git用户主目录:`cd`或`cd ~`
* 创建.ssh目录:`mkdir .ssh && chmod 700 .ssh`
* 创建authorized_keys公钥保存文件:`touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys`

接着,我们需要为系统用户 git 的 authorized_keys 文件添加一些开发者 SSH 公钥。 假设我们已经获得了若干受信任的公钥,并将它们保存在临时文件中。 与前文类似,这些公钥看起来是这样的:

1
2
3
4
5
6
7
$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair

将这些公钥加入系统用户 git 的 .ssh 目录下 authorized_keys 文件的末尾:

1
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys

或者直接用echo命令将公钥文件内容追加到authorized_keys文件中(由于公钥文件内容中是没有换行符存在,所以可以用echo追加),如下:

1
2
3
4
5
6
$ echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair" >> ~/.ssh/authorized_keys

创建git仓库目录

创建一个名为blog的git仓库

1
2
3
mkdir /var/repo
cd /var/repo
git init --bare blog.git

配置 GIT HOOKS

1
vim /var/repo/blog.git/hooks/post-receive

添加

1
2
#!/bin/sh
git --work-tree=/var/www/hexo --git-dir=/var/repo/blog.git checkout -f

然后保存退出,并设置权限

1
chmod +x /var/repo/blog.git/hooks/post-receive

改变 BLOG.GIT 目录的拥有者为 GIT 用户

1
chown -R git:git blog.git

创建静态文件目录并将创建git仓库目录步骤生成的git仓库链接到静态文件目录下

* 创建静态文件目录(文章网页):mkdir /var/www/hexo
* 链接git仓库:chown -R git:git /var/www/hexo
* 配置权限:chmod -R 755 /var/www/hexo

这样git仓库更新便会自动同步到hexo目录下

到此步,服务器端的git配件基本完成,此git仓库的地址为git@本服务器ip:/var/repo/blog.git,现在可以回到Hexo 插件hexo-deployer-git,将此地址填入repository:内。
注:git仓库的地址格式为git账户@服务器地址:git仓库文件全路径

为了安全考虑,禁用GIT用户的SHELL 登录权限配置(下面两个步骤非常重要,否则客户端总是提示密码错误!!!)

  • 首先你必须确保 git-shell 已存在于 /etc/shells 文件中

    • 使用命令which git-shell判断系统是否安装了git-shell。如果已经安装,则返回git-shell的安装目录,如:/usr/bin/git-shell;如果未安装则需要安装git-shell命令,安装命令:yum install git
    • 判断shells文件是否存在,判断命令:cat /etc/shells
    • 如果文件不存在或没有/usr/bin/git-shell,则需要使用vim增加这个路径:
      sudo vim /etc/shells,在最后一行添加git-shell路径

      1
      2
      3
      4
      5
      6
      7
      8
      /etc/shells: valid login shells 
      /bin/sh
      /bin/dash
      /bin/bash
      /bin/rbash
      /usr/bin/tmux
      /usr/bin/screen
      /usr/bin/git-shell

      /usr/bin/git-shell为git-shell路径,故添加进去。

  • 现在你可以使用 chsh 命令修改任一系统用户的shell权限了
    现在我们修改第一步中创建的git用户的登录权限,禁止git用户使用shell权限:
    终端中输入sudo chsh git
    然后在Login Shell [/bin/bash]:后输入git-shell路径/usr/bin/git-shell

修改完成后验证: vim /etc/passwd找到类似git:x:1000:1000:,,,:/home/git:/usr/bin/git-shell,看看git用户是否是以git-shell结尾

  • 这样,git用户就只能使用SSH连接对Git仓库进行推送和拉取操作,而不能登录机器并取得普通shell命令

添加Apache虚拟站点

添加Apache虚拟站点,将/var/www/hexo设为该站点根目录。
重启apache

1
systemctl restart httpd

文档

坚持原创技术分享,您的支持是对我最大的鼓励!