一直以来我的hexo博客都是用自带的server跑,然后nginx反代,说白了hexo s只是用于生产环境下使用的,我却一只用于部署。没用到hexo生成静态页面和部署,有点遗憾也有不少的弊端。
但是hexo deploy大多数人是部署到github上,我并不想用github的域名,也不想部署到github上再把自己的域名解析CNAME到上面,因为国内github的访问时不时就有问题,而且这样有一种“寄人篱下”的感觉,很不爽。
于是就得自建git服务再部署了。
所幸过程也并不繁琐,简单来说也就下面几步:
- 先建立git服务,配置好远程仓库
- 在hexo配置中设置push到远程仓库
- 设置git hook,钩子把静态资源拷贝到自定义网站目录
- nginx配置web server
剩下的就用hexo原生的生成静态文件,上传部署,两步走即可
下面讲讲详细过程
在服务器上搭建git服务并配置
当然首先服务器上得装好git,用软件包管理安装即可,不多赘述
创建git用户
这里我们创建一个git用户,用来运行git服务
1 | sudo adduser git |
设置免密登录(ssh密钥对)
由于你的本地Git仓库和Git仓库之间的传输是通过SSH加密的,所以之后本机hexo部署上传需要设置密钥登录
首先在本地机生成密钥对ssh-keygen -t rsa
这里详细的关于密钥对的设置和介绍我曾经在hadoop的那篇博文里提过了
不了解ssh的可以去看一下 点击这里跳转
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥内容导入到/home/git/.ssh/authorized_keys文件里,一行一个。
这里我们就直接把本地的~/.ssh/id_rsa.pub内容直接复制添加到服务器的/home/git/.ssh/authorized_keys文件即可。
之后本机尝试免密登录服务器git用户ssh git@server.ip,如果可以表示之前的设置无误。
那现在我们为了安全起见就可以禁用git用户登录shell了
编辑服务器/etc/passwd文件,找到类似下面的这行git:x:1001:1001:,,,:/home/git:/bin/bash
将其改为git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
即可。这样,git用户可以正常通过ssh使用git,但无法登录shell。
这里测试时如果无法免密登录,有很大的原因是因为服务器git用户目录的.ssh目录权限和里面文件权限问题 这里通过chmod命令将.ssh目录权限设置成700,里面的文件权限为600,并且owner为git
这个在之前的hadoop博文里也是提到了,可以去了解
初始化远程Git仓库
首先自定义git仓库位置,假定是/home/git/blog.git,在/home/git目录下输入命令
1 | sudo git init --bare blog.git |
Git就会创建一个裸仓库
然后我们把该目录的owner改为git
1 | sudo chown -R git:git blog.git |
现在我们在本地随便什么地方,试试clone这个裸仓库,如果没问题即可
1 | git clone git@server.ip:~/blog.git |
设置git hook(钩子)
首先cd到远程仓库的hooks目录下,cd /home/git/blog.git/hooks
之后创建并编写post-receive文件,vim post-receive
1 | #!/bin/bash -l |
其中public_www就是用于最终存放nginx映射的静态资源文件目录
* 通过此脚本,每次仓库接收到新上传的内容时都会自动拷贝资源到该目录下 *
这里的
tmp目录可能要自己新建,mkdir /home/git/tmp即可。
然后记得更改脚本和各个目录的权限
1 | chmod +x /home/git/blog.git/hooks/post-receive |
在hexo配置中设置push到远程仓库
修改hexo工程的_config.yml文件,在deploy项中填写:
1 | deploy: |
Nginx 配置
这一步熟悉Nginx的小伙伴应该可以自己写,我这里就贴一个样例,目录啥的都是上面提到的
1 | server { |
这种最简单的就可以了
当然如果你是像我这样用http的话就得稍微改一改,还得把80重定向到443
这种设置如果你用到了不会的话就自行百度吧~
本地测试hexo博客后上传部署
这就是最后啦,每次写完博文或者修改之后,先在本地工程目录下跑一下服务
1 | hexo s -p 端口号 |
然后打开浏览器查看测试的博客页面
没有问题的话就可以生成静态资源了,当然先清除掉public目录下已有的静态资源文件
1 | hexo clean |
这之后你可以使用这个命令测试
1 | hexo s -s -p 端口号 |
多加一个-s表示只用静态资源跑服务器测试,测试一下静态资源的生成,同样打开浏览器查看网站
现在确认无误之后就要把静态资源上传部署到服务器了
1 | hexo d |
不报错的话说明没有问题啦,大功告成