利用git服务器在Linux服务器上部署hexo

前言:

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博客网站部署到了这个服务器主机上。

步骤:

  1. 首先,为了能让本地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文件)
  2. 然后在服务器端创建一个操作系统用户git,并为其建立一个 .ssh 目录。然后在.ssh中创建一个authorized_keys文件。要注意权限给的一定要对。

    1
    2
    3
    4
    5
    sudo adduser git
    $ su git
    $ cd
    $ mkdir .ssh && chmod 700 .ssh
    $ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
  3. 接着,我们需要为系统用户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。

  4. 然后我们要在服务器上安装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/
  5. 这样git服务器仓库就搭建好了,我们回到本地,打开hexo的配置文件_config.yml,修改deploy如下配置(其中的xxx.xxx.xxx.xxx可以是服务器主机的公网ip,也可以是服务器主机的域名):

    1
    2
    3
    4
    5
    deploy: 
    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
    9
    deploy: 
    - 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就可以了。

  6. 然而还没完,我们只是把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
  7. 最后在本地执行hexo g,hexo d几秒就可以完成博客的更新了。

致谢

本文重点参考了git的官方文档,和http://blog.berry10086.com/Tech/deploy-hexo-to-vps/,向伟大的开源社区和互联网精神以及参考文章作者致谢。同时也诚恳地接受各位读者点评和意见,无论是技术错误还是行文错误。也欢迎在留言中与我互动。

后记

第一次写这么长的博客,接近五千个字,花了三个多小时,很累却很开心。没有哪一门技术是最强最有前途的,按着自己的兴趣走才是最棒的。

——————————-2015.11.21 2:41 北京 绝世盗草人

(本文系作者原创,转载请注明出处)