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, MacPorts :brew 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中。