将Hexo网站托管到VPS

整体方案

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

整体方案如下:在本地机器上生成网站静态文件,利用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默认的欢迎页。如果没看到页面,有可能是开启了防火墙,要把HTTP和HTTPS端口添加到防火墙的允许列表:

1
2
3
4
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
sudo systemctl restart firewalld.service

Nginx的配置文件都放在/etc/nginx目录下,nginx.conf为主配置文件,我们修改server块中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. 从0开始搭建hexo博客
  4. git-shell
  5. Beginner's Guide