背景
我不知道有多少人是在自己的服務(wù)器上部署Hexo博客服務(wù)的,反正我是這樣的。最早是因?yàn)間ithub在國(guó)內(nèi)訪問(wèn)有點(diǎn)太慢了,國(guó)內(nèi)的pages服務(wù)又還沒(méi)有出來(lái),剛好自己在云服務(wù)上有一臺(tái)用來(lái)玩的服務(wù)器,所以就直接部署上去。雖然后面國(guó)內(nèi)的pages的也有了,但也懶得再遷移過(guò)去了。但是自己的服務(wù)器上部署Hexo有幾個(gè)問(wèn)題,就是數(shù)據(jù)同步問(wèn)題。用過(guò)Hexo的人都知道,hexo是在我們自己的電腦寫(xiě)博文,然后生成靜態(tài)文件,然后再將public目錄發(fā)布出去。如果是用pages,只需要push上去就行了,如果是在自己的服務(wù)器中,就需要先登錄到服務(wù)器,然后pull,想想都麻煩。
解決方案
以前我都是用Rsync,配置麻煩,用起來(lái)也不是不方便,不過(guò)因?yàn)橐荒暌矝](méi)寫(xiě)幾次博文,也懶得折騰了。最近工作有變動(dòng),想著把劃水的時(shí)間用來(lái)看書(shū)寫(xiě)博文,所謂工欲善,必先利其器,所以準(zhǔn)備把整個(gè)博客系統(tǒng)弄完整一點(diǎn)。


通過(guò)上圖,大家能知道我的整個(gè)博客系統(tǒng)的部署情況以及實(shí)現(xiàn)哪些功能。
有三個(gè)東西:
- Nginx,使用它的反向代理功能,來(lái)實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)
- 一個(gè)是我的hexo博客源碼(不是生成文件)
- Hexo-Manager管理系統(tǒng)(我自己用寫(xiě)的一個(gè)Hexo管理系統(tǒng))
Nginx配置
在整體架構(gòu)圖中,我的服務(wù)器有兩個(gè)服務(wù),一個(gè)是基于Hexo的博客服務(wù),一個(gè)是用于管理Hexo的Hexo-Manager服務(wù)。而我希望blog.robinwu.com的請(qǐng)求到博客系統(tǒng),而manager.robinwu.com的請(qǐng)求到Hexo-Manager服務(wù)。我原來(lái)用nodejs的時(shí)候,用express可以很好的解決這個(gè)問(wèn)題,但是用java寫(xiě)hexo-manager的時(shí)候,卻沒(méi)有找到比較好的方式,而且把兩個(gè)服務(wù)分開(kāi)會(huì)比較好,畢竟當(dāng)Hexo-Manager掛掉后,我還是希望博客服務(wù)可以繼續(xù)可用。
Nginx是一個(gè)高性能的HTTP和反向代理web服務(wù)器,所以我部署了一個(gè)Nginx在服務(wù)器上,用于請(qǐng)求轉(zhuǎn)發(fā)。
安裝Nginx
在mac和linux上安裝Nginx還是比較簡(jiǎn)單,至于windows,因?yàn)槲覜](méi)有安裝過(guò),所以大家如果相應(yīng)需求,可以自行g(shù)ogole下。
mac上安裝
brew install nginx
linxu安裝
yum install nginx
配置反向代理
在安裝完Nginx后,我們需要修改配置文件。
在linux中,配置文件路徑為/etc/nginx/nginx.conf。
在mac中,配置文件路徑為/usr/local/etc/nginx/nginx.conf。
client_max_body_size 20m; #上傳文件大小限制為20M
server {
listen 80 default_server;
server_name *.robinwu.com; # 域名
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
if ($http_host ~* "^(.*?)\.robinwu\.com$") {
set $domain $1;
}
location / {
if ($domain ~* "www") {
root /usr/share/nginx/BlogSource/public; #Hexo生成目錄路徑
}
if ($domain ~* "blog") {
root /usr/share/nginx/BlogSource/public;
}
if ($domain ~* "") {
root /usr/share/nginx/BlogSource/public;
}
if ($domain ~* "manager") {
proxy_pass http://localhost:8080; #Hexo-Manager的本地服務(wù)地址
root index;
}
tcp_nodelay on;
proxy_read_timeout 300; #設(shè)置代理讀超時(shí)時(shí)間為5分鐘,必現(xiàn)上傳文件超時(shí)報(bào)錯(cuò)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
上面的配置文件,就是我服務(wù)器上Nginx的配置項(xiàng),有幾個(gè)東西需要注意下:
client_max_body_size 20m;
這個(gè)配置項(xiàng)使用來(lái)配置上傳文件大小,如果超過(guò)這個(gè)值,Nginx就會(huì)報(bào)錯(cuò),我在Hexo-Manager也相應(yīng)做了這個(gè)限制。*server_name .robinwu.com;
域名,可以根據(jù)自己的情況進(jìn)行修改**if (
") **
我需要讓Nginx根據(jù)blog和manager的前綴進(jìn)行轉(zhuǎn)發(fā)請(qǐng)求,所以這個(gè)正則是用來(lái)獲取這個(gè)前綴的root /usr/share/nginx/BlogSource/public;
配置Hexo的生成文件地址,這個(gè)路徑必須是Nginx有權(quán)限的,所以建議跟我一樣,直接放到Nginx的目錄下proxy_read_timeout 300;
Nginx到Hexo-Manager的轉(zhuǎn)發(fā)請(qǐng)求是有超時(shí)時(shí)間的,為了避免上傳文件超時(shí),所以我將這個(gè)值配置為300S
hexo博客源碼
hexo需要用ssh的方式clone到服務(wù)器上,建議目錄為/usr/share/nginx/,因?yàn)檫@樣就不需要再配置Nginx的訪問(wèn)權(quán)限了。
Hexo-Manager部署
在開(kāi)發(fā)Hexo-Manager的時(shí)候,我也不知道其他人是否也有這個(gè)需求,但是我還是盡量將大部分配置弄成可自定義的,附件大小除外,因?yàn)槲蚁肴绻粋€(gè)附件需要超過(guò)20M,還是在其他平臺(tái)上傳后,再?gòu)?fù)制到文檔中會(huì)比較好。
配置Hexo-Manager
Hexo-Manager的所有的配置都寫(xiě)在/data/hexo-manager/config.json中
{
"userName":"登錄的用戶名",
"passWord":"登錄的密碼",
"hexo.root.dir.path":"/Users/robinwu/Documents/Blog/BlogSource/",
"hexo.posts.dir.path":"/Users/robinwu/Documents/Blog/BlogSource/source/_posts/",
"hexo.drafts.dir.path":"/Users/robinwu/Documents/Blog/BlogSource/source/_drafts/",
"oss.access.key.id":"",
"oss.access.key.secret":"",
"oss.endPoint":"",
"oss.bucketName":"",
"wechat.appId":"",
"wechat.secret":"",
"blog.url":"http://localhost"}
幾個(gè)配置項(xiàng)我解釋下:
userName和passWord
hexo-manager是有登錄功能,畢竟是部署在外網(wǎng)的,所以需要賬號(hào)密碼hexo.root.dir.path
用來(lái)配置Hexo在服務(wù)器上的相關(guān)路徑,記得最后面的/oss
是用來(lái)配置阿里云的參數(shù)的,目前來(lái)說(shuō)一定要設(shè)置,如果有朋友不需要,可以跟我說(shuō)私信或者在簡(jiǎn)書(shū)評(píng)論,我可以做成可配置的,或者直接自己拿代碼改,后續(xù)我會(huì)把代碼開(kāi)源wechat
是用配置微信公眾號(hào),目前來(lái)說(shuō)沒(méi)用,可以不填,因?yàn)槲野l(fā)現(xiàn)我的訂閱號(hào)是個(gè)人的,無(wú)法認(rèn)證,也就無(wú)法自動(dòng)發(fā)布博文,所以寫(xiě)一半就沒(méi)有繼續(xù)寫(xiě)了blog.url
是用來(lái)從hexo-manager的文檔列表跳轉(zhuǎn)到具體博文頁(yè)面的
部署Hexo-Manager
下載安裝包:hexo-manager.zip
安裝包中有下面幾個(gè)文件:

config.json 為配置文件
hexo-manager-0.0.1-SNAPSHOT.jar 是具體的應(yīng)用程序
run.sh 當(dāng)應(yīng)用程序上傳到服務(wù)器上后,到具體目錄,就可以運(yùn)行此文件啟動(dòng)或者直接運(yùn)行
nohup java -jar -Djava.security.egd=file:/dev/./urandom hexo-manager-0.0.1-SNAPSHOT.jar > access.log 2>&1 &
解釋下啟動(dòng)命令
nohup和最后&
配合使用,讓程序在后臺(tái)運(yùn)行,避免你退出后,程序也退出了,注意需要用exit來(lái)退出服務(wù)器java -jar
啟動(dòng)jar程序-Djava.security.egd=file:/dev/./urandom
我用UUID來(lái)生成登錄憑證,但是有時(shí)候這個(gè)過(guò)程會(huì)很慢,所以配置這個(gè),讓生成過(guò)程快點(diǎn)。> access.log 2>&1
讓程序的命令行輸出都到access.log文件中
使用Hexo-Manager
登錄界面
當(dāng)你沒(méi)有登錄的時(shí)候,訪問(wèn)manager.robinwu.com的時(shí)候,都會(huì)跳轉(zhuǎn)登錄界面

Hexo管理界面
登錄過(guò)后,就會(huì)跳轉(zhuǎn)到Hexo管理頁(yè)面

有幾個(gè)功能:
- git同步,當(dāng)上傳代碼的git倉(cāng)庫(kù),可以通過(guò)這個(gè)按鈕可以讓你服務(wù)器上的的Hexo代碼進(jìn)行g(shù)it同步
- clean,用來(lái)清除你服務(wù)器上的Hexo的生成文件,也就public目錄,具體命令為hexo clean
- 生成靜態(tài)文件,用來(lái)讓你服務(wù)器的上的Hexo生成靜態(tài)文件或者刷新,具體命令為hexo generate
Posts頁(yè)面
該頁(yè)面會(huì)展示你Hexo的_posts目錄里面的文件,并且提供相應(yīng)的連接可以跳轉(zhuǎn)到具體博文頁(yè)面、簡(jiǎn)書(shū)的編輯頁(yè)、微信公眾號(hào)的管理頁(yè)面,后面這兩個(gè)沒(méi)啥用,加進(jìn)去是讓自己方便點(diǎn),記得同步到簡(jiǎn)書(shū)和微信公眾號(hào)

Drafts頁(yè)面
該頁(yè)面會(huì)展示你Hexo的_draft目錄里面的文件

上傳附件頁(yè)面
該頁(yè)面可以用來(lái)上傳服務(wù),上傳文件后,會(huì)返回一個(gè)url顯示在頁(yè)面上


總結(jié)
每次做完以前想做的事情后,就會(huì)覺(jué)得好像就這樣,沒(méi)啥了不起的,也沒(méi)啥成就感,遠(yuǎn)遠(yuǎn)比不上過(guò)程中的充實(shí)。Hexo-Manager滿足我很早以前想要的git同步、hexo生成以及附件功能,但缺少了簡(jiǎn)書(shū)同步和微信公眾號(hào)的同步,有些遺憾。我也不知道有多少人會(huì)有和我同樣的需求,希望對(duì)一些同道中人有些幫助吧。