用Hexo+Vps搭建博客并用Dropbox同步自动发布

最后更新日期:2014-07-22



前言:本文主要侧重点在于:1.vps安装Dropbox并自启动;2.VPS上架设Nginx;3.Nginx根目录与Dropbox目录自动同步并自动运行Hexo生成文章
本文说明较少或者没有提及的部分:1:Hexo的介绍,安装配置;2.域名绑定;3.VPS申请注册;4.本文针对环境为VPS:Centosx64,其他环境未涉及;建议读者阅读本文之前先了解相关内容

一.VPS配置

什么是VPS之类的基础就不多说了,请自行搜索,如果只想看Hexo的安装配置,请跳到第三部分.

1.1 VPS

使用的是DigitalOcean的VPS,最基础的配置,每月$5,算是比较便宜的一个了.
VPS的配置:
512MB Ram
20GB SSD Disk
San Francisco 1
CentOS 6.4 x64

###1.2.VPS设置###

  • 升级并更新内核:

    1
    yum -y update
  • 安装中文支持(因为一些目录和文章中的中文,命令行下会有???看着不爽):

    1
    yum groupinstall "Chinese Support"

装完中文语言包之后,它不会自己变成中文,得修改文件/etc/sysconfig/i18n,没有的话创建!

内容改成如下:

1
2
3
4
5
6
vi /etc/sysconfig/i18n
LANG="zh_CN.utf8"
SUPPORTED="zh_CN.UTF-8:zh_CN:"
SYSFONT="latarcyrheb-sun16"

然后重新登陆一下,显示的就是中文了.

###1.3 安装 git,用Git来拖东西比较方便###

1
yum install git-core

###1.4 安装nodejs ###
这个是Hexo必须要安装的,下面是按照Node.js官网的方法,对应系统为CentOS 6.4 X64的说明,不同的系统可以查看这个官网安装说明.

  • 首先检查是否安装了epel
1
yum repolist

如果输出没有epel字样,就是未安装epel,进入步骤1;
如果输出中有epel字样,就是已安装epel,进入步骤2;

步骤一 安装epel
未安装epel的,先安装epel

  • 导入epel的KEY

    1
    sudo rpm --import http://download-i2.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
  • 安装epel

32位

1
sudo rpm -Uvh http://download-i2.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

64位

1
sudo rpm -Uvh http://download-i2.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

  • 别忘了安装 yum-priorities
    1
    yum install yum-priorities

安装好了之后可以用

1
yum repolist

再查看一下,成功的话输出中会有epel字样.

步骤二 安装Node.js

1
sudo yum install nodejs npm --enablerepo=epel

也可以分开安装

1
sudo yum install nodejs

1
sudo yum install npm --enablerepo=epel

二. Dropbox安装和自启动

因为 Dropbox 默认是安装在 ~ 的,出于安全考虑,我新建了一个 dbox 用户,把 Dropbox 安装在这个用户的 $HOME 目录下.

###2.1 新建用户###

1
2
adduser dbox
passwd dbox

一些相关命令:
添加用户: adduser test
修改test密码: passwd test
删除用户test: userdel test
删除用户以及用户目录: userdel -r test

###2.2 安装Dropbox###

再打开一个进程登入 dbox 这个用户,用这个用户进行安装.
32位:

1
cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86" | tar xzf -

64位:

1
cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

然后,从新建的 .dropbox-dist 文件夹运行 Dropbox 守护程序.

1
~/.dropbox-dist/dropboxd

首次启动需要验证,会自动提供链接,将这个链接拷贝到浏览器中,(可以是其他机器的浏览器,比如你现在用的电脑,不一定要在VPS上操作).登录你的账户后进行验证。
验证成功后,会在 /home/dbox 下面生成文件夹Dropbox并开始同步了,我们只要选择性同步就好,等验证成功就可以Ctrl-C推出,将其关闭掉.

1
killall dropbox

###2.3 配置Dropbox###

  • 1 下载官方提供的 cli 来控制和管理Dropbox
    1
    wget https://linux.dropbox.com/packages/dropbox.py

更改权限:

1
chmod +x ./dropbox.py

查看帮助:

1
./dropbox.py help

启动Dropbox:

1
./dropbox.py start

加入到自启动:

1
./dropbox.py autostart

关闭局域网广播:

1
./dropbox.py lansync n

设置同步列表,把不需要同步的文件夹加入到排除列表

1
2
3
4
5
./dropbox.py exclude add ~/Dropbox/Apps/
./dropbox.py exclude add ~/Dropbox/back/
./dropbox.py exclude add ~/Dropbox/Mycode/
./dropbox.py exclude add ~/Dropbox/软件/
....按照你的情况来

重启之后,应该可以自动运行Dropbox了,不行的话再用下面的方法

2.4 开机自动运行Dropbox
如果上面的操作成功的话估计不用下面的操作了

以下操作都是切换到root用户.

作为服务运行:
编辑 rc.local

1
vi /etc/rc.d/rc.local

在里面加入:

1
/home/dbox/dropbox.py start

另外有一个从网上下载的脚本:
原文地址:[Ubuntu]Dropbox命令行下安装与维护

参照 8、编写守护进程使其随系统一起启动

可能是由于网页转码的原因,上面那个网页里的文件第60行
原文为:

1
dbpid=<code>pgrep -u $dbuser dropbox</code>

应该改为:

1
dbpid=`pgrep -u $dbuser dropbox`

注意上面的两个单引号,我弄了一晚上,最后才发现,既不是中文的单引号也不是英文的单引号….灵异事件么?
至今未知原因是什么,有知道的麻烦留言说一声.
一般英文的单引号为: ‘ , AscII 码为,60,上面修改后的单引号为: ` ,A scII 码为27.

  • 将文件存为 /etc/init.d/dropbox.

  • 创建 /etc/sysconfig/dropbox 文件,并在文件中设置 DROPBOX_USERS 变量,该变量设置了想要运行dropboxd的用户,多个用户用空格分隔,user1 user2 替换为你的dropbox用户,这里是dbox。

1
cat /etc/sysconfig/dropbox DROPBOX_USERS="user1 user2"
  • 设置文件权限与属性:
1
2
3
chmod 0755 /etc/init.d/dropbox
chmod 0644 /etc/sysconfig/dropbox
ls -l /etc/init.d/dropbox /etc/sysconfig/dropbox
  • 设置 SELinux 许可:

    1
    2
    3
    chcon -u system_u -t initrc_exec_t /etc/init.d/dropbox
    chcon -u system_u -t etc_t /etc/sysconfig/dropbox
    ls -lZ /etc/init.d/dropbox /etc/sysconfig/dropbox
  • 加入到自启动列表

1
chkconfig dropbox on

如果成功可以用chkconfig –list命令看到,如下:

1
chkconfig --list | egrep '3:on|5:on' | less

之后就可以使用 service dropbox 命令了

1
2
3
4
5
6
7
8
9
10
11
#运行服务
service dropbox start
#停止服务
service dropbox stop
#重启服务
service dropbox restart
#查看运行状态
service dropbox status

比如:查看运行状态,成功的话会提示:
dropboxd for USER dbox: running (pid 1080)

dbox就是运行Dropbox的用户名;running,正在运行;pid,dropbox对应的pid.

三. Hexo安装配置

###3.1 安装Hexo ###

  • 在Dropbox的同步文件夹中新建目录hexo并安装hexo
1
2
3
4
cd /home/dbox/Dropbox #dbox替换为你新建的用户
mkdir hexo
cd hexo
npm install -g hexo

网上的方法是先安装hexo程序然后建一个目录init,我试了一下,到后面生成文件的时候会报错,就没有用.
方法是这样的:

1
2
3
4
npm install -g hexo #安装hexo
mkdir hexoblog #建立一个目录
cd hexoblog #进入到该目录
hexo init #初始化

hexo目录里面会有自动生成的几个文件夹,如果同步配置好了的话,本地目录下也会出现这些文件夹:
类似这样:

hexo
.
├── _config.yml
├── package.json
├── public #生成后发布的目录
├── scaffolds
├── scripts
├── source
| ├── _drafts
| └── _posts #文章源文件目录
└── themes #主题目录

在本地_posts文件夹下面随便丢一个md文件,比如test.md
内容随便,比如:

这是测试….

  • hexo命令
1
2
hexo g #生成html文件
hexo s #本地测试,默认为端口4000

如果配置正确,打开浏览器,输入:

http://VPS地址:4000

会看到test.md中的内容.
到此,hexo算是安装成功了,接下来的配置,主题之类的先不说了.

##这一部分写的比较简单,也不是这篇文章的重点,网上关于hexo安装的文章也比较多,可以自行搜索;

参考:
hexo你的博客

四. 同步发布

1.基本的原理就是在VPS上面搭建一个http服务器,比如nginx,设置根目录为/home/wwwroot/
2.然后用一个程序监测Dropbox同步文件夹中hexo安装目录下的几个目录,比如_post/
3.监测到_post中的文件变化之后,自动运行hexo g命令,生成html页面
4.将生成的html页面拷贝到根目录/home/wwwroot/

一般来说,安全点的做法是象上面说的,将http服务器的根目录和Dropbox的同步目录分开再同步,我嫌麻烦,就直接把Dropbox里面的同步目录作为根目录了,如果你要分开,参照解决.

发布流程来说,是这样的:

终端(手机或者PC)更新Dropbox目录内的文件
==>Dropbox 服务器更新
==>VPS上的Dropbox同步
==>监测程序检测到更新,启动对应脚本
==>运行脚本,Hexo生成发布目录
==>同一个脚本,将发布目录同步到Http服务器的目录
==>Http服务器提供服务

###4.1 安装nginx服务器 ###
你可以使用任何你熟悉的Http服务器,如果需要其他支持,比如php,mysql之类的,可以用LNMP一键安装包.
LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RadHat、Debian/Ubuntu VPS(VDS)或独立主机安装LNMP(Nginx、MySQL、PHP、phpMyAdmin)生产环境的Shell程序。同时提供一些实用的辅助脚本如:可以帮助完成Nginx、MySQL/MariaDB、PHP的升级、常用缓存组件的安装、重置MySQL root密码、502自动重启、日志切割等许多实用脚本。

我只是要一个纯粹的静态Http服务器,我就只安装Nginx就够了

1
yum install nginx
  • Nginx的配置

看你安装的路径,估计各个操作系统不一样,默认路径也不一样,我用root账户安装的,默认路径为:/etc/nginx/
然后默认配置文件为:/etc/nginx/nginx.conf

Ngnix的配置主要就是更改配置文件,详细的可以自行搜索.
参考:
Nginx配置文件详细说明

  • 主要的配置(省略了很多,对照参考吧):
undefined

配置好之后,可以用命令检查Nginx的配置是否有问题.

1
2
3
4
nginx #启动Nginx
nginx -t #测试配置文件,如果出错的话会报错
kill -HUP `cat /usr/local/nginx/logs/nginx.pid` #重启nignx
  • Nginx加入自启动列表
1
chkconfig nginx on

4.2 使用incrond监测文件变化

  • 安装 incrond
1
yum install incron
  • 加入开机自启动
1
2
service incrond start
chkconfig incrond on
  • incrond 监测文件夹配置

incrond 和 crond 以及 crontab 一样,也可以用 incrontab 来配置,不过它默认是用 vim 编辑,需要改一下(因为VPS没有装GUI界面,VIM默认是有GUI的):

1
echo 'editor = vi' >> /etc/incron.conf #修改incrond默认编辑器为vi

这时就可以用 incrontab -e 来编辑配置了,命令输入

1
incrontab -e

会自动用VI打开一个文件,在其中添加:

1
/home/dbox/hexo/source/_posts/ IN_MOVE /root/runhexo.bash

说明:
/home/dbox/hexo/source/_posts/ 安装的hexo中的文章源代码的目录
IN_MOVE 监测的动作
/root/runhexo.bash 监测到动作之后执行的程序,即hexo自动生成html

监测的动作可以用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
IN_ACCESS,即文件被访问
IN_MODIFY,文件被 write
IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
IN_CLOSE_WRITE,可写文件被 close
IN_CLOSE_NOWRITE,不可写文件被 close
IN_OPEN,文件被 open
IN_MOVED_FROM,文件被移走,如 mv
IN_MOVED_TO,文件被移来,如 mv、cp
IN_CREATE,创建新文件
IN_DELETE,文件被删除,如 rm
IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
IN_UNMOUNT,宿主文件系统被 umount
IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)
注:上面所说的文件也包括目录。

我只是监视了 _posts 这个文件夹,只监测了文件移入移出的动作,平时用的最多的就是更新和编辑文章,你也可以按照你的需求来.

比如:

1
2
/home/Dropbox/hexo/source/_posts/ IN_MOVE,IN_MODIFY,IN_CREATE,IN_DELETE /root/runhexo.bash
/home/Dropbox/hexo/theme/ IN_MOVE,IN_MODIFY,IN_CREATE,IN_DELETE /root/runhexo.bash

  • runhexo脚本
    脚本执行 hexo generate 命令,并用 rsync 的方式把 hexo目录下public 目录的内容同步到 nginx 指向的站点根目录。
    我将这个脚本放在/root/下,如果不一样,记得修改上一步中对应的路径.
1
2
3
4
5
#!/usr/bin/env bash
exec 200<$0
flock -n 200 || exit 1
sleep 10
cd /home/dbox/Dropbox/hexo && hexo generate && rsync -a --delete /home/dbox/Dropbox/hexo/public/ /home/wwwroot/public/

因为我直接把网站根目录指向了Dropbox的文件夹,就不用rsync同步目录了,修改如下:

1
2
3
4
5
#!/usr/bin/env bash
exec 200<$0
flock -n 200 || exit 1
sleep 10
cd /home/dbox/Dropbox/hexo && hexo generate


2014.07.22 更新
使用以上脚本之后发现有个bug:只有新增加文章在_post目录下的时候,文章正常上线;从目录中删除文章的时候,已删除的文章仍然在网上,不会自动下线.

解决方法:
修改runhexo.bash文件
方法1. 将

1
cd /home/dbox/Dropbox/hexo && hexo generate

修改为:

1
cd /home/dbox/Dropbox/hexo && hexo clean && hexo generate

原理:
在生成之前,先将hexo的发布目录和缓存清除,重新生成public目录

缺点:重新生成整个public目录,可能占用更多的资源.

方法2. 将

1
cd /home/dbox/Dropbox/hexo && hexo generate

修改为:

1
/home/dbox/Dropbox/hexo && rm db.json && hexo generate

原理:删除db.json数据库文件,public文件部分重建.

感谢网友QiYuan Qiu 提供


直接用 Dropbox文件夹,必须修改权限,否则会出现 403错误
chmod -R 755 /home/dbox/Dropbox/hexo/public
chown www:www /home/dbox/dbox/hexo/public
chmod +x /home/ /home/dbox/ /home/dbox/Dropbox/ /home/dbox/Dropbox/hexo/

###4.3 然后就是测试,Debug了 ###

  • 按照流程来,应该差不多了,不过要有一定的基础,安装配置Hexo建议先在主机上测试一下,网上的教程也很多.
  • 剩下的….我也不知道了,查找问题Debug,慢慢来吧….

五.参考

感谢Hexo,提供了这么好的程序.
Hexo官网

感谢Node.js.
Node.js官网

感谢以下文章和原作者
Hexo 服务器端布署及 Dropbox 同步

Dropbox命令行下安装与维护

hexo你的博客

linux下使用inotify实时监控文件变更,做完整性检查

rc.local自启动学习

incron:linux下基于文件的事件触发

linux 监视文件系统inotify 测试

Nginx配置文件详细说明


  • 艾玛..终于填完这个坑了…先这样吧..