Theme NexT works best with JavaScript enabled

Hexo 部署到服务器

本文记录了静态博客框架 Hexo 部署到服务器的相关流程

写在前面

0xfaner 白嫖了一台阿里云的云服务器!

这就是故事的开端:受疫情的影响,阿里云推出了学生“在家实践”计划!完成学生认证和实名认证就能免费领取一台2核4G的云服务器ECS(以下简称 ECS)。

但是抢到了服务器的 0xfaner 却又苦恼起来,因为他不知道这台服务器能干啥。但是很快他的苦恼就烟消云散了……

首先, 0xfaner 收到了阿里云的通知,要求博客添加备案信息,否则要罚款(X

但是他发现自己没有进行公安备案,于是嫌麻烦的他索性连ICP备案一起注销了,反正博客托管在Github Page上。

第二天 0xfaner 收到了七牛云的通知,加速域名没有备案,所以图床失效了。

0xfaner 访问了自己的博客,发现图床果然炸了,博客背景都没法显示了,凄凄惨惨。于是 0xfaner 把图片托管在了Github Page上,但是Github Page会一次加载全部图片资源,导致博客访问奇慢无比。

过了两天 0xfaner 实在受不了啦,想到了ECS还没用,所以打算把博客部署在ECS上……

这个时候 0xfaner 已经隐隐约约意识到他又要配环境配一年了……

五天后,终于配完了博客的踩坑带师 0xfaner 决定记录一下这次的配置经历。

简介

Hexo 是基于 Node.js 的一款静态博客框架,可以方便地生成静态网页托管在 GitHub 或服务器上。搭建博客的性价比之选,依赖少易于安装。

首先介绍下 Hexo 的机制:本地环境生成静态文件,将这些文件托管在平台上,这样用户只能访问到你生成的静态文件。所以评论这样的功能Hexo必须依靠第三方插件实现。但是好处是降低平台负担,仅需要托管即可。

本次部署环境:

  • 远程服务器:CentOS 7.7

  • 本地:Windows 10 2004

注意本文中的本地环境已经配置好了部署到Github Page所需的全部要求。

服务器配置

服务器端需要两个环境:

  • Git,用于接收静态文件并部署到指定文件夹。
  • Nginx,用于托管静态文件。

Git

安装

首先检查 Git 是否安装:

1
git --version

如果显示:-bash: git: command not found 则说明没有安装,那么:

1
yum install -y git

配置

为了安全,我们新建一个用户名为 git,专门用于接受静态文件。

1
2
3
useradd git // 添加用户名为git
passwd git // 设置用户git的密码
su git //用户切换到git

Git仓库目录在 /home/git/repos/blog.git ,静态文件部署在 /home/git/projects/blog

1
2
3
4
cd /home/git/
mkdir -p projects/blog // 项目存在的真实目录
mkdir repos && cd repos
git init --bare blog.git // 创建一个裸露的仓库

所以需要配置Git,利用post-receive实现自动化部署:

1
2
cd blog.git/hooks
vi post-receive // 创建 hook 钩子函数

输入内容如下(不了解vi编辑器操作的用户需要自行了解):

1
2
#!/bin/sh
git --work-tree=/home/git/projects/blog --git-dir=/home/git/repos/blog.git checkout -f

然后配置权限:

1
2
3
chmod +x post-receive // 配置可执行权限
exit // 退出到 root 登录
chown -R git:git /home/git/repos/blog.git // 添加权限

然后我们测试一下仓库是否成功配置,在本地:

1
git clone git@server_ip:/home/git/repos/blog.git

如果能够把空仓库拉下来就说明配置完成。

然后我们建立ssh信任关系:

1
2
ssh-copy-id -i C:/Users/yourname/.ssh/id_rsa.pub git@server_ip // 将本机的公钥复制到服务器中
ssh git@server_ip // 测试能否登录

注意使用 Git Bash 进行操作,否则第一条命令 ssh-copy-id 无法运行。注意此操作需要本地已经生成过公钥私钥,使用 ssh-keygen 生成。

如果不需要密码而成功登陆了,那么说明配置完成,运行命令 logout 即可退出登录。

安全起见,禁用git用户的shell登录权限,从而只能用 git clonegit push 等命令

1
2
3
cat /etc/shells // 查看 git-shell 是否在登录方式里面
which git-shell // 查看是否安装
vi /etc/shells // 添加上2步显示出来的路径,通常在 /usr/bin/git-shell

然后修改 /etc/passwd 的权限:

1
vi /etc/passwd

进行如下修改:

1
2
- git:x:1000:1000::/home/git:/bin/bash
+ git:x:1000:1000:,,,:/home/git:/usr/bin/git-shell

Nginx

安装

首先检查 Git 是否安装:

1
nginx -v

如果显示:-bash: nginx: command not found 则说明没有安装,那么:

1
yum install -y nginx

安装完成后,运行:

1
nginx

然后访问自己服务器的IP或域名来看看效果吧。

配置

修改Nginx的配置文件nginx.conf,一般目录为 /etc/nginx/nginx.conf

1
vi /etc/nginx/nginx.conf

如果目录位置不对,那么:

1
whereis nginx

然后根据显示的目录找一下吧(x

将其中的 user 从默认的 nginx 改为 rootgit 以确保不会出现 403 Forbidden

并将根目录修改为静态文件所在的目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
- user nginx;
+ user git;
# ...
http {
# ...
server {
# ...
- root /usr/share/nginx/html/;
+ root /home/git/projects/blog;
# ...
}
# ...
}

修改完成后,运行:

1
nginx -s reload

以重启nginx。

本地配置

默认大家都是已经实现了hexo部署到Github Page了,那么只需要修改站点配置文件_config.yml

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

然后本地运行:

1
hexo s && hexo g && hexo d

就完成了部署啦~

其他技巧

开启HTTPS

首先需要配置一份证书,可以使用 Let’s Encrypt 的免费证书或在阿里云等服务商处代为申请。

网上的教程多推荐使用Certbot进行一键HTTPS配置,但是号称环境杀手的 0xfaner 一直卡在安装Python包的阶段。遂决定手动配置。

首先将证书传输到服务器中,包括 .pem.key 两个文件。

然后将 nginx.conf 文件中的HTTPS部分取消注释,修改根目录,并配置证书路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
user git;
# ...
http {
# ...
server {
# ...
root /home/git/projects/blog;
# ...
}
# ...
server {
# ...
- root /usr/share/nginx/html/;
+ root /home/git/projects/blog;
- ssl_certficate "old_path";
+ ssl_certficate "new_path";
- ssl_certficate_key "old_path";
+ ssl_certficate_key "new_path";
# ...
}
# ...
}

然后运行:

1
nginx -s reload

即可完成配置。

HTTP强制跳转HTTPS

如果希望访问都以HTTPS方式,那么需要配置HTTP强制跳转HTTPS。修改 nginx.conf 文件即可。

从下面两段代码中任选一段:

1
2
3
if ($scheme = http) {
return 301 https://$host$request_uri;
}
1
2
3
if ($server_port = 80) {
return 301 https://$host$request_uri;
}

插入到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
user git;
# ...
http {
# ...
server {
# ...
root /home/git/projects/blog;
# 这里这里这里
# ...
}
# ...
server {
# ...
root /home/git/projects/blog;
ssl_certficate "new_path";
ssl_certficate_key "new_path";
# ...
}
# ...
}

然后运行:

1
nginx -s reload

即可完成配置。