配置hexo博客,让云服务器执行它计算处理的使命
由来:之前使用过一段时间的hexo,但是每回提交文章的时候,就在本地的电脑上执行一段时间,虽然不多,但是挺烦的。
灵感:无意之中,看到了云主机和VPS的区别这类的文章,忽然想到既然我的云主机有计算的能力,那为何我非得自己的电脑执行一堆云主机也可以执行的命令了,云主机我也是花了真金白银的。让云主机老闲着,我都感觉对不起自己,于是乎我重新整理了我的博客,让云主机开始干那么一点点活。
基础:
使用过hexo博客的人都知道,hexo博客要使用hexo clean && hexo g && hexo d的命令将本地的MarkDown文件生成html的静态文件,然后使用hexo d的命令推送到服务器。这里推荐一篇不错的博客,用于将hexo的博客部署到自己的云主机上。https://www.micronbot.com/blog/8.html。
条件:
- 新建一个用户用于Git的推送和克隆
- Git服务端
- nvm 用于安装node环境
- hexo
- pm2 用于维护hexo的进程
这里以CentOS的为例
Step1:新建一个用户用于Git的推送和克隆(强烈建议第一步执行这个)
useradd git
passwd git
//建立git这个用户的密码
su git //切换到git用户,执行后面的操作。
后面的命令一定要在git用户下操作,要么会导致git权限不够的问题
Step2:配置Git服务端
执行一句命令即可
yum install git
等待一段时间以后,可以使用如下命令查看是否安装成功。
git --version
Step3:安装nvm 用于安装node环境
Node Version Manager 这个nvm在github的官网
用于如下命令安装nvm,当然官网也提供了wget的安装方式,请大家到NVM的官网自己去看吧。
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
同样,可是使用nvm --version的命令查看nvm的安装情况。
Step4:安装NodeJS 用于安装hexo环境
使用如下命令会安装嘴最新版本的Node,当然也可以安装指定的版本。
nvm install node
同样,使用node --version的命令查看Node的安装情况。
Step5: 安装hexo环境
安装好Node的同时,也安装NPM的这个管理器,我们使用npm的命令安装hexo。HEXO官网
npm install hexo-cli -g
Step6: 安装PM2用于维护hexo的进程
推荐一个PM2的介绍文章PM2 介绍
使用如下命令安装PM2
npm install pm2 -g
这样的话,准备工作完成了,接下来开始配置,首先说一个流程
- 配置裸仓库
- 建立hexo博客访问的目录
- 新建app.js ,用于PM2维护hexo
- 使用端口转发的命令,让hexo博客默认的4000端口转到80端口
- 新建hooks,每当git更新的时候,用于更新博客
- 修改git权限,禁止ssh登录。
我这里将仓库和访问目录全部放在git这个用户的家目录里/home/git/。
Step1: 配置裸仓库
这里说一下裸仓库和普通仓库的区别,裸仓库没有工作区,而普通仓库有。普通仓库不能提交,而裸仓库可以。
git init --bare hexo.git
使用上面的命令建立一个裸仓库,现在我们可以在本地克隆这个仓库,也可以提交,但是由于没有工作区我们不能直观的看到提交的东西。我们可以使用这个命令来查看
git clone /home/git/blog/hexo.git /home/git/blog/hexo/
上面的命令是将hexo.git 克隆到/home/git/blog/hexo/,其实和我们克隆服务端的git一样。那么克隆成功以后,我们就可以在/home/git/blog/hexo/这个目录里看到我们提交的文件了,一会我们会在hooks里配置这个命令的。
Step2:配置Hexo博客(在本地电脑执行)
当我们在本地克隆下hexo.git的仓库后,会有一个hexo的文件夹。那么我们就在这个文件夹里初始化hexo,建立hexo博客,然后提交到服务端。
hexo init
建立好hexo的博客以后,我们在source/posts这个文件夹里新建一个MarkDown的文件,然后我们提交到服务器上,使用上之前提到的命令可以看到我们提交的东西。
Step3:新建app.js ,放在本地hexo的文件夹里,用于PM2维护hexo
我这个是在网上复制的
var spawn = require('child_process').spawn;
free = spawn('hexo', ['server', '-p 4000']);/* 其实就是等于执行hexo server -p 4000*/
free.stdout.on('data', function (data) {
console.log('standard output:\n' + data);
});
free.stderr.on('data', function (data) {
console.log('standard error output:\n' + data);
});
free.on('exit', function (code, signal) {
console.log('child process eixt ,exit:' + code);
});
Step4: 使用端口转发的命令,让hexo博客默认的4000端口转到80端口
因为80端口只有root权限的用户才能使用,而我们使用git这个用户无法使用80端口,那么我们使用端口转发的功能。大家可以看这个文章配置iptables,把80端口转到8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 4000
Step5:新建hooks,每当git更新的时候,用于更新博客
新建一个名叫post-receive的文件,这个文件放在/home/git/blog/hexo.git/hooks/文件夹里。
#!/bin/bash -l
GIT_REPO=/home/git/blog/hexo.git
PUBLIC_WWW=/home/git/blog/hexo
rm -rf ${PUBLIC_WWW}
git clone $GIT_REPO $PUBLIC_WWW
cd $PUBLIC_WWW
hexo clean && hexo g
pm2 delete all
pm2 start app.js
if [[ $? == 0 ]]
then
echo "Congratulations! Your blog has been correctly deployed"
else
echo "Unfortunately your blog has not been deployed correctly"
fi
这里讲一下这个Shell脚本,
- GIT_REPO这个是上面建立的裸仓库。
- PUBLIC_WWW这个是用于展示的目录。
- 删除展示目录
- 克隆
- 切换到展示目录
- 清除缓存,并生成新的静态博客。
- pm2删除所有运行的进程(这个只是为了维护hexo的进程,没有其他的,如果有其他的进程,那么根据进程ID删除)
- 使用pm2维持hexo博客的进程。
复制上面的代码到post-receive这个文件里保存。这里需要注意的是,post-receive这个文件的权限应该是git这个用户的。如果不是,使用如下这个命令修改,这里讲git家目录下的文件夹和文件的权限的变成git这个用户。
chown -R git:git /home/git/blog/
再使用如下命令,为post-receive这个文件增加执行的权限
chmod +x /home/git/blog/hexo.git/hooks/post-receive
Step6:修改git权限,禁止ssh登录
打开/ect/passwd这个文件,找到git这个用户,修改他的权限
git:x:1003:1003:,,,:/home/git:/bin/bash
改为
git:x:1003:1003:,,,:/home/git:/usr/bin/git-shell
主要是修改后面的usr/bin/git-shell这个部分。
到此为止,就配置完了。