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