前言:
hexo是我目前见过的最漂亮的博客,相比较wrodpress而言,它轻便,时尚,定制自由度极高,而且完全开源免费,支持各种开源主题、插件。很多极客都采用hexo作为自己的博客,我也不例外(虽然我还算不上一名极客),本博客就是用hexo搭建的,是不是很意外?这么漂亮、完美、功能众多的博客居然是静态的?然而确实是这样,这就是hexo的魅力所在。
至于怎么安装配置hexo,hexo的官方博客讲的特别清楚,作者是台湾人,支持中文简体、中文繁体、英文浏览该网站。另外网上也有不少关于在github提供的github pages上部署hexo的教程,比如这篇博客讲的非常全面,我就不在此赘述了。
可是github pages因为某道万恶的墙的原因,国内访问速度比较慢,而且更新博客后要等个几分钟才能看到网页效果,因此我们自然想到将其部署在国内的服务器主机上。
写作本文之前,我只在百度找到了两篇关于在自己的服务器主机而不是github pages上搭建hexo的教程,这两篇文章写的也不错,但是我在实际操作过程中还是遇到了不少坑,于是决定再写一篇博文记录我遇到的坑。由于我的服务器是Linux的 系统。因此本文将结合前人的经验讲述如何在自己的Linux服务器上搭建hexo教程。另外如果你已经在github pages部署成功,你也可以看本教程,本教程也可以帮助你在服务器主机部署好hexo后还能不影响github pages上hexo的更新。
正文:
阅读本博客准备工作:按照官方博客或者这篇博文在本地安装好hexo和git(git教程请看这)只差部署(deploy)配置没有完成或者已经在github pages部署好了。
本教程使用的服务器:腾讯云租的云服务器。
服务器操作系统:ubuntu server 14.04 32位。
服务器Web环境:Nginx(关于如何在Linux服务器搭建Nginx请参考我另一篇博文在linux服务器安装配置Nginx),别的环境也行,只要能确保静态网页能被浏览器访问到即可。
原理:
hexo支持使用git部署,网上许多部署到github pages的教程本质也是使用git部署,只不过hexo g
生成的public文件夹里的代码是被推送到远程仓库github托管,而不是被推送到我们自己的远程git服务器仓库托管罢了。只要我们在自己的服务器主机上搭建好一个git服务器仓库,然后把pubiic文件夹代码托管到这个远程git服务器仓库里,然后在服务器主机上取出git服务器仓库里的代码,复制到网站的根目录下,那么我们就把hexo博客网站部署到了这个服务器主机上。
步骤:
- 首先,为了能让本地hexo连上服务器主机上的git服务器仓库,我们需要通过ssh协议来连接本地和服务器端。
在本地用户的.ssh文件夹里(windows是C:\Users\ahtcfg24\.ssh
其中的ahtcfg24是我的windows用户名,你需要改成你自己的)创建一对密钥:
进入.ssh文件夹,右键空白处打开git bash here,输入ssh-keygen -t rsa -C "这里填写一些说明文字,随便你写"
,然后一路回车,你就会得到两个密钥文件,id_rsa.pub和id_rsa,pub结尾的是公钥,另一个是私钥,关于ssh的公钥和私钥,本文不再阐述,详情请自行学习ssh,这里我们把这个pub文件上传到服务器主机的一个别的用户有权完全控制的目录里,比如/tmp。(如果你曾经使用过ssh生成了一对这样的文件,你也可以上传你以前生成的pub文件) 然后在服务器端创建一个操作系统用户git,并为其建立一个 .ssh 目录。然后在.ssh中创建一个authorized_keys文件。要注意权限给的一定要对。
1
2
3
4
5sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys接着,我们需要为系统用户git的authorized_keys文件添加我们本地机器的公钥:
注意此时一直都是git用户操作cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
这样我们就完成了本地和服务器主机的连接认证机制,你可以在本地的git bash中输入ssh git@xxx.xxx.xxx.xxx
来测试是否可以连接到服务器主机,其中的xxx.xxx.xxx.xxx可以是服务器主机的公网ip,也可以是服务器主机的域名。如果连接不成功,请检查你的公钥是不是在/home/git/.ssh/authorized_keys里面,以及这些文件和文件夹的权限是不是正确的,或者可以尝试把这些文件夹和文件的权限改到777。然后我们要在服务器上安装git
sudo apt-get install git
再在一个git用户有权限读写删除执行的目录下建立一个git服务器仓库(参考了官方文档)。
假设var/git
这个文件夹存在且权限为777,现在我们来新建一个空仓库。可以借助带--bare
选项的git init
命令来做到这一点,该命令在初始化仓库时不会创建工作目录:1
2
3
4
5$ cd /var/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /opt/git/project.git/这样git服务器仓库就搭建好了,我们回到本地,打开hexo的配置文件_config.yml,修改deploy如下配置(其中的xxx.xxx.xxx.xxx可以是服务器主机的公网ip,也可以是服务器主机的域名):
1
2
3
4
5deploy:
type: git
repo: git@xxx.xxx.xxx.xxx:/var/git/project.git
message: update blog
branch: master如果你本来已经在github pages上部署好了,那么你的配置就这样写:
1
2
3
4
5
6
7
8
9deploy:
- type: git
repo: git@xxx.xxx.xxx.xxx:/var/git/project.git
message: update blog
branch: master
- type: git
repository: 这里换成你自己的githubpage仓库
message: update blog
branch: master这个时候,你再去利用
hexo g
,hexo d
就能把public里面的文件代码推送到服务器上的git仓库里了。如果出现appears not to be a git repo
的错误,删除hexo目录下的.deploy后再次hexo g
,hexo d
就可以了。然而还没完,我们只是把public文件夹传到了服务器主机的git仓库里,还没放到网站根目录,接下来,我们可以写个服务器端的脚本,让服务器自动把我们的public文件夹clone出来,然后复制到网站根目录就可以了。于是我们就要用到git hooks了,在每次推送完成后,执行一段脚本,把project.git里的内容clone出来,再复制到网站根目录,假如你的根目录是
/var/www/blog
。1
2
3$ cd ~/blog.git/hooks
$ touch post-receive
$ vi post-receive按insert键后输入下面的脚本
1
2
3
4
5
6
7
8#!/bin/bash -l
GIT_REPO=/var/git/project.git
TMP_GIT_CLONE=/tmp
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}按esc退出,再输入
:wq
回车,保存文件
然后要更改脚本权限和/var/www/blog
权限:1
2$ chmod +x post-receive
$ sudo chmod 777 -R /var/www/blog最后在本地执行
hexo g
,hexo d
几秒就可以完成博客的更新了。
致谢
本文重点参考了git的官方文档,和http://blog.berry10086.com/Tech/deploy-hexo-to-vps/,向伟大的开源社区和互联网精神以及参考文章作者致谢。同时也诚恳地接受各位读者点评和意见,无论是技术错误还是行文错误。也欢迎在留言中与我互动。
后记
第一次写这么长的博客,接近五千个字,花了三个多小时,很累却很开心。没有哪一门技术是最强最有前途的,按着自己的兴趣走才是最棒的。
——————————-2015.11.21 2:41 北京 绝世盗草人