阿里云基于git部署hexo静态博客的技巧

一般部署hexo都是在github上申请一个免费的二级域名,把静态文件部署上去,但是这样就没办法和自己的网站挂钩了。比如我现在,阿里云有一台在跑的服务器,以及独立域名:liushuqing.com

我可以把hexo放到一个二级域名上,比如XXX.liushuqing.com

可是hexo不是SpringMVC或者django,不需要代码运行在服务器上。我们只需要在个人电脑上运行代码,生成编译好的静态文件。然后把静态文件用nginx部署好,就可以了。

现在我们可以按照这个思路,如下来处理hexo的部署问题

1.本地生成hexo静态文件

//项目根目录下运行
hexo g  

2.打包压缩项目生成好的静态文件

3.把静态文件包远程推送到阿里云服务器

4.解压文件

5.配置nginx二级域名和静态文件目录

server {  
    listen 0.0.0.0:80;
    server_name XXX.liushuqing.com;
    access_log /root/lsq/XXX/XXX_access.log;
    error_log /root/lsq/XXX/XXX.log;
    location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ {
        root /root/XXX/XXX/blog;
        access_log   off;
        expires      1d;
        }
    location ~* ^.+\.(css|js|txt|xml|swf|wav)$ {
        root /root/XXX/XXX/blog;
        access_log   off;
        expires      10m;
    }
    location / {
        root /root/XXX/XXX/blog;
        if (-f $request_filename) {
        rewrite ^/(.*)$  /$1 break;
        }
    }
}

其中步骤5只在第一次的时候用到,但是步骤1、2、3、4每次都要运行。在5中设置的root就是hexo在服务器静态文件的根目录。

如果每次都要这么做,简直蛋疼无比。


在linux上,可以很方便的配置自己的git服务,也就是说,在个人电脑上,直接把代码推送到阿里云服务器上面。按照这个思路,我们可以再把nginx的root指向服务器的git代码目录就好了。这样省去了步骤2、3、4的麻烦。

实际上,这样还面临1个小问题

如何从git仓库里面提取出静态文件

这个问题放到后面说,先介绍一下如何搭建git服务器

参考地址 http://developer.51cto.com/art/201507/483448.htm
关键步骤

1.通过命令 sudo apt-get install openssh-server,安装SSH服务。  
2.通过命令 ps –e|grep ssh,查看ssh服务是否启动。  
3.创建用户git,用来管理运行git服务。  
4.配置无密码SSH登陆  
5.初始化服务器端仓库  
使用命令 git –bare init /home/git/myRep.git,初始化化仓库
6.在本地获取阿里云的git仓库  
Git clone git@阿里云的ip地址:/home/git/myRep.git  
7.把已有的hexo项目托管在这个git仓库下面(或者在现在的myRep下面新建一个hexo项目好了。。。)  

现在这个git项目在阿里云的目录结构如下

drwxr-xr-x   2 git  git  4.0K Apr 21 23:38 branches  
-rw-r--r--   1 git  git    66 Apr 21 23:38 config
-rw-r--r--   1 git  git    73 Apr 21 23:38 description
-rw-r--r--   1 git  git    23 Apr 21 23:38 HEAD
drwxr-xr-x   2 git  git  4.0K Apr 22 13:53 hooks  
drwxr-xr-x   2 git  git  4.0K Apr 21 23:38 info  
drwxr-xr-x 244 git  git  4.0K Jun  4 11:23 objects  
drwxr-xr-x   4 git  git  4.0K Apr 21 23:38 refs  

这儿有一个小东西要科普一下,就是在git服务端,每次收到客户端推送的代码之后,都会执行目录hooks下面的所有脚本文件。。就是shell脚本。下面大概有下面几个文件

-rwxr-xr-x 1 git  git   452 Apr 21 23:38 applypatch-msg.sample
-rwxr-xr-x 1 git  git   896 Apr 21 23:38 commit-msg.sample
-rwxr-xr-x 1 root root  356 Apr 22 13:40 post-receive
-rwxr-xr-x 1 git  git   189 Apr 21 23:38 post-update.sample
-rwxr-xr-x 1 git  git   398 Apr 21 23:38 pre-applypatch.sample
-rwxr-xr-x 1 git  git  1.7K Apr 21 23:38 pre-commit.sample
-rwxr-xr-x 1 git  git  1.3K Apr 21 23:38 prepare-commit-msg.sample
-rwxr-xr-x 1 git  git  1.4K Apr 21 23:38 pre-push.sample
-rwxr-xr-x 1 git  git  4.8K Apr 21 23:38 pre-rebase.sample
-rwxr-xr-x 1 git  git  3.6K Apr 21 23:38 update.sample

其中,post-receive文件是我自己写的脚本,用来处理hexo静态文件的。内容如下

#!/bin/bash -l
GIT_REPO=/root/path/git/XXX.git  
TMP_GIT_CLONE=/root/tem/path/home  
PUBLIC_WWW=/root/path/xxx/blog  
echo "删除旧的文件夹"  
rm -rf ${TMP_GIT_CLONE}  
echo "clone文件到目录"  
git clone $GIT_REPO $TMP_GIT_CLONE  
echo "删除原有静态文件"  
rm -rf ${PUBLIC_WWW}/*  
echo "更新静态文件"  
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}  

这里PUBLIC_WWW就是在nginx里面需要指向的root。 这样一来,每次阿里云接到代码推送,都会执行这个脚本,它会自动提取我们上传好的静态文件,部署在项目根目录下。

最后提一下hexo本地的部署命令,默认好像不是用git协议的,需要在本地项目根目录的_config.yml文件里面修改一下

# Deployment
## Docs: https://hexo.io/docs/deployment.html t
deploy:  
  type: git
  message: update
  repo:
    s1: git@liushuqing.com:/root/path/git/xxx.git

这样一来,只要每次在本地hexo g&d一下,生成新的静态文件并且退送,我们的网站就会自动更新了~

刘摸鱼

退堂鼓表演艺术家

杭州