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

本文檔主要用來記錄本身藉助Hexo搭建博客的一些步驟和命令,方便之後重裝;新人也能夠經過此篇文章快速搭建本身的我的博客。 下文的環境爲:
VPS: CentOS6.9 本地: MacOShtml

搭建博客

一、安裝 NodeJS 和 NPM

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

執行完這個命令以後就能夠安裝NodeJSnode

[root@California_VPS ~]# yum install -y nodejs
複製代碼

這裏安裝的是8.X版本,若是安裝其餘版本將setup_8.x中的8改爲對應的版本就能夠了。
安裝完成以後執行命令檢查安裝結果:python

[root@California_VPS ~]# node -v
v8.8.1
[root@California_VPS ~]# npm -v
5.4.2
複製代碼

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

二、安裝 Nginx

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

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

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

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

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

[root@California_VPS ~]# yum install nginx -y
複製代碼

而後啓動nginxshell

[root@c_vps ~]# nginx
複製代碼

而後打開服務器所在的IP測試nginx是否安裝完成。npm

三、安裝 Hexo

按照官網的文檔執行命令json

[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,服務器會自動更新

四、配置博客

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

git clone git@github.com:gaoshilei/hexo-blog.git  
複製代碼

進入博客目錄,一次執行下面的命令

[root@c_vps hexo-blog]# npm install hexo
[root@c_vps hexo-blog]# npm install
複製代碼

而後配置 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
複製代碼

此時去訪問博客獲得的是一個 404 或者 403 報錯,由於 nginx 是以 nginx 用戶運行的,他沒有博客目錄的讀寫權限,有兩個方法能夠解決:

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

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

[root@California_VPS ~]# vim /etc/nginx/nginx.conf  
複製代碼

user nginx; 改爲 user root; 便可。而後重啓 nginx。

再去訪問發現報錯沒了,可是頁面是一片空白,找了半天緣由,以前用到的主題並無上傳到 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) });
}

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) });
})

try {
  http.createServer(function (req, res) {
    handler(req, res, function (err) {
      res.statusCode = 404
      res.end('no such location')
    })
  }).listen(6666)
}catch(err){
  console.error('Error:', err.message)
}
複製代碼

其中 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
複製代碼

將下面代碼拷貝進去

cd /root/hexo-blog/
git reset --hard
git pull origin master  
hexo generate
複製代碼

而後運行

[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 /root/hexo-blog/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  
複製代碼

若是服務器重啓,咱們還要手動開啓webhooks服務,因此咱們將上面的命令加入開機啓動就能夠了,將命令加入/etc/rc.d/rc.local中,便可實現開機自啓
先將命令寫到腳本/root/webhooks_auto.sh中:

/sbin/runuser -l root -c "/usr/bin/pm2 start /root/hexo-blog/webhooks.js"
複製代碼

而後在/etc/rc.d/rc.local中添加剛纔的腳本:

/root/webhooks_auto.sh 2>&1 > /dev/null &
複製代碼

重啓VPS,而後用命令pm2 show webhooks查看 webhooks 是否已經啓動。

全站 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 補全就好了,而後從新執行一次腳本。你還可能遇到這樣的問題

Creating virtual environment...
[root@California_VPS www]# ./certbot-auto: line 864: virtualenv: command not found
複製代碼

缺乏virtualenv環境,依次執行下面的命令下面進行安裝:

[root@California_VPS www]# curl https://bootstrap.pypa.io/get-pip.py | python -
[root@California_VPS www]# pip install virtualenv
複製代碼

而後執行上面的命令sudo ./certbot-auto --nginx繼續安裝證書,中間須要咱們輸入郵箱,域名等等,按照步驟操做就能夠,最後順利申請了證書,並且 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
複製代碼

大功告成!

相關文章
相關標籤/搜索