本文档主要用来记录自己借助搭建博客的一些步骤和命令,方便以后重装;新人也可以通过此篇文章快速搭建自己的个人博客。 下文的环境为:
VPS: CentOS6.9 本地: MacOS搭建博客
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 -vv8.8.1[root@California_VPS ~]# npm -v5.4.2复制代码
转载请注明出处:
2、安装 Nginx
通过 yum方式安装比较麻烦,还需要安装epel依赖库,下面介绍一种最简单的安装方法
[root@California_VPS ~]# vim /etc/yum.repos.d/nginx.repo 复制代码
先在 yum.repos.d 文件下新建一个nginx.repo
,然后将下面的内容拷贝进去,:wq
保存退出
[nginx]name=nginx repobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/gpgcheck=0enabled=1 复制代码
执行下面的命令直接从配置文件安装 nginx
[root@California_VPS ~]# yum install nginx -y复制代码
然后启动nginx
[root@c_vps ~]# nginx复制代码
然后打开服务器所在的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-permtrue复制代码
如果为 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、配置博客
新安装:参照 重装:从 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 用户运行的,他没有博客目录的读写权限,有两个方法可以解决:
- 给博客目录赋权,让 nginx 用户拥有读写权限
- 让 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 --hardgit 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` 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 cronroot 1164 1 0 Oct30 ? 00:00:00 crondroot 8507 8222 0 07:31 pts/0 00:00:00 grep cron [root@California_VPS etc]# service crond statuscrond (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复制代码
大功告成!