由來:之前使用過一段時間的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這個部分。
到此為止,就配置完了。