部署静态博客到vps

不久前买了一个vps,当时只是想部署ss而已,后来想法就多起来了,购买域名又想着部署一个博客记录一些文章。部署博客时又考虑数据备份问题,不想经常要备份数据,只是想简单地记录技术文章,因此就不考虑wordpress,typecho之类需要用到数据库表的博客系统,后来了解到静态博客的概念及应用,感觉很符合本身的需求。静态博客,主要是由静态页面组成,由git 进行管理,文章支持用markdown语法编写,然后由工具生成html页面,并部署到github pages上面,因此自身就已经实现备份功能,并且写文章时使用markdown进行简单的排版即可,不需要太多花哨的装饰。
一般使用静态博客(如Hexo,jelly,octopress),与github pages结合是最为简单与快捷,发布时不需要再做什么额外的操作,一般这些工具都会提供deploy命令,用于发布到github pages上面,但部署到vps则比较麻烦,如果需要提交到git服务器自动部署到vps,则还需要进行一系列的操作。

一、安装nginx与php

安装nginx比较简单,直接使用apt-get 或yum安装即可,安装php主要是为了git服务器里面的webhook操作,这个操作主要是提交代码到服务器触发的,在这里,需要提供一下页面给服务器调用,用来通过vps需要git pull最新的commit,一般来说,为了安全性,这个页面只能提供https与密码认证才可以调用

1.安装php-fpm

nginx本身并不提供php服务,因此需要使用外部工具,nginx转发php请求给外部工具处理,而这个工具可以是php-fpm

apt-get install php5-fpm 

安装完成后,需要修改/etc/php5/fpm/php.ini文件的cgi.fix_pathinfo值为0

2.修改nginx配置转发php请求

修改http段下面的server配置(默认在/etc/nginx/sites-enabled/default文件),加上以下内容

location ~ \.php$ {
            include fastcgi_params;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
    }

二、部署hexo

由于静态博客的源文件部署在bitbucket上面的私有库,因此为了可以免密码pull文件,还需要配置ssl key免密码pull文件。而如果部署在github的公有库时则不需要使用key pull文件

1.生成ssh key

可以使用以下命令来生成:ssh-keygen -t rsa

2.把id_rsa.pub的文件的文件放在bitbucket的私有库里面的deploy key里面

使用ssh方式git pull代码

bitbucket的库会提供两种方式 pull代码:https与ssh方式,而只有ssh才可以使用key登录,由于使用www-data账号来 pull,因此需要把刚才生成的私钥文件放在/var/www/.ssh目录,另外需要注意设置.ssh目录权限为755,而id_rsa文件需要设置为600。使用www-data账号来clone与pull代码,部署key后需要手动执行一次pull操作,用来确认免密码登录

3.安装hexo,需要生成静态html文件

假定clone的目录为/var/www/hexo-blog,则需要注意设置拥有都为www-data账号

三、在nginx中增加虚拟主机

可以在nginx增加一个blog.gulucn.com用来显示静态博客的内容

server {
    listen 80;
    server_name blog.gulucn.com;
    root /var/www/hexo-blog/public;
    index index.html index.htm;
    location / {
            try_files $uri $uri/ =404;
    }
}

四、增加一个php页面用来更新静态博客的代码

1.在页面根目录下面增加一个pub.php页面

<?php
/**
* bitbucket POST hook http://horsley:anypassword@your_host/autodeploy.php
*/
if (php_sapi_name() != 'cli') 
{
        if (!isset($_SERVER['PHP_AUTH_USER']))
        {
                header('WWW-Authenticate: Basic realm="My Realm"');
                header('HTTP/1.0 401 Unauthorized');
                die('Restricted Area!');
        } 
        else 
        {
                if (($_SERVER['PHP_AUTH_USER'] != 'xxx') ||
                        ($_SERVER['PHP_AUTH_PW'] != 'xxx')
                ) 
                {
                        die('Authentication Failed.');
                }
        }
}

echo "try to update blog\n";
pclose(popen("/var/www/pubblog.sh &", 'r'));
?>

2.pubblog.sh的内容

#!/bin/sh

dir=/var/www/hexo-blog
cd $dir
LOGFILE=hexo.log
echo "begin to publish,`date`" >$LOGFILE
echo "git pull" >>$LOGFILE
git pull 1>>$LOGFILE 2>&1|| exit 1
echo "hexo g " >> $LOGFILE
hexo g 1>>$LOGFILE 2>&1 || exit 1
chown -R www-data $dir/public
echo "all done.`date`" >>$LOGFILE
echo "all done"

五、在bitbucket上面的私有库中增加 POST 的hook操作

内容如下:

https://xxx:[email protected]/pub.php 

当提供代码后,服务器会自动调用这个hook操作,用来通知vps pull 最新的commit.