整整一年多的时间没有打理过博客了,趁这次整理博客的机会,将博客迁移到Hexo.

本地安装hexo

Hexo 是一个简单地、轻量地、基于Node的一个静态博客框架,所以本地需要nodejs的环境。然后根据官方的说明安装:

npm install hexo-cli -g
hexo init blog
cd blog
npm install

由于一些原因,npm install的时候会很慢,你可以使用淘宝的cnpm:http://npm.taobao.org/

迁移Wordpress文件到hexo

同样根据官方的文档迁移Wordpress的文章到hexo也是件很容易的事。 首先登录Wordpress后台导出xml文件,然后安装hexo-migrator-wordpress插件。 然后运行下面的命令: hexo migrate wordpress <source> source为上面导出的wordpress xml文件的路径。 然后到source/_post/ 目录下会出现很多.md文件,你可能需要根据自己的要求进行相应的修改。

然后运行 hexo server 打开浏览器访问http://localhost:4000 即可查看博客界面。 只是默认的主题你可能不太喜欢,你可以在这里:https://hexo.io/theme选择一个你喜欢的主题安装。本站的主题是在NexT的基础上修改的。

生成并部署到服务器

hexo也有多种部署插件,我最先尝试的是hexo-deployer-rsync,只是不知道何原因同步到服务器之后中文文件名最成了?????.然后尝试使用hexo-deployer-ftpsync,文件总不能完整的上传完毕。 最终还是选择了hexo-deployer-git的方式。 下面记录一下过程。

首先保证本地和服务器端都安全了git环境。另外我打算使用SSH的方式验证git登录,不使用密码的方式。

在本地先生成ssh密钥

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

回车后会需要输入一些信息,如果使用Mac建议设置一个密码,第一次登录后可以使用keychain保存。

服务端添加git用户并上传上面生成的ssh密钥

# 添加git用户,--disabled-password:可以登录(如使用SSH RSA keys),但不能使用密码认证
sudo adduser --shell $(which git-shell) --gecos 'git version control' --disabled-password git

因为我设置Nginx运行的用户为www-data,而且网站目录也属于www-data,所以为了保证后面git可以正常读写网站目录下的文件,需要添加用户到www-data组,然后将网站目录权限设置为775.

usermod -a -G www-data git
chmod 775 /var/www/blog -R

添加git用户之后,将上面生成的.pub 公钥文件中的内容复制到/home/git/.ssh/authorized_keys

#Setup authorized_keys file for access
mkdir -p /home/git/.ssh
touch /home/git/.ssh/authorized_keys
chmod 600 /home/git/.ssh/authorized_keys
chmod 700 /home/git/.ssh

然后可以验证登录了: ssh -T -P yoursshport git@yourip 正常情况下已经可以正常登录。只是因为我们上面在添加git用户的时候,设置的shell为git-shell,所以git用户是不能登录到shell的。

在服务器端添加git仓库

cd /home/git
mkdir blog.git && cd blog.git
git init --bare

顺便添加hooks。当我们hexo d部署后只是将文件上传到了服务器上的git仓库,并没有上传到Nginx设置的网站目录,所以我们需要添加一个hooks脚本,当git有更新时,拷贝文件到网站目录。

vim /home/git/blog.git/hooks/post-update

然后添加下面的内容,注意修改相关的目录变量。

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

要注意修改相关文件的权限,不然git用户无法执行相关的命令。

chmod +x /home/git/blog.git/hooks/post-update
chown git:git /home/git/ -R

之后再修改一下Nginx的配置文件,这部分不在叙述了,之前也写了不少相关的博文,对比Wordpress,hexo生成后的全是静态文件,所以在Nginx中也不需要PHP相关的配置。 到此服务端配置Ok了。

在_config.yml文件配置deploy的地方,因为我修改了ssh默认的端口,而查看文档没有类似port的字段。经过尝试,deploy可以写成:

  deploy:
	  type: git
	  repo: ssh://git@ip:<port>/home/git/blog.git

最后在本地hexo g && hexo d 之后即可查看到网站内容了。^_^