快速搭建Hexo博客+webhook自動(dòng)部署+全站HTTPS

本文檔主要用來記錄自己借助Hexo搭建博客的一些步驟和命令,方便以后重裝允悦;新人也可以通過此篇文章快速搭建自己的個(gè)人博客。
下文的環(huán)境為:
VPS: CentOS6.9
本地: MacOS

還沒有購買VPS虑啤,或者不知道怎么購買的請看我之前寫的文章傳送門

搭建博客

1隙弛、安裝 NodeJS 和 NPM

[root@California_VPS ~]# curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -  

執(zhí)行完這個(gè)命令之后就可以安裝NodeJS

[root@California_VPS ~]# yum install -y nodejs

這里安裝的是8.X版本,如果安裝其他版本將setup_8.x中的8改成對應(yīng)的版本就可以了狞山。
安裝完成之后執(zhí)行命令檢查安裝結(jié)果:

[root@California_VPS ~]# node -v
v8.8.1
[root@California_VPS ~]# npm -v
5.4.2

轉(zhuǎn)載請注明出處:來自LeonLei的博客http://www.gaoshilei.com

2全闷、安裝 Nginx

通過 yum方式安裝比較麻煩,還需要安裝epel依賴庫萍启,下面介紹一種最簡單的安裝方法

[root@California_VPS ~]# vim /etc/yum.repos.d/nginx.repo 

先在 yum.repos.d 文件下新建一個(gè)nginx.repo总珠,然后將下面的內(nèi)容拷貝進(jìn)去,:wq保存退出

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1 

執(zhí)行下面的命令直接從配置文件安裝 nginx

[root@California_VPS ~]# yum install nginx -y

然后打開服務(wù)器所在的IP測試nginx是否安裝完成勘纯。

3局服、安裝 Hexo

按照官網(wǎng)的文檔執(zhí)行命令

[root@California_VPS ~]# npm install -g hexo-cli

順利的話一會(huì)就安裝好了,有時(shí)候會(huì)遇到 npm 權(quán)限問題

/usr/bin/hexo -> /usr/lib/node_modules/hexo-cli/bin/hexo
hexo-util@0.6.1 postinstall /usr/lib/node_modules/hexo-cli/node_modules/hexo-util
npm run build:highlight
hexo-util@0.6.1 build:highlight /usr/lib/node_modules/hexo-cli/node_modules/hexo-util
node scripts/build_highlight_alias.js > highlight_alias.json
sh: highlight_alias.json: 權(quán)限不夠
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! hexo-util@0.6.1 build:highlight: node scripts/build_highlight_alias.js > highlight_alias.json
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the hexo-util@0.6.1 build:highlight script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

這個(gè)時(shí)候需要開啟 npm 的 unsafe-perm 模式

[root@California_VPS ~]# npm config set unsafe-perm "true"  

查看是否設(shè)置成功

[root@California_VPS ~]# npm config get unsafe-perm
true

如果為 true 則設(shè)置成功驳遵,再次執(zhí)行 hexo 的安裝命令即可順利安裝成功淫奔。

因?yàn)樾枰阎霸?github 的博客備份重新拷貝新的服務(wù)器上,所以要配置 ssh 公鑰方便 git 操作堤结。

先生成公鑰

[root@California_VPS ~]# ssh-keygen -t rsa -b 4096 -C "xxxxx@xxx.com"  

這一步會(huì)生成ssh公鑰搏讶,也就是 public key佳鳖,生成之后可以通過下面的命令查看

ls -al ~/.ssh

如果有 id_rsa id_rsa.pub 證明生成成功,然后通過下面的命令查看 ssh 公鑰

cat ~/.ssh/id_rsa.pub

再將這個(gè)公鑰拷貝到 github 的賬戶配置中即可媒惕。

注意: 為了方便在本地修改博客、實(shí)時(shí)預(yù)覽来庭、自動(dòng)部署妒蔚,以上(除了Nginx安裝)所有步驟在本地機(jī)器上也需要重新操作一遍,以后在本地直接修改之后推送github月弛,配合下文的webhook肴盏,服務(wù)器會(huì)自動(dòng)更新

4、配置博客

新安裝:參照 Hexo官方教程
重裝:從 github 上把之前的博客 clone 下來帽衙,放到 root 目錄下:

git clone git@github.com:gaoshilei/hexo-blog.git  

然后配置 nginx菜皂,讓 80 端口指向博客靜態(tài)頁面首頁,在 nginx 配置文件目中新建一個(gè)hexo.conf文件

[root@California_VPS ~]# vim /etc/nginx/conf.d/hexo.conf  

寫入相應(yīng)的配置

server {
    listen          80;
    server_name     gaoshilei.com www.gaoshilei.com;
    location / {
        root        /root/hexo-blog/public;
        index       index.html;
    }
}

重啟 nginx 使服務(wù)生效

[root@California_VPS ~]# nginx -s reload

此時(shí)去訪問 IP 得到的是一個(gè) 404 報(bào)錯(cuò)厉萝,因?yàn)?nginx 是以 nginx 用戶運(yùn)行的恍飘,他沒有博客目錄的讀寫權(quán)限,有兩個(gè)方法可以解決:

  1. 給博客目錄賦權(quán)谴垫,讓 nginx 用戶擁有讀寫權(quán)限
  2. 讓 nginx 以 root 用戶運(yùn)行

我采用第二種方式章母,修改 nginx 的配置文件

[root@California_VPS ~]# vim /etc/nginx/nginx.conf  

user nginx; 改成 user root; 即可。然后重啟 nginx翩剪。

再去訪問發(fā)現(xiàn) 404 沒了乳怎,但是頁面是一片空白,找了半天原因前弯,之前用到的主題并沒有上傳到 github 上蚪缀,將主題拷貝到 themes 文件夾下,然后部署 hexo 就可以正常訪問了恕出。

hexo 常用的命令
生成靜態(tài)文件并部署網(wǎng)站:

安裝 hexo 服務(wù)(本地可以通過這個(gè)服務(wù)實(shí)現(xiàn)預(yù)覽询枚,不需要安裝nginx)

# npm install hexo-server --save  

啟動(dòng) hexo 服務(wù),默認(rèn)端口為 4000

# hexo server

用指定端口(port)啟動(dòng)啟動(dòng) hexo 服務(wù)

# hexo server -p port

生成靜態(tài)文件

# hexo g

清除緩存文件 (db.json) 和已生成的靜態(tài)文件 (public)

# hexo clean  

生成站點(diǎn)map

# npm install hexo-generator-sitemap --save
# npm install hexo-generator-baidu-sitemap --save  

配置 webhooks 自動(dòng)更新博客

每次在本地更新了博客剃根,push 到 github 上哩盲,還要去 VPS 再 git pull 一下,確實(shí)很麻煩狈醉,配置好 webhooks 就可以在 github 有 push 操作時(shí)自動(dòng)更新并部署博客廉油。

webhooks 在 github 對應(yīng)倉庫直接設(shè)置就行,重點(diǎn)是服務(wù)器的接收和相應(yīng)的操作苗傅。
有 Python抒线、PHP、NodeJS 多種方式可以接收 webhooks , 由于 hexo 是基于 NodeJS 的渣慕,所以這里用 NodeJS 來接收 github 的 push 事件嘶炭。

安裝依賴庫 github-webhook-handler

[root@California_VPS ~]# npm install -g github-webhook-handler

安裝完成之后配置 webhooks.js

[root@California_VPS hexo-blog]# vim webhooks.js 

然后將下面代碼的拷貝進(jìn)去

var http = require('http')
var createHandler = require('github-webhook-handler')
var handler = createHandler({ path: '/webhooks_push', secret: 'leonlei1226' })
// 上面的 secret 保持和 GitHub 后臺(tái)設(shè)置的一致

function run_cmd(cmd, args, callback) {
  var spawn = require('child_process').spawn;
  var child = spawn(cmd, args);
  var resp = "";

  child.stdout.on('data', function(buffer) { resp += buffer.toString(); });
  child.stdout.on('end', function() { callback (resp) });
}

http.createServer(function (req, res) {
  handler(req, res, function (err) {
    res.statusCode = 404
    res.end('no such location')
  })
}).listen(6666)

handler.on('error', function (err) {
  console.error('Error:', err.message)
})

handler.on('push', function (event) {
  console.log('Received a push event for %s to %s',
    event.payload.repository.name,
    event.payload.ref);
    run_cmd('sh', ['./deploy.sh'], function(text){ console.log(text) });
})

其中 secret 要和 github 倉庫中 webhooks 設(shè)置的一致抱慌,6666 是監(jiān)聽端口可以隨便改,不要沖突就行眨猎,./deploy.sh 是接收到 push 事件時(shí)需要執(zhí)行的shell腳本抑进,與 webhooks.js 都存放在博客目錄下;path: '/webhooks_push 是 github 通知服務(wù)器的地址睡陪,完整的地址是這樣的http://www.gaoshilei.com:6666/webhooks_push

用 https 會(huì)報(bào)錯(cuò)寺渗,github 設(shè)置頁面會(huì) deliver error,所以把地址改成了 http

配置./deploy.sh

[root@California_VPS hexo-blog]# vim deploy.sh

將下面代碼拷貝進(jìn)去

git pull origin master
hexo g

然后運(yùn)行

[root@California_VPS hexo-blog]# node webhooks.js 

就可以實(shí)現(xiàn)本地更新 push 到 github 兰迫,服務(wù)器會(huì)自動(dòng)更新部署博客信殊。
最后要將進(jìn)程加入守護(hù),通過 pm2 來實(shí)現(xiàn)

[root@California_VPS ~]# npm install pm2 --global

然后通過 pm2 啟動(dòng) webhooks.js

[root@California_VPS hexo-blog]# pm2 start webhooks.js 
[PM2] Starting /root/hexo-blog/webhooks.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name │ id │ mode │ pid   │ status │ restart │ uptime │ cpu │ mem       │ user │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ webhooks │ 0  │ fork │ 10010 │ online │ 0       │ 0s     │ 14% │ 24.2 MB   │ root │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app  

全站 HTTPS

使用 Let’s Encrypt 的免費(fèi)證書汁果,不過每三個(gè)月要續(xù)簽一次涡拘,安裝可以通過 Certbot 的傻瓜式操作

[root@California_VPS www]# wget https://dl.eff.org/certbot-auto
[root@California_VPS www]# chmod a+x certbot-auto  

下載腳本,然后賦權(quán)

[root@California_VPS www]# sudo ./certbot-auto --nginx

執(zhí)行腳本据德,獲取證書鳄乏,Certbot 會(huì)自動(dòng)幫我們配置 nginx 的一些配置。走到最后可能遇到這種情況

Cannot find a VirtualHost matching domain www.gaoshilei.com. In order for Certbot to correctly perform the challenge please add a corresponding server_name directive to your nginx configuration: https://nginx.org/en/docs/http/server_names.html

之前在配置 nginx.conf 文件的時(shí)候忘記加域名了晋控,把 server_name 補(bǔ)全就行了汞窗,然后重新執(zhí)行一次腳本,順利申請了證書赡译,而且 Certbot 都幫我配置好了仲吏,nice!
不過這個(gè)證書有效期只有三個(gè)月蝌焚,所以需要續(xù)簽裹唆,可以手動(dòng)續(xù)簽,證書快過期的時(shí)候執(zhí)行

# sudo /root/www/certbot-auto renew

或者將上面的命令加入 crontab 定時(shí)任務(wù)

[root@California_VPS etc]# ps -ef | grep cron
root      1164     1  0 Oct30 ?        00:00:00 crond
root      8507  8222  0 07:31 pts/0    00:00:00 grep cron  
[root@California_VPS etc]# service crond status
crond (pid  1164) is running...

先檢查一下有沒有安裝 crontab只洒,并且查看 crontab 的運(yùn)行狀態(tài)许帐。最后配置

[root@California_VPS etc]# crontab -e

添加下面這條命令到配置文件中

0 0 * * 0 /root/www/certbot-auto renew  

這條命令的意思是每周日的0點(diǎn)0分執(zhí)行/root/www/certbot-auto renew這條命令。執(zhí)行下面這條命令查看定時(shí)任務(wù)列表中是否有剛才添加的任務(wù)

[root@California_VPS etc]# crontab -l 
0 0 * * 0 /root/www/certbot-auto renew

大功告成毕谴!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末成畦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子涝开,更是在濱河造成了極大的恐慌循帐,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舀武,死亡現(xiàn)場離奇詭異拄养,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)银舱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門瘪匿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跛梗,“玉大人,你說我怎么就攤上這事棋弥『顺ィ” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵顽染,是天一觀的道長宪祥。 經(jīng)常有香客問我,道長家乘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任藏澳,我火速辦了婚禮仁锯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翔悠。我一直安慰自己业崖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布蓄愁。 她就那樣靜靜地躺著双炕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撮抓。 梳的紋絲不亂的頭發(fā)上妇斤,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機(jī)與錄音丹拯,去河邊找鬼站超。 笑死,一個(gè)胖子當(dāng)著我的面吹牛乖酬,可吹牛的內(nèi)容都是我干的死相。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼咬像,長吁一口氣:“原來是場噩夢啊……” “哼算撮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起县昂,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤肮柜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后七芭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體素挽,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年狸驳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了预明。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缩赛。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撰糠,靈堂內(nèi)的尸體忽然破棺而出酥馍,到底是詐尸還是另有隱情,我是刑警寧澤阅酪,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布旨袒,位于F島的核電站,受9級特大地震影響术辐,放射性物質(zhì)發(fā)生泄漏砚尽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一辉词、第九天 我趴在偏房一處隱蔽的房頂上張望必孤。 院中可真熱鬧,春花似錦瑞躺、人聲如沸敷搪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滥崩。三九已至献烦,卻和暖如春层皱,著一層夾襖步出監(jiān)牢的瞬間派继,已是汗流浹背恰力。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工可岂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留曼振,地道東北人几迄。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像冰评,于是被迫代替她去往敵國和親映胁。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容