部署hexo到VPS

Posted by Surflyan on 2018-01-02

1. 前言

终于再次折腾了下博客。到 google analytics 上看了下这一年来的浏览量,还可以,但是全部来源于google,没有来自百度的记录。查了下,果然百度没有收录任何一篇博客。这是因为 github page 限制了百度爬虫。于是,决定将博客部署到个人VPS上。

既然决定要将 hexo blog 部署到 vps上,那么如何实现自动部署是我们所关注的。可以在 vps 搭个 Git 服务器,建立存放 hexo blog 的远程仓库,然后利用 Git Hooks 实现博客文件自动下载到工作目录,至于 web 服务器可以选择 Nginx 。博主服务器系统为 ubuntu 16.04。

2. Git 服务器搭建

Git 服务器搭建,其实就是在 vps 搭建远程仓库作为私有仓库,与 GitHub 作为远程仓库本质上是一样的。

2.1 安装 Git

$ sudo apt-get install git
$ git --version

2.2 创建git用户

为系统特意创建一个新的用户来管理 git 仓库,新用户通常命名为 git 。创建新用户不是必须的,这么做只是从安全上出发,毕竟直接以 root 用户登陆还是有很大的风险的,对于新用户可以不必给予 sudo 权限。

$ sudo adduser git
$ ls /home

2.3 创建登陆证书

创建登陆证书是为使用 git 用户对仓库管理而无需输入密码。将本地的公钥(在已生成本地密钥的情况下)也就是用户主目录下的.ssh/id_rsa.pub文件写入到新创建的 git 用户主目录下。即/home/git/.ssh/authorized_heys文件里。git 目录下的这些文件需手动创建,注意文件的所有权需属于 git 用户。

$ mkdir /home/git/.ssh
$ touch /home/git/.ssh/authorized_keys
# 写入公钥
$ cat id_rsa.pub>> suthorized_keys

配置公钥后不生效排查步骤:

  1. 查看 git 用户主目录下 .ssh 文件所有权,所有权需属于git用户。若不属于git用户,改变.ssh 所有权chown -R git:git .ssh
  2. 查看 .ssh 文件及 authorized_keys 文件权限。赋予.ssh 文件rwx 权限,authorized_keys rw 权限。
    chomd 700 .ssh
    chomd 600 .ssh/authorized_keys
  3. 查看/etc/ssh/sshd_config,是否开启验证,即如下:
    RSAAuthentication yes
    PubkeyAuthentication yes
  4. 重启sshd服务,service sshd restart

2.4 创建git仓库

创建一个裸仓库作为远程仓库,保存后面要推送的 hexo blog。博主选择在 git 用户主目录下创建仓库。

$ mkdir -p /home/git/repo/blog.git

# 初始化裸仓库
$ git init --bare blog.git

# 更改裸仓库所有权为 git 用户
$ chown -R git:git blog.git

创建远程仓库,也叫裸仓库。裸仓库与本地仓库区别就是裸仓库没有工作区,只是为了存储,而不是为了直接在裸仓库里修改文件。

现在你可以在本地进行测试了。

$ git clone git@server:/home/git/repo/blog.git
# server 为你的 vps ip / 域名

执行后会提示你克隆了一个空仓库,当然了,这个仓库只是刚初始化的,并没有放任何东东。

2.5 禁用 shell 登陆

禁用新创建的 git 用户 shell 登陆。这一步也是为了安全,毕竟创建 git 用户的初衷就是管理 git 仓库,无需做其他事情。所以只保留 git 用户使用 ssh 连接进行对 git 仓库进行push、fetch 等权力,禁止其通过 ssh 登陆进行操作。

编辑/etc/passwd文件,将下面一行:
git:x:0000:0000:,,,:/home/git:/bin/bash
改为:
git:x:0000:0000:,,,:/home/git:/usr/git-shell

3. git hooks

现在已经有了存放 hexo blog 的仓库。就可以考虑将本地的 hexo blog 部署上去了。在这之前,先来了解下 hexo 的部署机制。hexo 生成博客页面是在输入 hexo g后,根据主题设定,生成博客页面以及其他样式文件,并保存在 public 文件夹中。hexo 自身的部署工具是 hexo-deployer-git 插件, 执行 hexo d, 会自动创建 .deploy_git 站点,包含了 public 文件夹里的内容,并且将它推送到配置文件 _config.yml指定文件里指定的仓库地址。

由于远程仓库没有工作目录,因此需要将仓库里的的内容下载到 vps 本地文件夹里。这里可以采用在服务器上创建一个本地 server_local_blog 仓库连接到 blog.git 远程仓库,blog.git 仓库有新的推送,就将新推送 fetch 到 server_local_blog。还可以选择用 git work-tree 将blog.git 内容 checkout 到新的工作区的方式。这里采用后者实现。两者实现方式都需要 git hooks。

这里用到的是服务端的post-receive hook,主要机制就是在 git 仓库接收到推送,处理完成以后,触发 post-receive 中的命令。

3.1 创建服务端blog folder

个人选择在/home/git/下创建blog_public文件夹存放博客文件。

$ mkdir -p /home/git/blog_public

# 修改blog_public 所有权
$ chown -R git:git /home/git/blog_public

3.2 配置git hooks

# 新建post-receive hook
$ cd /home/git/repo/blog.git/hooks
$ touch post-receive

在post-receive 里写入指令:

git --work-tree=/home/git/blog_public --git-dir=/home/git/repo/blog.git checkout -f

基本的工作机制就是当 blog.git 有新的推送时,将推送内容下载到blog_public这个新定义的工作目录中。

4. Nginx

Nginx 是一款面向性能设计的 HTTP 服务器,相较于Apache、lighttpd 具有占有内存少,稳定性高等优势。选择 Nginx 作为 hexo blog 的 web 服务器。

4.1 安装 Nginx

$ sudo apt-get install nginx

# 启动 Nginx
$ sudo /etc/init.d/nginx start

访问服务器,应该可以看到 Nginx 的欢迎页面。

4.2 配置 Nginx

Nginx 的配置文件在/etc/nginx/nginx.conf,设置 Nginx 的用户和根目录。

# 修改用户为 git 用户
user git

http {
    ...
    ...
    include /etc/nginx/conf.d/*.conf
    include /etc/nginx/sites-enabled/*;
    server {
        listen 80 default_server;
        listen [::] 80 default_server;
        server_name www.softmargin.com;   # 你的vps ip/域名
        root   /home/git/blog_public;     # 你博客放置的位置
    }
}

删除 Nginx 默认配置文件/etc/nginx/sites-enabled,后重新启动 Nginx,

$ /etc/init.d/nginx restart

由于每个人 vps 环境不一样,你可能遇到 Nginx 启动不了的问题,通过以下几条指令进行排查:

$ nginx -t -c /etc/nginx/nginx.conf

# 查看端口占用
$ grep -R default_server /etc/nginx

$ systemctl status nginx.service

4.3 Nginx 开机自启动

将 Nginx 设置为开机自启动。将命令 /etc/init.d/nginx start 写到/etc/rc.local文件 exit 之前。

5. 修改本地配置文件

修改本地 hexo 配置文件_config.yml 中的部署仓库为 vps 上创建的 blog.git。

# Deployment
deploy:
  type: git
  repo: git@server:/home/git/repo/blog.git   #server 为你的vps ip / 域名

现在所有工作都完成了。试着将你的 hexo blog 推送到你的服务器上,然后访问之。

Reference

  1. 廖雪峰-搭建Git服务器
  2. 使用 Git Hook 自动部署 Hexo 到个人 VPS

不如将你本地的整个 hexo blog 生成新的 git 仓库,然后在服务器建立新的远程仓库,推送上去作为备份,也能实现你的在别的电脑上写自己的博客的美好愿望。
请多多指教!