阿里云基于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一下,生成新的静态文件并且退送,我们的网站就会自动更新了~