自建服务器搭建Hexo博客

前言

之前写过一篇搭建Hexo博客的总结(基于Hexo+Node.js+github/coding搭建个人博客总结),使用的服务器是githubpages或者CodingPages。但是使用这种方案有一些缺点,国内使用githubPages,访问速度太慢,使用CodingPages会插入一个跳转的广告页。那我们为什么不自己搭建一个服务器,将代码托管在自己的服务器上呢?这一篇博客总结一下自建服务器来搭建Hexo博客,下边介绍的操作都是服务器上的操作。

1. 准备工作

1.在客户端安装好Hexo,测试成功,确保可以在本地发布博客,参考博主的博客基于Hexo+Node.js+github/coding搭建个人博客总结
2.服务器环境:博主购买的是京东云主机(当时活动价:99元半年)

  • 服务器的系统: ubuntu 16.04
  • 服务器需要安装的软件:Nginx服务器 、Node.js 、 Git

2. 服务器环境的搭建

2.1 安装 Node.js

安装Node.js 可以参考博客Node.js部署到阿里云服务器,也可参考博主的博客基于Hexo+Node.js+github/coding搭建个人博客总结

2.2 安装 Nginx

因为我们使用nginx做web服务器,所以需要先安装nginx服务器,可以参考博客LNMP一键安装包进行安装,博主使用的是朋友打包好的Docker镜像(包含nginx和git),两种方式作用是一样的。

之前使用LNMP一键安装包安装过Nginx服务器,这里尝试使用docker镜像,博主使用的docker镜像安装是朋友帮忙安装的,以后有时间了要学习学习docker。使用docker镜像可以很方便在不同的服务器之间进行迁移,例如不想用京东云,使用阿里云或者腾讯云,此时只需要在新的服务器上安装自己打包好的docker镜像,该镜像中所有打包好的软件就安装好了,包括之前的所有配置都不用重新进行配置,不用像之前那样一个一个软件重新安装进行配置。

首先查看容器的运行状态

1
docker ps

下图可以看出docker中并没有镜像在运行

启动镜像名为php7的一个docker镜像

1
docker start php7

再次执行docker ps,如下图所示,php7镜像已经成功运行,

进入docker容器

朋友的php7(镜像的名称)docker镜像中打包了一个ubuntu系统,该系统中安装了Git和nginx。之前的操作是在服务器的系统中,接着我们进入docker容器,也就是进入docker容器中的 ubuntu系统中。

执行下面命令,进入docker容器

1
docker exec -it php7 /bin/bash

注意看下图红色部分,可以看到执行完上面的命令,环境已经发生了变化

启动容器中的nginx服务器

1
/etc/init.d/nginx start

启动成功后,如图所示:

相关命令

进入docker环境

1
docker exec -it php7 /bin/bash

退出docker环境,进入服务器的ubutu系统

1
2
ctrl + p
ctrl + q

修改完nginx服务器配置文件后,重启nginx服务器(要在docker环境中执行)

1
/etc/init.d/nginx restart

2.3 相关配置信息

安装好docker镜像后在本地有以下几个目录:
docker容器中nginx映射到宿主机(京东云主机)目录:/root/docker/nginx(该目录是在京东云主机的系统环境中,不是在docker中)
docker中的nginx服务器默认部署目录映射到本地目录:/root/docker/www/html/think
nginx配置文件的目录/root/docker/nginx/conf.d/think.conf

朋友的镜像中nginx服务器默认的配置:

容器中的目录/var/www/html映射到本地的目录/docker/www/html
默认的部署目录/var/www/html/think映射到本地目录路径为/root/docker/www/html/think,将服务器默认发布目录修改为/root/docker/www/html/hexo

首先在html文件夹中创建一个文件夹hexo

然后,修改nginx配置文件,修改后的配置如下图

以后发布博客后,默认的发布目录就是/root/docker/www/html/hexo

2.4 配置Git

通过上边的操作,就将Nginx服务器配置好了。自己主要是使用了docker镜像,因此看起来比较复杂。因为自己对docker不是很了解,所以看起来比较混乱,如果对docker不熟练,建议还是通过Lnmp一键安装包进行安装。

我们在客户端将博客写好后,需要push到服务器上,所以需要在远程的服务器上安装Git仓库。因此需要在服务器上配置Git。

原理

首先在服务器上创建一个Git仓库,用来将客户端的渲染好的博客文件推送到该仓库中,然后使用git hooks(钩子),连接到网站的根目录/root/docker/www/html/hexo。这样,我们每次访问网站的目录时,会链接到该git仓库中,博客文件实际上还是在git仓库中。

关于git仓库的配置可以参考在服务器上搭建hexo博客

创建git仓库,配置git hooks

博主首先创建了一个新账户git,然后在账户git中创建了一个仓库用来存放博客文件,目录/var/repo/blog.git

然后按照博客中在服务器上搭建hexo博客配置好钩子。

post-receive配置最终如下:/root/docker/www/html/hexo是网站的根目录,/var/repo/blog.git是git仓库的目录

1
2
#!/bin/sh
git --work-tree=/root/docker/www/html/hexo --git-dir=/var/repo/blog.git checkout -f

客户端hexo站点配置文件_config.yml中关于推送部分配置如下:

1
2
3
4
5
6
# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
type: git
repo: git@shaoyance.com:/var/repo/blog.git
branch: master

巨坑:
按照上边的配置,按理说应该可以访问博客了,但是实际上网站却无法访问。什么原因呢,因为自己创建blog.git仓库是在git用户下,但是docker中nginx的映射目录为本地 /root/docker/nginx,也就是说网站的根目录实在root用户的主文件夹中。这样自己在本地推送博客的时候如果使用git用户,钩子是无法将blog.git中的内容映射到部署目录/root/docker/www/html/hexo中的,解决方案:客户端推送的时候将git用户修改为root用户,这样就可以成功访问博客。

将git用户,修改为root用户即可,如下所示,将_config.yml文件中的git改为root即可

1
2
3
4
5
6
# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
type: git
repo: root@shaoyance.com:/var/repo/blog.git
branch: master

3. 总结

至此,服务器就完全搭建好了。总结以下主要分为以下几步(都是在服务器上操作的):
1.购买云主机
2.安装Node.js
3.安装nginx服务器(因为自己使用的是docker镜像,所以略显复杂,因为自己不太了解docker,所以记录的比较粗糙)
4.安装Git,并配置git hooks(一定要明白git hooks的作用,配置钩子时一定注意权限问题造成网站无法访问的情况)

参考博客
在服务器上搭建hexo博客