Hexo 服务器端布署及 Dropbox 同步

背景

之前 Lucifr 用 Octopress 时就搞过服务器端的部署,不过那时是用 git 的钩子实现的。在移动互联时代,不能从我心爱的 iOS 上发博客实在说不过去,最近也有网友问到这个问题,于是我也动起了 Dropbox 的主意。(又)一番折腾之后,终于可以舒服的在 iOS 上用 Write 之类的 app 进行更新了。这里把过程记录一下,供 hexoer 们参考。

前提

  • 可折腾的 VPS 一台

    之前的用的 Buyvm 最便宜主机是 256MB 内存以至于连 Dropbox 都跑不起来,这次使用了 Digital Ocean 1的 5 美元主机,有 512MB 内存和 20GB 的 SSD,机房选择了 San Francisco,系统方面使用的 CentOS 6.4 x32,自带 python 2.6.6。

  • 能折腾的决心一颗

    当然最好对 *nix/node 什么的都比较熟悉

TL;DR

步骤

  1. 安装 LNMP

    我还是喜欢用 LNMP 一键安装包,自己配置 nginx 什么的我还是觉得有点麻烦,而且平时也会用到一些 php。具体安装方法请参考 lnmp.org 的指引,很详细我就不多介绍了。

  2. 安装 git

    用 git 来拖些源文件比较方便:

    yum -y update
    yum install git-core
    
  3. 安装 node

    就我的经验来看,Hexo 用低版本的 node 貌似兼容更好一些,我这里用的是 v0.8.14,基本上照抄 hexo 官方文档了:

    git clone git://github.com/creationix/nvm.git ~/nvm
    

    修改 .bash_profile,在其中加入:

    . ~/nvm/nvm.sh
    

    然后就可以用 nvm 安装 node 了:

    . ~/.bash_profile
    nvm install v0.8.14
    nvm use v0.8.14
    nvm alias default v0.8.14
    
  4. 安装 hexo

    因为各种原因,我还是一直在用老的 0.5.12 版本

    npm install -g hexo@0.5.12
    
  5. 安装和启动 Dropbox

    首先如果你还没有 Dropbox 的账户的话,可以先注册2一个哈:D。

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

    adduser dropbox
    passwd dropbox
    

    这时再打开一个进程登入 dropbox 这个用户进行安装

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

    启动:

    ~/.dropbox-dist/dropboxd
    

    首次启动需要验证,会自动提供链接,拷贝到浏览器中,登录你的账户后进行验证。成功后 /home/dropbox 下面就会有 Dropbox 这个文件夹并开始同步了,第一次同步的时间可能会长一些。

    这时可以下载官方提供的 cli 用来方便控制和查看 Dropbox 的状态。

    wget https://www.dropbox.com/download?dl=packages/dropbox.py
    chmod +x ./dropbox.py
    ./dropbox.py help
    
  6. 在 Dropbox 中建立 hexo 站点目录

    这时可以回到 root 用户下了。

    cd /home/dropbox/Dropbox
    hexo init hexo
    

    如果之前的 Dropbox 同步正常的话,这时在本地也会看到 hexo 文件夹了,可以把本地中之前的配置文件、theme 和 _posts 什么的都放进去同步回服务器端。

    Plugin 什么的我也是用的较早的版本:

    npm install hexo-generator-feed@0.0.8 hexo-generator-sitemap@0.0.6 hexo-renderer-discount@0.0.1 --save
    

    然后就可以生成一下试试看:

    hexo generate -w
    

    上面这个命令加入了 -w 的参数(–watch),在生成完静态站点之后 hexo 会继续监视文件的变化(按 Ctrl+C 可以停止监视);这时可以在本地尝试修改一下 _post 中之前的文章并保存,服务器端收到 Dropbox 更新的修改后就会自动重新生成了。

    但是 watch 真的很耗资源,我测试的情况是要吃掉 150MB 的内存,再加上 Dropbox 这个内存大户,512MB 内存也能吃的很干净;另一方面这个版本的 watch 也不是很稳定,经常掉链子,所以我采用的是后面提到的 incrond 的方式。

    此外我也对 hexo 动了点小手术,让它不再输出 console 信息,否则用脚本运行时会报错(好吧,我没找到更好的解决办法=_=)。这需要修改下面这个文件,注释掉其中所有 stdout 和 console.log 的语句:

    vi /root/nvm/v0.8.14/lib/node_modules/hexo/lib/cli/generate.js
    
  7. runhexo.bash 脚本

    建立一个 bash 脚本,它会帮我执行 hexo generate 并用 rsync 的方式把 public 目录的内容同步到 nginx 指向的站点目录里。我把它放在了 /root/ 下:

    touch /root/runhexo.bash
    chmod +x /root/runhexo.bash
    

    脚本内容如下:

    #!/usr/bin/env bash
    exec 200<$0
    flock -n 200 || exit 1
    sleep 10
    . ~/nvm/nvm.sh
    cd /home/dropbox/Dropbox/hexo && hexo generate && rsync -a --delete /home/dropbox/Dropbox/hexo/public/ /home/wwwroot/public/
    
  8. 安装 incrond 及同步

    接下来我们需要一个程序来帮助监控 hexo 文件的变化,因为前面所述的原因,我选择了 incrond: inotify cron daemon - Linux man page”)。

    安装:

    yum install incron
    

    启动:

    service incrond start
    chkconfig incrond on
    

    和 crond 和 crontab 一样,incrond 也可以用 incrontab 来配置,不过它默认是用 vim 编辑,需要改一下:

    echo 'editor = vi' >> /etc/incron.conf
    

    这时就可以用 incrontab -e 来编辑配置了,在其中添加:

    /home/dropbox/Dropbox/hexo/source/_posts/ IN_MOVE /root/runhexo.bash
    

    我只是监视了 _posts 这个文件夹,毕竟平时用的最多的就是更新和编辑文章,当然。

  9. 添加 nginx 配置

    用 lnmp 一键安装包提供的 vhost.sh 添加一个新的虚拟主机,按提示添加域名,修改 /usr/local/nginx/conf/vhost/YOURDOMAIN.conf 文件将其中的 root 指向 public 文件夹 /home/wwwroot/public

    我没有把 root 直接指向 Dropbox 中的 hexo/source/public,虽然这样可能更方便,但出于安全的考虑我还是用 rsync 了。如果无所谓的话,你需要给 public 和它的每个上级修改权限,这样才能避免 403 错误。:

    chmod -R 755 /home/dropbox/Dropbox/hexo/public
    chown www:www /home/dropbox/Dropbox/hexo/public
    chmod +x /home/ /home/dropbox/ /home/dropbox/Dropbox/ /home/dropbox/Dropbox/hexo/
    

不足

  • 因为生成静态需要一定时间,用这个方法通过 Dropbox 修改文件如果太过频繁的话,可能会出现更新不及时的情况。
  • 内存占用还是大了些。
  • 以及……XD

  1. 这是一个推广链接
  2. 如果你还没有注册 Dropbox 那么通过这个链接注册,你和我都能得到一些额外的空间

Lucifr

Read more posts by this author.

Beijing, China http://lucifr.com