# 前言
之前我的博客是部署在 Gitee 上的,前段时间发现博客无法访问了,登录 Gitee 一看,发现是服务被停用了

真的很无语,之前 51CTO 的博客也是这样,突然就把我的博客停了,也没有消息通知和提醒我是什么内容违规了,体验贼差
一番思索后,决定把 hexo 部署到自己的阿里云服务器上,咱不受这个气
# 前期准备
在把 hexo 部署到自己服务器之前,你需要先购买一台云服务器,另外需要申请一个域名,提交域名备案信息,添加域名 A 记录解析到自己服务器地址
本地准备一台客户端,搭建好 Hexo 和 git 服务,这个大家百度一下 hexo教程 或者去 hexo 官网查看安装教程
由于这些我之前就已经准备好了,就不多废话了
# 服务器准备
我这边的本地客户端和服务器都是 CentOS 8 系统,如果你的客户端和服务器的操作系统和我不一样,请不要无脑复制粘贴,其实不管你的操作系统是 Windows 还是 ubuntu ,方法都是差不多的,只是命令和操作上会有些差别
# 安装服务
登录自己的服务器,先安装 nginx 和 git 服务
dnf install nginx git -y |

# nginx 配置
安装完 nginx 和 git 后,启动 nginx 服务,并添加开机启动
systemctl start nginx && systemctl enable nginx |

# git 配置
先添加一个 git 用户,并设置密码
useradd git #添加 git 用户 | |
passwd git #设置 git 密码 |

用 su 命令切换到 git 用户,在其家目录下建立我们的 git 仓库
如果不切换 git 用户,后续需要自己对目录添加 git 权限,否则客户端会推送失败,比较麻烦
切换 git 账户后,用 cd 命令切换自己的家目录,先创建一个博客目录,然后再创建一个 git仓库目录 ,切换到仓库目录,初始化仓库
cd /home/git | |
mkdir -p hexo/blogs | |
mkdir repos && cd repos | |
git init --bare blogs.git |

初始化完成后,切换到仓库下的 hook 目录,用 vi 创建一个 post-receive 的 hook脚本 ,并添加执行权限
vim post-receive | |
#!/bin/sh | |
git --work-tree=/home/git/hexo/blogs --git-dir=/home/git/repos/blogs.git checkout -f | |
chmod +x post-receive |

# SSH 免密码登录
到这里 git 仓库就算是配置好了,接下来配置 ssh 公钥登录,不然每次客户端推送都需要输入密码,麻烦。。。
需要注意,这个 ssh证书 是在客户端生成,不是在云服务器,千万不要搞错了哦!!!
cd ~ #切换到家目录 | |
mkdir .ssh && cd .ssh # 创建.ssh 目录并切换到该目录 | |
ssh-keygen #生成秘钥 |

命令执行完成后,会生成 id_rsa 和 id_rsa.pub 两个文件,我们需要复制 id_rsa.pub 公钥文件到服务器的 git 家目录
scp id_rsa.pub git@服务器地址:/home/git |

返回我们的服务器,切换到 git 家目录,创建 .ssh 文件夹,把 id_rsa.pub 移动到 .ssh 文件夹,并重命名为 authorized_keys , 然后修改 authorized_keys 和 .ssh 权限

如果前面的配置都没有问题,现在我们应该可以直接在客户端克隆服务器的 blogs 仓库

如果提示需要输入密码,请查看之前 ssh 配置步骤是否有错
# 禁止 git 登录 shell
服务器上的 git 用户是我们用来部署 hexo 博客的,并不需要有 shell 的权限,它只需要有 git-shell 的权限即可
返回服务器,退出 git 账号,切换到 root , 先查看 git-shell 是否在 shells 配置里面,如果不在则添加 git-shell 路径

接下来修改 passwd 文件 git 的登录 shell

# 客户端部署 hexo 到服务器
ok, 现在 git 用户应该不能登录 shell 了,我们回到客户端测试能不能把 hexo 部署我们的服务器
编辑 hexo 的主配置文件 _config.yml ,在 deploy 这里配置自己服务器的仓库地址

保存后,清理 hexo 缓存文件,重新生成静态文件,然后部署到服务器
hexo clean && hexo g && hexo d |

可以看到部署过程中没有任何报错,我们回到服务器查看 blogs 是否已经接收到客户端推送过来的文件

从结果可以看到客户端已经成功把 hexo 的文件推送过来了,接下来我们只需要配置 nginx 的虚拟主机目录就可以浏览我们的博客了
# nginx 目录配置
切换到服务器 nginx 目录下,编辑 nginx.conf 配置文件,这里有两处地方是需要更改的
user nginx; # 这里 nginx 需要改成 root,否则会出现 403 禁止访问 | |
server { | |
39 listen 80 default_server; | |
40 listen [::]:80 default_server; | |
41 server_name _; | |
42 root /home/git/hexo/blogs; # 这里改成 blogs 所在路径 | |
43 | |
44 # Load configuration files for the default server block. | |
45 include /etc/nginx/default.d/*.conf; | |
46 | |
47 location / { | |
48 } |

改完后重启 nginx 服务,访问我们的域名,应该可以正常显示我们的博客页面了

# 配置 SSL
上面的截图可以看到已经能够正常的通过域名访问我们的 hexo 博客了,但是 http 已经被互联网所抛弃了,所以还是申请配置一下 SSL证书 吧
我这里以阿里云为例,打开阿里云 SSL 证书页面,选择购买免费的单域名证书

购买后点击创建证书,填写相关的信息后,点击下一步申请,一般 1~5 分钟签发生效

生效后点击右侧的下载,服务器类型选择 Nginx

下载后解压出来有两个文件,一个 pem 和 key 文件

在服务器 nginx 安装目录下新建一个 cert 文件,并把这两个文件上传到该目录,文件名最好改成域名,便于识别

在 nginx 安装目录下的 conf.d 目录创建一个 server 配置
vi /etc/nginx/conf.d/www.conf | |
#以下属性中,以 ssl 开头的属性表示与证书配置有关。 | |
server { | |
listen 443 ssl; | |
#配置 HTTPS 的默认访问端口为 443。 | |
#如果未在此处配置 HTTPS 的默认访问端口,可能会造成 Nginx 无法启动。 | |
#如果您使用 Nginx 1.15.0 及以上版本,请使用 listen 443 ssl 代替 listen 443 和 ssl on。 | |
server_name yourdomain.com; #需要将 yourdomain.com 替换成证书绑定的域名。 | |
root html; | |
index index.html index.htm; | |
ssl_certificate cert/cert-file-name.pem; #需要将 cert-file-name.pem 替换成已上传的证书文件的名称。 | |
ssl_certificate_key cert/cert-file-name.key; #需要将 cert-file-name.key 替换成已上传的证书密钥文件的名称。 | |
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; #表示使用的 TLS 协议的类型。 | |
ssl_prefer_server_ciphers on; | |
location / { | |
root html; #站点目录。 | |
index index.html index.htm; | |
} | |
} |

保存后重启 nginx 服务,再次访问我们的博客,就成功显示小锁头了 ^ _ ^

# 添加备案信息
最后,我们的域名是有备案的,需要在网站底部添加域名的备案信息,避免不必要的麻烦
由于 hexo 首页信息是在主题下的 \layout\_partials\footer 文件设置,所以需要在客户端上修改
登录客户端,切换到主题下的 _partials目录 ,然后编辑 footer 文件

在底部找个合适的位置插入 <a href="http://beian.miit.gov.cn/">你的备案号</a> 这条语句即可

效果不错,就酱吧,这个教程到此结束 (o゚▽゚) o