叒换了博客程序——记录Hexo搭建、配置、部署到云服务器的全过程

最近因为疫情原因,天天在家里也无聊得很,想着没事就试着折腾一下Hexo。

刚开始还不会整Hexo博客,感觉要比Typecho要麻烦的多。经过两天的学习操作,终于建好了Hexo,本着建好了就不浪费的原则,决定以后就用Hexo了。

目前博客程序为Hexo,使用Theme.Shoka主题,部署在华为云服务器上。

现在记录一下这个Hexo博客从搭建、配置和部署到云服务器的整个过程,免得以后自己忘了。

Hexo本地安装

环境准备

  • 下载安装Node.js(Node.js 版本需不低于 10.13,Node自带npm)
  • 下载安装Git

安装Hexo

  • 在自己喜欢的位置新建Hexo文件夹
  • 进入新建的Hexo文件夹,右键点击打开Git Bash Here
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #在Hexo目录下安装Hexo
    npm install -g hexo-cli
    #检测Hexo是否安装成功
    hexo -v
    #初始化Hexo,并新建blog文件夹
    hexo init blog
    #转到刚初始化的blog文件夹下,安装npm依赖项,并生成静态文件
    cd blog
    npm install
    hexo g
    #启动Hexo服务器
    hexo s
  • 访问http://localhost:4000,出现Hexo页面

安装Shoka主题

  • 安装主题

    1
    2
    # cd your-blog
    git clone https://github.com/amehime/hexo-theme-shoka.git ./themes/shoka
  • 安装主题依赖插件

  • 修改Hexo博客配置文件_config.yml

    1
    theme: Shoka
  • 生成静态文件并发布

    1
    2
    hexo g
    hexo s
  • 访问http://localhost:4000 进行预览,没问题的情况下就可以将博客部署到服务器上了。

部署到云服务器

  • 在自己的电脑上生成 Git 密钥

    1
    ssh-keygen -C "your@mail.com"

    一路回车,这时你应该可以在 ~/.ssh/ 目录下看到两个刚刚生成好的密钥文件:
    1. 公钥:id_rsa.pub
    2. 私钥:id_rsa
    我们一会需要把公钥的内容拷贝到服务器上

  • 服务器环境配置
    一般刚重装完系统的云服务器非常纯净,什么也没有,所以我们要一点点安装我们所需的内容
    1. Git
    2. Nginx

  • Git的安装和配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #首先需要安装包的依赖
    yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
    yum install gcc perl-ExtUtils-MakeMaker
    #进入指定目录(这里选择 `usr/local/src`)选择最新版本 [Git](https://mirrors.edge.kernel.org/pub/software/scm/git/) (这里使用 `2.37.3`)下载并解压
    cd /usr/local/src
    wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.37.3.tar.gz
    tar -zxvf git-2.37.3.tar.gz
    #解压出来的 Git 文件都是源文件,我们需要进行编译,进入 Git 解压目录,进行编译和安装, 安装位置(这里选择 `usr/local/git`), 整个过程可能需要一定等待。
    cd git-2.37.3
    make prefix=/usr/local/git all
    make prefix=/usr/local/git install
    #安装好后,我们需要配置环境变量,打开环境变量配置文件:
    vim /etc/profile
    #在文件底部添加 Git 安装目录信息。
    PATH=$PATH:/usr/local/git/bin
    export PATH
    #刷新环境变量,使之生效
    source /etc/profile
    #此时 Git 应该已经安装完成,可以查看 Git 版本号是否和你指定的版本一样:
    git --version
  • Git 新用户与配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #创建 git 用户和密码
    adduser git
    passwd git
    #将 git 用户添加到 sudoers 文件中
    chmod 740 /etc/sudoers
    vim /etc/sudoers
    #在Allow root to run any commands anywhere下面添加 git 用户内容, 保存并退出
    git ALL=(ALL) ALL
    #修改回 sudoers 文件权限
    chmod 400 /etc/sudoers
  • 测试
    通过Git Bash Here将上面本地生成的 id_rsa.pub 公钥内容拷贝到远端服务器, 这个命令会默认在远端服务器 git 用户主目录下生成 authorized_keys 文件 (~/.ssh/authorized_keys), 其中 server_ip 为公网 IP,不是内部 IP,别拷贝错了

    1
    ssh-copy-id -i ~/.ssh/id_rsa.pub git@server_ip

    此时可以通过 ssh 命令(加上 -v 命令,可以输出详细 log)测试连接

    1
    ssh -v git@server_ip

博客网站目录配置

  • 创建博客网站目录位置
    1
    2
    3
    4
    #为博客网站创建根目录(这里选择 `/home/hexo`)
    mkdir /home/hexo
    #赋予 git 用户权限
    chown git:git -R /home/hexo
  • 自动化配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      #指定目录位置(这里选择 git 用户主目录 `/home/git`)创建一个名为 `blog.git` 的 `bare repo`
    cd /home/git
    git init --bare blog.git
    #同样赋予 git 用户相应权限
    chown git:git -R blog.git
    #使用自动化配置,自然是要用到 Git 的钩子函数,这里我们需要 `post-receive`,在博客 hooks 目录下新建该文件:
    vim blog.git/hooks/post-receive
    #然后添加如下内容(注意目录匹配),保存并退出:
    #!/bin/sh
    git --work-tree=/home/hexo --git-dir=/home/git/blog.git checkout -f
    #最后,赋予这个文件可执行权限
    chmod +x /home/git/blog.git/hooks/post-receive
    #接下来,创建个链接,以防后续 deploy 过程出错
    sudo ln -s /usr/local/git/bin/git-receive-pack /usr/bin/git-receive-pack

Nginx 安装和配置

  • 安装

    1
    2
    yum install -y nginx
    systemctl start nginx.service

    这时,在浏览器中输入公网 IP 地址,应该可以看到 Nginx 默认的欢迎界面

  • 配置

    这里配置 Nginx,将所有 Http 请求都重定向为 Https 请求,这就需要我们有 SSL 证书。
    通过 scp 命令将 SSL 证书拷贝到远端服务器, 正常应该将 Nginx 的证书存放在 /etc/nginx/cert 目录下,这里选择存放在 /home/ssl_cert 下(如果目录不存在,请自行创建)

    1
    2
    scp ~/路径/证书.key root@server_ip:/home/ssl_cert
    scp ~/路径/证书.pem root@server_ip:/home/ssl_cert

    然后打开 Nginx 的配置文件进行整体配置

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
server{
listen 80;
server_name dayarch.top; # 个人域名
rewrite ^(.*)$ https://$server_name$1 permanent; # 重定向
}

server {
listen 443;
server_name dayarch.top; # 个人域名
ssl on;
ssl_certificate /路径/证书.pem; # .pem 证书
ssl_certificate_key /路径/证书.key; # .key 证书
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

location / {
root /home/hexo; # 博客网站主目录
index index.php index.html index.htm;
}

error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

通过 nginx -t 命令进行检查,一切正常会输出如下结果:

1
2
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重启 Nginx 服务

1
systemctl restart nginx.service

至此,所有的准备工作都做完了,接下来,我们需要做一些博客配置

本地博客配置修改

我们需要将远端服务器的 Git 仓库信息配置到 Hexo 站点配置文件(_config.yml)中

1
2
3
4
deploy:
- type: git
repo: git@server_ip:/home/git/blog.git
branch: master

陆续执行 hexo 的命令进行部署

1
2
3
hexo clean
hexo g
hexo d

至此,距离成功,我们只差最后一步

域名解析

配置好域名解析,将其指向云服务器的公网地址即可。