部署Hexo到VPS

前言

最早接触 Hexo 的时候,是通过 Github Pages 进行搭建的,后来遂琢磨着如何才能将博客部署到属于自己 VPS 上去。早前曾尝试过一次,磕磕绊绊,最终卡在了 VPS 部署 Git Hook 的步骤上。 经过一段时间的积累,对 Linux 和相关命令行操作有了粗浅的认识,最近再次尝试 VPS 部署 Hexo 博客,操作起来流畅了很多,也很快搭建成功。打算把这个过程记录下来。 下文是基于 Ubuntu 进行搭建的,CentOS 搭建过程基本一致,只需将安装程序的 apt-get 命令换成 yum 命令即可。文中 $ 后均为执行的命令,# 后均为注释,<IP地址> 均为 VPS 的 IP 地址

本地配置

  1. 安装 Git

  2. 安装 Node.js

  3. 运行 Git BashCMD

    $ git config --global user.email "<邮箱>"
    $ git config --global user.name "<用户名>"
    $ ssh-keygen -t rsa -b 4096 -C "<邮箱>"  #默认全部设置最终生成 ssh 密钥 id_rsa.pub
    
  4. %userprofile%/.ssh/ 文件夹下(也就是生成公钥的文件夹)创建 config 文件,输入如下内容:

    # Hexo Blog
    Host <IP地址>
    HostName <IP地址>
    User git
    Port <SSH端口>              #默认为 22
    IdentityFile ~/.ssh/id_rsa
    

p.s. Hexo 本地部署相关教程可参考 Hello Hexo,Git 相关教程可参考 Git 简明教程

服务端配置

准备工作

$ apt-get update           #更新 apt-get 源
$ apt-get upgrade -y       #升级已有软件
$ apt-get install libpcre3 libpcre3-dev openssl libssl-dev g++ build-essential git -y    #安装各种程序和依赖
$ adduser git              #密码自己设置,其他可选空
$ chmod 740 /etc/sudoers   #变更用户权限设置文件权限
$ vi /etc/sudoers          #编辑用户权限设置文件

/etc/sudoers 文件的用户权限部分添加 git 用户权限:

### Allow root to run any commands anywhere
root    ALL=(ALL)     ALL             #原有部分
git     ALL=(ALL)     ALL             #添加部分

保存并退出编辑,并还原用户权限设置文件权限:

$ chmod 440 /etc/sudoers

Nginx

安装

$ useradd www -s /sbin/nologin -M            #添加用户 www 并禁止 SSH 登录
$ mkdir -p /data/software/                   #建立一个放各种软件的目录
$ cd /data/software/                         #进入目录
$ wget http://nginx.org/download/nginx-1.10.1.tar.gz    #下载 Nginx 软件包
$ tar zxvf nginx-1.10.1.tar.gz                          #解压
$ cd nginx-1.10.1                                       #进入目录
$ ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module   #配置编译
$ make                                                  #编译
$ make install                                          #安装

检查 Nginx 是否安装成功:

$ ll /usr/local/nginx/
total 24
drwxr-xr-x  2 root root 4096 Dec  5 14:48 conf/       #显示结果
drwxr-xr-x  2 root root 4096 Dec  5 14:48 html/       #显示结果
drwxr-xr-x  2 root root 4096 Dec  5 14:48 logs/       #显示结果
drwxr-xr-x  2 root root 4096 Dec  5 14:48 sbin/       #显示结果

Nginx 安装到此完成

测试

仅仅安装是远远不够的,还需要测试一下是否配置正常并启动 Nginx:

$ /usr/local/nginx/sbin/nginx -t         #启动前检查配置文件语法
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok    #显示结果
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful  #显示结果

$ /usr/local/nginx/sbin/nginx            #启动 Nginx

$ lsof -i :80                            #查看 nginx 服务对应的端口是否成功启动
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   34317 root    6u  IPv4  39180      0t0  TCP *:http (LISTEN)     #显示结果
nginx   34318  www    6u  IPv4  39180      0t0  TCP *:http (LISTEN)     #显示结果

$ netstat -lntup | grep 80                #查看 80 端口的设置
tcp     0     0 0.0.0.0:80     0.0.0.0:*     LISTEN     34317/nginx     #显示结果

使用 Web 方式访问本机的外网 IP 时显示如下图:

Nginx 初始界面

如上图正常显示,则表示 Nginx 已成功安装并能正常使用

配置

配置文件说明

Nginx 的主配置文件为 /usr/local/nginx/conf/nginx.conf,其配置详细含义如下:

worker_processes  1;                              #worker进程的数量
events {
    worker_connections  1024;                     #每个worker进程支持的最大连接数
}

http {
    include       mime.types;                     #nginx支持的媒体类型库文件
    default_type  application/octet-stream;       #默认的媒体类型
    sendfile        on;                           #开启高效传输模式
    keepalive_timeout  65;                        #连接超时

    server {                                      #第一个server区块,
                                                   表示一个独立的虚拟主机站点
        listen       80;                          #提供服务的端口,默认80
        server_name  localhost;                   #提供服务的域名主机名
        location / {
            root   html;                          #站点的根目录
            index  index.html index.htm;          #默认的首页文件,多个用空格分开
        }
        error_page   500 502 503 504  /50x.html;  #出现对应的http状态码时,使用50x.html回应客户
        location = /50x.html {                    #location区块,访问50x.html
            root   html;                          #指定对应的站点目录
        }
    }
}
规范配置文件

一般来说,为了便于各虚拟主机的管理,我们将所有虚拟主机的自配置文件会统一放入 vhost 目录中,并在 Nginx 的主配置文件中添加配置 include vhost/*.conf; 来使 vhost 目录中的虚拟主机的自配置文件加载进来。公共的配置项写在主配置文件中,各虚拟主机的自配置文件则用于差异化,比如规定虚拟主机配置的网站域名或功能取名等等。

先编辑主配置文件 /usr/local/nginx/conf/nginx.conf

$ echo "" > /usr/local/nginx/conf/nginx.conf      #清空配置文件
$ vi /usr/local/nginx/conf/nginx.conf             #编辑主配置文件

内容如下:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    include vhost/*.conf;
}

如下提供一个 host 为 VPS <IP地址> 的虚拟主机的配置文件 /usr/local/nginx/conf/vhost/<IP>.conf 的规范化模板,仅供参考:

$ mkdir vhost                                     #新建 vhost 目录
$ vi /usr/local/nginx/conf/vhost/<IP地址>.conf    #编辑子配置文件

内容如下:

server {
        listen       80;
        server_name  <IP地址>;
        root /data/web/<IP地址>/;
        index index.html index.htm;
        access_log  logs/access.log main;
        error_page   404  /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        root   html;
        }
}
$ /usr/local/nginx/sbin/nginx -t         #检查配置文件语法,报错说明配置文件语法有误
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok    #显示结果
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful  #显示结果

$ /usr/local/nginx/sbin/nginx -s reload      #重启 Nginx,使配置文件生效
$ mkdir /data/web && cd /data/web            #新建 web 目录用于 Web 访问
$ mkdir <IP地址> && cd <IP地址>               #新建虚拟主机对应的 Web 目录
$ chown git:git -R <IP地址>                  #授权给 git 该目录权限

设置 Hexo 对应的 Git 仓库

$ su git                           #切换到 git 用户
$ cd ~                             #进入用户根目录
$ mkdir .ssh && cd .ssh            #新建并进入 .ssh 目录
$ touch authorized_keys            #新建 authorized_keys 文件用于识别 ssh 访问者身份
$ vi authorized_keys               #复制粘贴 Windows 的 %userprofile%/.ssh/id_rsa.pub 文件内容
$ cd ~                             #进入用户根目录
$ mkdir hexo.git && cd hexo.git    #新建并进入 hexo.git 目录
$ git init --bare                  #初始化仓库

WindowsGit BashCMD 中输入 ssh git@<IP地址>, 显示如下则表示设置成功:

Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '45.76.211.104' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 3.13.0-100-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
New release '16.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

git@vultr:~$                       #这里表示 SSH 成功登录 VPS
$ su git                          #切换到 git 用户
$ cd /home/git/hexo.git/hooks     #进入仓库的钩子目录
$ vi post-receive                 #编辑钩子设置转发,实现仓库内容同步到 Web 目录

编辑内容如下:

#!/bin/bash
GIT_REPO=/home/git/hexo.git
TMP_GIT_CLONE=/tmp/hexo
PUBLIC_WWW=/data/web/<IP地址>
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}

授权 post-receive 文件可执行权限:

$ chmod +x post-receive

Hexo 发布到 VPS

修改 hexo 配置文件:

deploy:
  type: git
  repo: git@<IP地址>:hexo.git
  branch: master

发布时进入 Windows 中 hexo 目录,CMDGit Bash 运行发布命令即可:

$ hexo d
updatedupdated2023-09-272023-09-27