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站点文件

$ hexo init <folder>
$ cd <folder>
$ npm install

# 安装部署插件

$ 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命令来验证是否添加成功。

$ 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文件

-  git:x:1001:1001:,,,:/home/git:/bin/bash
+  git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

# SSH免密登陆无效问题排查

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

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
#GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes

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

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数据,实现数据共享和同步,不保存文件,只保存历史提交的版本信息。

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

并且写入以下内容

#!/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的默认静态资源目录。

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; 如下所示。

    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访问功能,请参照以下代码进行配置。

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选项

# 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用户,以及是否具有读写权限。

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文件

[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中。

# 引用列表