将Hexo博客托管到VPS

整体方案

我有一个用于科学上网的VPS,配置还不错,仅仅跑一个Shadowsocks太浪费了。买了域名之后,便想把博客也托管到VPS上,和Github互为备份,其中一个出问题了,修改一下域名解析即可。

整体方案如下:在本地机器上生成博客静态文件,git提交之后,利用git的post-receive钩子自动部署文件到VPS上配置的网站根目录中,VPS上使用nginx作为HTTP服务器,为访客提供服务。

本文默认本地机器上已经完成了Hexo博客环境的搭建(能够生成博客文件,并部署到Github上),VPS上已安装git和nginx。

部署过程

SSH登录配置

首先在VPS上新建一个名为git的账户专门用来部署博客文件:

1
2
# adduser git
# vim /etc/passwd

1
git:x:502:502:/home/git:/bin/bash

修改为:

1
git:x:502:502:/home/git:/usr/bin/git-shell

上面的git-shell是一个login shell,为ssh用户提供受限的git权限。将本地机器上的公钥(~/.ssh/id_rsa.pub文件的内容)添加到VPS的/home/git/.ssh/authorized_keys文件末尾,添加之后,使用git账户登录VPS无需密码。

Git仓库配置

建立一个裸仓库,目录可以自己选择:

1
2
3
# mkdir -p /var/repo
# cd /var/repo
# git init --bare blog.git

然后配置git hooks,在blog.git/hooks目录下新建一个post-receive文件:

1
2
# cd /var/repo/blog.git/hooks
# vim post-receive

在文件中写入如下内容:

1
2
#!/bin/sh
git --work-tree=/var/www/blog --git-dir=/var/repo/blog.git checkout -f

参数/var/repo/blog.git为git仓库目录,/var/www/blog为部署目录,即最终存放博客文件的目录。

为该文件添加可执行权限,同时修改目录的所有者:

1
2
3
# chmod +x /var/repo/blog.git/hooks/post-receive
# chown -R git:git /var/repo/blog.git/
# chown -R git:git /var/www/blog

本地配置

_config.yml配置文件的deploy字段中添加一个VPS项:

1
2
3
4
5
6
deploy:
type: git
repo:
github: git@github.com:panqiincs/panqiincs.github.io.git
vps: git@ip-of-vps:/var/repo/blog.git
branch: master

部署过程不变:

1
2
3
$ hexo clean
$ hexo g # generate
$ hexo d # deploy

博客文件会同时部署到Github和VPS上。VPS部署成功后,在/var/www/blog目录下能看到博客文件。

Nginx配置

首先确认nginx已启动,在本地浏览器中输入VPS的IP地址,可以看到nginx默认的欢迎页,该网页位于/usr/share/nginx/html目录。Nginx的主配置文件是/etc/nginx/nginx.conf,显示默认欢迎页的配置在/etc/nginx/conf.d/default.conf文件中。我们需修改server_nameroot字段的内容,并添加location字段的配置。修改后的配置文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#
# The hexo blog server
#
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name panqiincs.me, www.panqiincs.me;
root /var/www/blog;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
index index.html index.htm;
root /var/www/blog;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

运行nginx -s reload重新载入配置,在本地浏览器中输入VPS的IP地址,如果能够看到博客页面,说明配置成功。

域名解析

VPS部署和nginx配置完成后,需要修改DNS配置,即可将域名绑定到VPS的IP上。删除原来的域名解析配置,分别新添加一个www和@记录,记录值均为VPS的IP地址。等待一段时间,域名解析成功,即可用域名访问托管在VPS上的博客。

参考

  1. 在VPS上搭建Hexo博客,使用Git部署
  2. 开始新的折腾,Hexo博客Git-VPS部署完整记录
  3. git-shell
  4. Beginner’s Guide