本文檔主要用來記錄自己借助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è)方法可以解決:
- 給博客目錄賦權(quán)谴垫,讓 nginx 用戶擁有讀寫權(quán)限
- 讓 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
大功告成毕谴!