使用Git+Hooks实现Hexo站点自动部署到CentOS服务器上

Hexo可以部署在 GitHub Pages, Heroku 或其他网站上。本文主要讲述如何利用Git和Hooks将本地生成的Hexo站点在自动部署Github Pages上的同时并推送到你的腾讯云或阿里云个人服务器上。

Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。
Hexo.io

工作原理

工作原理

准备工作

  • 确保你的PC已经安装好Hexo主程序的并且生成站点文件夹。安装Hexo,请参阅Hexo文档
  • 一台搭载CenOS 7.4 64bit的ECS服务器实例,其他Linux系统也可以
  • 你至少应该掌握一丢丢的Linux命令

本地环境配置

安装Git,Node.js

Git

  • Windows:下载并安装 git.
  • Mac:使用 Homebrew, MacPortsbrew install git;或下载 安装程序 安装。
  • Linux (Ubuntu, Debian):sudo apt-get install git-core
  • Linux (Fedora, Red Hat, CentOS):sudo yum install git-core

Node.js

  • cURL:

    $ curl https://raw.github.com/creationix/nvm/master/install.sh | sh

  • Wget:

    $ wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh

安装完成后,重启终端并执行下列命令即可安装 Node.js,Windows用户直接下载安装程序安装。

$ nvm install stable

安装Hexo

当Git和Node.js安装完成后打开Git Bash,执行

$ npm install -g hexo-cli

建立Hexo站点文件

1
2
3
$ hexo init <folder>
$ cd <folder>
$ npm install

安装部署插件

文件位置 你的Hexo站点目录
1
2
$ npm install hexo-deployer-git --save
$ npm install hexo-server --save

更多内容请阅读Hexo文档

服务器环境配置

更新服务器的软件包

yum -y update

安装Git

yum install git -y

新建Git用户

useradd -m git

设置gituser的密码

passwd git

配置SSH免密登陆

我们在使用SSH访问服务器时每一次连接都需要验证相应用户的密码,十分繁琐,所以我们通过一组密匙来进行授权访问。
Git Bash中使用ssh-keygen命令在你的电脑上生成一组密匙,这个过程中ssh-keygen会确认密钥的存储位置(Windows下默认是 c:users/username/.ssh/id_rsa),然后它会要求你输入两次密钥口令。如果你不想在使用密钥时输入口令,将其留空。

ssh-keygen

使用ssh-copy-id -i命令将公钥也就是id_rsa.pub添加到服务器上。这个过程中需要验证你所添加的用户的密码,如果你的服务器上存在多个用户,你需要逐一添加。添加完成后可以通过ssh your_user_name@HostIP命令来验证是否添加成功。

1
2
$ ssh-copy-id -i ~/.ssh/id_rsa.pub your_user_name@HostIP  //添加公钥
$ ssh your_user_name@HostIP //验证是否添加成功

禁止git用户Shell登陆权限

出于安全考虑,禁用Git用户的shell权限(必须先验证是否可以免密码登陆,可以后再禁用shell权限,否则无法通过ssh-copy-id -i添加SSH公钥),使用vim /etc/passwd命令修改passwa文件

文件位置 ~/etc/passwd
1
2
-  git:x:1001:1001:,,,:/home/git:/bin/bash
+ git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

SSH免密登陆无效问题排查

检查/etc/ssh/sshd_config文件,确认以下关键选项是否正常

文件位置 ~/etc/ssh/sshd_config
1
2
3
4
5
6
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

#GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes

若还是不能正常工作,则检查用户权限和组权限

1
2
3
chmod 0755 /home/your_user_name   
chmod 700 /home/your_user_name/.ssh
chmod 600 /home/your_user_name/.ssh/authorized_keys

关于SSH的更多问题可查阅这里

初始化Git仓库

新建/var/repo目录,并在该目录下,使用git init --bare创建一个名为blog.git裸仓库,并改变该目录的所有者为git用户。

裸仓库可以直接作为服务器仓库供各开发者push、pull数据,实现数据共享和同步,不保存文件,只保存历史提交的版本信息。

1
2
3
4
mkdir -p /var/repo    //新建var/repo目录
cd /var/repo //进入该目录
git init --bare blog.git //新建一个裸仓库
chown -R git:git blog.git

配置 Git Hooks

使用vim命令在/var/repo/blog.git/hooks目录下创建post-receive文件

vim /var/repo/blog.git/hooks/post-receive

并且写入以下内容

文件位置 ~/var/repo/blog.git/hooks/post-receive
1
2
#!/bin/sh
git --work-tree=/home/www/hexo --git-dir=/var/repo/blog.git checkout -f

提升post-receive的可执行权限

chmod +x /var/repo/blog.git/hooks/post-receive

安装Nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。外网用户访问服务器的 Web 服务由 Nginx 提供,Nginx 需要配置静态资源的路径信息才能通过 url 正确访问到服务器上的静态资源。

在安装之前我们先创建用于存放静态资源的目录/home/www/hexo,并更改其所有者,稍后将其设置为Nginx的默认静态资源目录。

1
2
3
mkdir -p /home/www/hexo      //创建目录
chown -R git:git /home/www/hexo //更改目录所有者
yum install nginx -y //安装Nginx

配置静态服务器访问路径

修改Nginx默认静态资源路径,打开 Nginx 的默认配置文件 /etc/nginx/nginx.conf ,将默认的root /usr/share/nginx/html;修改为: root /home/www/hexo; 如下所示。

文件位置 ~/etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
- root /data/www;
+ root /homr/www/hexo;

include /etc/nginx/default.d/*.conf;

location / {
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

如果你拥有SSL,TSL证书,需要配置HTTPS访问或者添加HTTP强制转换HTTPS访问功能,请参照以下代码进行配置。

文件位置 ~/etc/nginx/nginx.conf HTTPS访问
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
28
29
30
31
32
33
34
35
36
37
server {
listen 80 default_server;
listen [::]:80 default_server;

return 301 https://liujunzhou.cn$request_uri; # 使用301重定向
}

# Settings for a TLS enabled server.

server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name liujunzhou.cn; #你的域名
root /home/www/hexo; #Nginx静态资源存放路径

ssl_certificate "/etc/pki/tls/certs/CA.crt";
ssl_certificate_key "/etc/pki/tls/certs/CA.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

配置_config.yml文件

_config.yml文件中设置deploy选项

1
2
3
4
5
6
# Deployment
deploy:
- type: git # 类型填git
repo: your_user_name@HostIP:/var/repo/blog.git
branch: master
message:

发布站点

在你的Hexo站点根目录下,执行如下命令即可发布你的站点到服务器上。

$hexo clean && hexo d -g

其他问题

Hooks失效

如果部署成功,但是/home/www/hexo目录的资源文件并未更新,请检查post-receive是否有执行权限,以及/home/www/hexo文件所有者是否为git用户,以及是否具有读写权限。

1
2
3
chown -R git:git /var/repo/blog.git  //更改blog.git目录的所有者
chmod +x /var/repo/blog.git/hooks/post-receive //提升post-receive执行权
chown -R git:git /home/www/hexo //或者chmod 755 /home/www/hexo 确保hexo文件夹为空

部署后,部分页面404

部分情况下,在初次部署之后,部分文章或者页面路径大小如果更改了,会导致新部署上去的页面出现404错误。
这是由于GIT没有区分大小写导致的文件路径错误。修改hexo根目录/.deploy_git/.git/config文件

文件位置 hexo根目录/.deploy_git/.git/config
1
2
3
4
5
6
7
8
9
10
11
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = false
symlinks = false
- ignorecase = true
+ ignorecase = false
[branch "master"]
remote = ueser_name@HostIP:/var/repo/blog.git
merge = refs/heads/master

待补充,如果有问题,请给我发邮件

本文同时发布在Easy-Hexo中。

引用列表

Author: Junzhou Liu
Link: https://liujunzhou.top/2018/8/15/deployer/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
AliPay
WechatPay