本文檔主要用來記錄自己借助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 用戶運行的,他沒有博客目錄的讀寫權限,有兩個方法可以解決:
- 給博客目錄賦權,讓 nginx 用戶擁有讀寫權限
- 讓 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
大功告成!