由來:之前使用過一段時間的hexo,但是每回提交文章的時候,就在本地的電腦上執(zhí)行一段時間,雖然不多,但是挺煩的。
靈感:無意之中,看到了云主機(jī)和VPS的區(qū)別這類的文章,忽然想到既然我的云主機(jī)有計算的能力,那為何我非得自己的電腦執(zhí)行一堆云主機(jī)也可以執(zhí)行的命令了,云主機(jī)我也是花了真金白銀的。讓云主機(jī)老閑著,我都感覺對不起自己,于是乎我重新整理了我的博客,讓云主機(jī)開始干那么一點(diǎn)點(diǎn)活。
基礎(chǔ):
使用過hexo博客的人都知道,hexo博客要使用hexo clean && hexo g && hexo d的命令將本地的MarkDown文件生成html的靜態(tài)文件,然后使用hexo d的命令推送到服務(wù)器。這里推薦一篇不錯的博客,用于將hexo的博客部署到自己的云主機(jī)上。https://www.micronbot.com/blog/8.html。
條件:
- 新建一個用戶用于Git的推送和克隆
- Git服務(wù)端
- nvm 用于安裝node環(huán)境
- hexo
- pm2 用于維護(hù)hexo的進(jìn)程
這里以CentOS的為例
Step1:新建一個用戶用于Git的推送和克?。◤?qiáng)烈建議第一步執(zhí)行這個)
useradd git
passwd git
//建立git這個用戶的密碼
su git //切換到git用戶,執(zhí)行后面的操作。
后面的命令一定要在git用戶下操作,要么會導(dǎo)致git權(quán)限不夠的問題
Step2:配置Git服務(wù)端
執(zhí)行一句命令即可
yum install git
等待一段時間以后,可以使用如下命令查看是否安裝成功。
git --version
Step3:安裝nvm 用于安裝node環(huán)境
Node Version Manager 這個nvm在github的官網(wǎng)
用于如下命令安裝nvm,當(dāng)然官網(wǎng)也提供了wget的安裝方式,請大家到NVM的官網(wǎng)自己去看吧。
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
同樣,可是使用nvm --version的命令查看nvm的安裝情況。
Step4:安裝NodeJS 用于安裝hexo環(huán)境
使用如下命令會安裝嘴最新版本的Node,當(dāng)然也可以安裝指定的版本。
nvm install node
同樣,使用node --version的命令查看Node的安裝情況。
Step5: 安裝hexo環(huán)境
安裝好Node的同時,也安裝NPM的這個管理器,我們使用npm的命令安裝hexo。HEXO官網(wǎng)
npm install hexo-cli -g
Step6: 安裝PM2用于維護(hù)hexo的進(jìn)程
推薦一個PM2的介紹文章PM2 介紹
使用如下命令安裝PM2
npm install pm2 -g
這樣的話,準(zhǔn)備工作完成了,接下來開始配置,首先說一個流程
- 配置裸倉庫
- 建立hexo博客訪問的目錄
- 新建app.js ,用于PM2維護(hù)hexo
- 使用端口轉(zhuǎn)發(fā)的命令,讓hexo博客默認(rèn)的4000端口轉(zhuǎn)到80端口
- 新建hooks,每當(dāng)git更新的時候,用于更新博客
- 修改git權(quán)限,禁止ssh登錄。
我這里將倉庫和訪問目錄全部放在git這個用戶的家目錄里/home/git/。
Step1: 配置裸倉庫
這里說一下裸倉庫和普通倉庫的區(qū)別,裸倉庫沒有工作區(qū),而普通倉庫有。普通倉庫不能提交,而裸倉庫可以。
git init --bare hexo.git
使用上面的命令建立一個裸倉庫,現(xiàn)在我們可以在本地克隆這個倉庫,也可以提交,但是由于沒有工作區(qū)我們不能直觀的看到提交的東西。我們可以使用這個命令來查看
git clone /home/git/blog/hexo.git /home/git/blog/hexo/
上面的命令是將hexo.git 克隆到/home/git/blog/hexo/,其實(shí)和我們克隆服務(wù)端的git一樣。那么克隆成功以后,我們就可以在/home/git/blog/hexo/這個目錄里看到我們提交的文件了,一會我們會在hooks里配置這個命令的。
Step2:配置Hexo博客(在本地電腦執(zhí)行)
當(dāng)我們在本地克隆下hexo.git的倉庫后,會有一個hexo的文件夾。那么我們就在這個文件夾里初始化hexo,建立hexo博客,然后提交到服務(wù)端。
hexo init
建立好hexo的博客以后,我們在source/posts這個文件夾里新建一個MarkDown的文件,然后我們提交到服務(wù)器上,使用上之前提到的命令可以看到我們提交的東西。
Step3:新建app.js ,放在本地hexo的文件夾里,用于PM2維護(hù)hexo
我這個是在網(wǎng)上復(fù)制的
var spawn = require('child_process').spawn;
free = spawn('hexo', ['server', '-p 4000']);/* 其實(shí)就是等于執(zhí)行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: 使用端口轉(zhuǎn)發(fā)的命令,讓hexo博客默認(rèn)的4000端口轉(zhuǎn)到80端口
因?yàn)?0端口只有root權(quán)限的用戶才能使用,而我們使用git這個用戶無法使用80端口,那么我們使用端口轉(zhuǎn)發(fā)的功能。大家可以看這個文章配置iptables,把80端口轉(zhuǎn)到8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 4000
Step5:新建hooks,每當(dāng)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這個是用于展示的目錄。
- 刪除展示目錄
- 克隆
- 切換到展示目錄
- 清除緩存,并生成新的靜態(tài)博客。
- pm2刪除所有運(yùn)行的進(jìn)程(這個只是為了維護(hù)hexo的進(jìn)程,沒有其他的,如果有其他的進(jìn)程,那么根據(jù)進(jìn)程ID刪除)
- 使用pm2維持hexo博客的進(jìn)程。
復(fù)制上面的代碼到post-receive這個文件里保存。這里需要注意的是,post-receive這個文件的權(quán)限應(yīng)該是git這個用戶的。如果不是,使用如下這個命令修改,這里講git家目錄下的文件夾和文件的權(quán)限的變成git這個用戶。
chown -R git:git /home/git/blog/
再使用如下命令,為post-receive這個文件增加執(zhí)行的權(quán)限
chmod +x /home/git/blog/hexo.git/hooks/post-receive
Step6:修改git權(quán)限,禁止ssh登錄
打開/ect/passwd這個文件,找到git這個用戶,修改他的權(quán)限
git:x:1003:1003:,,,:/home/git:/bin/bash
改為
git:x:1003:1003:,,,:/home/git:/usr/bin/git-shell
主要是修改后面的usr/bin/git-shell這個部分。
到此為止,就配置完了。