快速搭建Hexo博客+webhook自動部署+全站HTTPS

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

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

搭建博客

1、安裝 NodeJS 和 NPM

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

執行完這個命令之后就可以安裝NodeJS

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

這里安裝的是8.X版本,如果安裝其他版本將setup_8.x中的8改成對應的版本就可以了。
安裝完成之后執行命令檢查安裝結果:

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

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

2、安裝 Nginx

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

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

先在 yum.repos.d 文件下新建一個nginx.repo,然后將下面的內容拷貝進去,:wq保存退出

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

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

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

然后打開服務器所在的IP測試nginx是否安裝完成。

3、安裝 Hexo

按照官網的文檔執行命令

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

順利的話一會就安裝好了,有時候會遇到 npm 權限問題

/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: 權限不夠
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.

這個時候需要開啟 npm 的 unsafe-perm 模式

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

查看是否設置成功

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

如果為 true 則設置成功,再次執行 hexo 的安裝命令即可順利安裝成功。

因為需要把之前在 github 的博客備份重新拷貝新的服務器上,所以要配置 ssh 公鑰方便 git 操作。

先生成公鑰

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

這一步會生成ssh公鑰,也就是 public key,生成之后可以通過下面的命令查看

ls -al ~/.ssh

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

cat ~/.ssh/id_rsa.pub

再將這個公鑰拷貝到 github 的賬戶配置中即可。

注意: 為了方便在本地修改博客、實時預覽、自動部署,以上(除了Nginx安裝)所有步驟在本地機器上也需要重新操作一遍,以后在本地直接修改之后推送github,配合下文的webhook,服務器會自動更新

4、配置博客

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

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

然后配置 nginx,讓 80 端口指向博客靜態頁面首頁,在 nginx 配置文件目中新建一個hexo.conf文件

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

寫入相應的配置

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

重啟 nginx 使服務生效

[root@California_VPS ~]# nginx -s reload

此時去訪問 IP 得到的是一個 404 報錯,因為 nginx 是以 nginx 用戶運行的,他沒有博客目錄的讀寫權限,有兩個方法可以解決:

  1. 給博客目錄賦權,讓 nginx 用戶擁有讀寫權限
  2. 讓 nginx 以 root 用戶運行

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

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

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

再去訪問發現 404 沒了,但是頁面是一片空白,找了半天原因,之前用到的主題并沒有上傳到 github 上,將主題拷貝到 themes 文件夾下,然后部署 hexo 就可以正常訪問了。

hexo 常用的命令
生成靜態文件并部署網站:

安裝 hexo 服務(本地可以通過這個服務實現預覽,不需要安裝nginx)

# npm install hexo-server --save  

啟動 hexo 服務,默認端口為 4000

# hexo server

用指定端口(port)啟動啟動 hexo 服務

# hexo server -p port

生成靜態文件

# hexo g

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

# hexo clean  

生成站點map

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

配置 webhooks 自動更新博客

每次在本地更新了博客,push 到 github 上,還要去 VPS 再 git pull 一下,確實很麻煩,配置好 webhooks 就可以在 github 有 push 操作時自動更新并部署博客。

webhooks 在 github 對應倉庫直接設置就行,重點是服務器的接收和相應的操作。
有 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 

然后將下面代碼的拷貝進去

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

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 設置的一致,6666 是監聽端口可以隨便改,不要沖突就行,./deploy.sh 是接收到 push 事件時需要執行的shell腳本,與 webhooks.js 都存放在博客目錄下;path: '/webhooks_push 是 github 通知服務器的地址,完整的地址是這樣的http://www.gaoshilei.com:6666/webhooks_push

用 https 會報錯,github 設置頁面會 deliver error,所以把地址改成了 http

配置./deploy.sh

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

將下面代碼拷貝進去

git pull origin master
hexo g

然后運行

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

就可以實現本地更新 push 到 github ,服務器會自動更新部署博客。
最后要將進程加入守護,通過 pm2 來實現

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

然后通過 pm2 啟動 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 的免費證書,不過每三個月要續簽一次,安裝可以通過 Certbot 的傻瓜式操作

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

下載腳本,然后賦權

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

執行腳本,獲取證書,Certbot 會自動幫我們配置 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 文件的時候忘記加域名了,把 server_name 補全就行了,然后重新執行一次腳本,順利申請了證書,而且 Certbot 都幫我配置好了,nice!
不過這個證書有效期只有三個月,所以需要續簽,可以手動續簽,證書快過期的時候執行

# sudo /root/www/certbot-auto renew

或者將上面的命令加入 crontab 定時任務

[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 的運行狀態。最后配置

[root@California_VPS etc]# crontab -e

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

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

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

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

大功告成!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容