0's Space

使用云服务器搭建Hexo个人博客

字数统计: 5.2k阅读时长: 21 min
2021/03/18 Share

彻底搞懂如何使用Hexo+GitHubPages搭建个人博客】讲解了如何使用Hexo+GitHubPages来搭建一款属于自己的个人博客。使用了一段时间后,发现访问速度偏慢,而且自己也在前段时间腾讯云做活动的时候购置了一台云服务器,所以将我的个人博客迁移到了腾讯云上。其实不一定是腾讯云,希望通过本文,您可以将原来部署到GitHubPages上的博客部署到任何云服务器上。

还是为了彻底搞懂目的,我也是参考了很多文章,大多是按照文章中的指引一行行的命令来配置部署,期间还使用过宝塔面板。后来因为原来的服务器到期了,不得不重新部署一遍。由于没有彻底搞懂,后面又不得找文章【玩转腾讯云】Hexo博客部署腾讯云来一遍遍跟着指引来配置。但是这次在配置之后我总结发现,其实把步骤搞清楚了,明白每个步骤的目的,把Hexo部署到服务器上没有那么复杂,而且第一次配置的很多步骤都是不需要的。

阅读指引

环境

  • CentOS 7.6 64位

配置步骤

  • 服务器配置并安装Git仓库托管

    • 安装git编译所需要的依赖包

    • 安装git

    • 创建git用户

    • 配置rsa公钥

  • GitHubPages作为Web服务器->安装并配置Nginx云服务器的Web服务

    • 云服务其中创建站点目录

    • 安装配置Nginx

      • 云服务器安装Nginx

      • 配置Nginx

      • 重启Nginx服务

    • git仓库配置

      • 建立git仓库并修改权限

      • 同步网站根目录(配置git hook)

      • 修改权限

  • 域名解析到GitHubPages->域名解析到云服务器的IP

    修改域名解析

  • Hexo配置推送到github仓库->Hexo配置推送到云服务器git仓库

    修改Hexo配置

  • 测试

首先我会分步骤讲解所有的环节,文章的最后我会将这些命令步骤进行整合,方便你在理解后可以按照配置指引进行配置。希望通过这套分解和整合动作让你彻底搞懂如何将Hexo部署到云服务器。

前期准备

首先需要一台云服务器,腾讯云、阿里云、京东云不管啥云,啥云便宜用啥云。学生的话各大平台都有优惠,如果你买不到打折的云产品,可以私聊我(不是广告啊,因为我当时也是因为贵没买,个人用户动不动大几千吓人,后来才知道有渠道)

然后就是你已经参照我的上一篇文章[彻底搞懂如何使用Hexo+GitHubPages搭建个人博客]搭建好了一款基于Hexo+GitHubPages的Blog,下面就开始我们的迁移工作。

迁移工作

整体思路

原来使用的GitHubPages来作为博客的Web服务器,现在替换为自己的云服务器,那么只需要在云服务器上实现原来GitHubPages提供的相关功能即可。回忆一下,原来的github来托管blog相关的资源和文件,那么需要服务器具备git的功能;使用GitHubPages来作为Web服务器,那么需要云服务具有Web相关服务;原来的GitHubPages对域名进行了解析,通过域名配置跳转到了GitHubPages的地址,现在前移到了云服务器,云服务器具有自己的IP地址,所以也肯定要修改原来的域名解析,在服务器做域名相关的配置;最后,原来Hexo中配置了Hexo的推送地址为GitHub上的仓库,这里肯定也要修改推送地址

而Hexo相关工作都是在我们本地完成将md文件转换为HTML先关文件的工作,所以并不需要在安装HTML先关工作。所以概括下来,一目了然,需要如下工作,:

  • github的代码托管服务->服务器安装git配置git仓库托管相关服务
  • GitHubPages作为Web服务器->安装并配置Nginx云服务器的Web服务
  • 域名解析到GitHubPages->域名解析到云服务器的IP
  • Hexo配置推送到github仓库->Hexo配置推送到云服务器git仓库

服务器配置并安装Git仓库托管

我们原来使用GitHubPages来上传并管理我们的Hexo相关的文件,现在在云平台上当然需要一个工具来实现类似于代码托管的功能来托管我们的blog文件,这里就需要首先安装Git。如果原来服务器上有git工具,其实可以省略这一步。如果git版本太低,也最好安装一个最新版本。

安装git编译所需要的依赖包

1
2
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install gcc perl-ExtUtils-MakeMaker

这两个命令上来有点懵,都是啥啊,反正我已开始就是键盘一通梭,配置完了回来分解理解。其实就是一堆Git工作需要调用的库,下面就每个依赖包的作用,你可以先开始后面的操作,后面回来慢慢看。

  • curl-devel

    cURL is a tool for getting files from FTP, HTTP, Gopher, Telnet, and
    Dict servers, using any of the supported protocols. The curl-devel
    package includes files needed for developing applications which can
    use cURL’s capabilities internally.

    大致翻译下是:cURL包是一个从FTP/HTTP/Gopher/Telent/Dic服务器获取文件的工具,这个工具使用所有任何支持的协议。curl-devel包集成了所有使用cURL包开发应用时的文件。如果不安装这个依赖,编译git时未安装(lib)curl-devel可能会导致在git clone期间“找不到’https’的远程帮助程序”的问题。

  • expat-devel

    a stream-oriented XML parser library written in C.
    Expat excels with files too large to fit RAM, and where performance and flexibility are crucial.

    一个用C编写的面向流的XML解析器库。Expat擅长处理那些大到无法装入内存的文件,性能和灵活性至关重要。

  • gettext-devel

    Specifically, the GNU gettext utilities are a set of tools that provides a framework to help other GNU packages produce multi-lingual messages. These tools include a set of conventions about how programs should be written to support message catalogs, a directory and file naming organization for the message catalogs themselves, a runtime library supporting the retrieval of translated messages, and a few stand-alone programs to massage in various ways the sets of translatable strings, or already translated strings.

    具体来说,GNU gettext实用程序是一组工具,它提供了一个框架来帮助其他GNU包生成多语言消息。这些工具包括一组约定关于应该如何写程序来支持消息目录,目录和文件的命名组织消息目录本身,一个运行时库支持翻译的检索信息,和一些独立的程序以各种方式按摩可翻译字符串的集合,或者已经翻译后的字符串。

  • openssl-devel

    这个字面意思就是openssl相关的库

  • zlib-devel

    zlib-devel包包含开发使用zlib压缩和解压缩库的程序所需的头文件和库。

  • gcc

    gcc相关的包

  • perl-ExtUtils-MakeMaker

    ExtUtils::MakeMaker 模块,这个模块是用于创建Makefile文件的模块。

    很明显后面两条是因为如果你的云服务器没有安装gcc相关的工具,用来安装C语言编译相关工具的,因为git是用C写的。

安装git

安装好了git编译所需要的依赖,开始来安装Git。

  • 如果安装了一个版本较低的git,首先需要卸载原来的git

    1
    yum remove git
  • 查看git的最新版本,我们登陆git官网来查看最新的版本号,这里可以看到是2.31.0

查看git的最新版本

  • 进入到git安装目录,这里选择/usr/local/src

    1
    cd /usr/local/src   // 选择文件保存位置
  • 下载git

    1
    wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.31.0.tar.gz   // 下载链接

    注意这里将版本号替换为你想下载的版本号

  • 解压

    1
    tar -zxvf git-2.18.4.tar.gz    // 解压

    这里总是记不住tar命令几个参数的含义,正好复习一下

    • -z或–gzip或–ungzip 通过gzip指令处理备份文件。
    • -x或–extract或–get 从备份文件中还原文件
    • -v或–verbose 显示指令执行过程
    • -f<备份文件>或–file=<备份文件> 指定备份文件。
  • 安装并编译

    1
    2
    3
    cd git-2.19.0                   // 进入文件夹
    make prefix=/usr/local/git all // 编译源码
    make prefix=/usr/local/git install // 安装至 /usr/local/git 路径

    首先是编译,第二条命令中all是makefile中指定的一个编译目标,如果make没有加all,那么默认会执行makefile中的第一个编译目标,这是两者的不同之处。但是,在大多数的makefile中,会将all作为第一个编译目标,如果是这样,那么all加不加都是一样的,因此,真实的执行结果依赖于makefile的写法,是否把all作为第一个编译目标。

  • 编辑并配置git的路径到环境配置文件中

    1
    2
    3
    4
    5
    6
    vim /etc/profile
    //在文件末尾添加如下内容
    PATH=$PATH:/usr/local/git/bin // git 的目录
    export PATH
    // 保存后刷新环境变量
    source /etc/profile

创建git用户

在云服务器一般不会使用root用户来进行所有的操作,所以当使用Hexo向云服务器上传文件时,需要为这个操作创建一个git用户并修改权限。

  • 新建git用户

    1
    2
    adduser git // 为服务器添加用户名为git的用户
    passwd git // 密码设置为git 这里git替换为将要设置的密码
  • 将新创建的git用户添加到sudo组

    1
    2
    chmod 740 /etc/sudoers
    vim /etc/sudoers

​ chmod是对文件权限的修改,740每一位代表对拥有者、群组、其他组的权限。

​ 这里就是拥有者的权限是7,当前用户所在群组的权限是4、其他组的权限是0,那么7,4,0又代表什么呢?

​ 一个文件具有读、写、执行也就是以r、w、x,对应权限为4、2、1(二进制),所以读权限是4,写权限是2,执行权限是1。一个用户或组具有的权限为这三种操作的和也就是:

​ - 若要同时设置 rwx (可读写运行) 权限则将该权限位 设置 为 4 + 2 + 1 = 7

​ - 若要同时设置 rw- (可读写不可运行)权限则将该权限位 设置 为 4 + 2 = 6

​ - 若要同时设置 r-x (可读可运行不可写)权限则将该权限位 设置 为 4 +1 = 5

​ 这里chmod 740 /etc/sudoers就是设置对文件拥有这的权限是可读写运行,对用户所在组的权限设置为可写,对其他组的权限设置为不可读不可写不可运行。简单理解就是对当前用户进行提前因为下一步要修改这个文件。

​ /etc/sudoers文件管理sudo组的用户,这里编辑这个文件,将git用户加入到这个用户组。以后就不需要用sudo命令来输密码啦~

​ 在如下内容后面添加:

1
2
3
4
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
#在这里添加
git ALL=(ALL) ALL

​ 第一个 ALL 指示允许从任何终端、机器访问 sudo

​ 第二个 (ALL) 指示 sudo 命令被允许以任何用户身份执行

​ 第三个 ALL 表示所有命令都可以作为 root 执行

  • 修改权限,即把当前用户的权限降为只能读文件,其他用户不能读写修改此文件。

    1
    chmod 400 /etc/sudoers

配置rsa公钥

  • 本地创建rsa秘钥,注意这里是本地操作不是远程服务器

    1
    ssh-keygen -t rsa

    如果你已经创建了rsa的公钥就用以前的,就你之前在github上配置的rsa公钥

    rsa公钥默认存放的地址是~/.ssh

    ssh目录

  • 将id_rsa.pub文件里的内容复制到远程服务器的authorized_keys文件中

    1
    2
    3
    su git
    mkdir ~/.ssh
    vim ~/.ssh/authorized_keys

    注意这里的路径是~即当前用户的用户文件夹,因为只有git这个用户才能这个rsa公钥

  • 修改权限

    1
    2
    3
    cd ~
    chmod 600 .ssh/authorized_keys
    chmod 700 .ssh

    这里请读者思考下,每跳命令后当前文件的权限变为了什么呢?欢迎留言~

  • 本地测试git服务

    至此我们的git服务已经配置成功,我们来测试下git服务是否能成功运行呢?在本地运行:

    1
    ssh -v git@SERVER //@后是你自己的服务器公网IP,如果不出现failed字样,说明成功

GitHubPages作为Web服务器->安装并配置Nginx云服务器的Web服务

云服务其中创建站点目录

1
2
3
su root //使用root用户
mkdir /home/hexo // 创建网站根目录为/home/hexo
chown git:git -R /home/hexo

chown git:git -R /home/hexo 用来设置文件所有者和文件关联组的命令。将/home/hexo目录及其子目录下的所有文件的拥有者设为git,群体的使用者为git组。

​ -R : 处理指定目录以及其子目录下的所有文件

安装配置Nginx

  • 云服务器安装Nginx

    1
    2
    yum install -y nginx    // 安装
    systemctl start nginx.service // 启动服务

    这里yum install -y 在遇到Is this OK[y/d/N]提示时会自动选择y

  • 配置Nginx

    查看nginx.conf配置文件的位置

    1
    nginx -t  // 查看位置,一般为 /etc/nginx/nginx.conf。

    修改配置文件

    1
    2
    vim /etc/nginx/nginx.conf //修改配置文件
    // root后添加/home/hexo

    这里root就是你的web根目录,这里设置为我们博客站点的根目录

  • 重启Nginx服务

    1
    systemctl restart nginx.service

git仓库配置git hook

使用Hexo命令本地推送不能直接推送到网站的根目录,而是git的文件仓库。因为git仓库只是用来对文件就行推送更新管理的和web的根目录的作用不同,所以不能是同一个。首先需要新建一个文件夹作为git仓库,并使用git的git hook功能,将推送到git仓库中的文件同步到web根目录/home/hexo。

  • 建立git仓库并修改权限

    1
    2
    3
    4
    su root
    cd /home/git
    git init --bare blog.git
    chown git:git -R blog.git

    git init –bare 创建一个裸库,在工作目录下,只有一个.git目录。与git init创建一个普通仓库的区别可以参考一下资料【What is a bare git repository?】。

  • 同步网站根目录(配置git hook)

    打开blog.git/hooks/post-receive文件并填入如下内容:

    1
    2
    3
    4
    vim blog.git/hooks/post-receive
    // 填入如下内容
    #!/bin/sh
    git --work-tree=/home/hexo --git-dir=/home/git/blog.git checkout -f

    利用git的hooks中的post-receive来实现代码提交完成之后的动作。将仓库指定一个--work-tree然后进行检出操作checkout --force

  • 修改权限

    1
    chmod +x /home/git/blog.git/hooks/post-receive

    前面的chmod指令都是数字表示权限,这里+x简单来时就是给执行权限

域名解析到GitHubPages->域名解析到云服务器的IP

这里需要两步,首先是配置服务器上的nginx,在其配置文件中添加自己已备案的域名,如何找到这个配置文件参考上一章节

  • 修改Nginx配置文件中的域名信息

    1
    2
    vim /etc/nginx/nginx.conf //修改配置文件
    // 在server_name后添加自己的域名
  • 在自己的DNS解析控制台修改域名解析IP,修改A记录

    修改A记录

之前使用过宝塔面板,有兴趣的可以尝试一下,可视化操作也挺棒的。

Hexo配置推送到github仓库->Hexo配置推送到云服务器git仓库

  • 在本地Hexo目录下修改_config.yml文件中的deploy后的repo

    1
    git@SERVER:/home/git/blog.git   //@后为云服务器公网IP

    blog.git就是你的推送仓库目录

  • 部署测试一下

    1
    hexo g

    Nice! 熟悉的页面出现你的Hexo个人Blog已经成功部署到个人云服务器上了!

配置命令指引

这里汇总下所有的命令,按照下面步骤的指引,就可完成云服务器上个人Blog的部署,方便参考:

  • 安装git编译所需要的依赖包

    1
    2
    yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
    yum install gcc perl-ExtUtils-MakeMaker
  • 安装git,如果安装了一个版本较低的git,首先需要卸载原来的git

    1
    yum remove git
  • 进入到git安装目录,这里选择/usr/local/src

    1
    cd /usr/local/src   // 选择文件保存位置
  • 下载git

    1
    wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.31.0.tar.gz   // 下载链接
  • 解压

    1
    tar -zxvf git-2.18.4.tar.gz    // 解压
  • 安装并编译

    1
    2
    3
    cd git-2.19.0                   // 进入文件夹
    make prefix=/usr/local/git all // 编译源码
    make prefix=/usr/local/git install // 安装至 /usr/local/git 路径
  • 编辑并配置git的路径到环境配置文件中

    1
    2
    3
    4
    5
    6
    vim /etc/profile
    // 在文件末尾添加如下内容
    PATH=$PATH:/usr/local/git/bin // git 的目录
    export PATH
    // 保存后刷新环境变量
    source /etc/profile
  • 新建git用户

    1
    2
    adduser git // 为服务器添加用户名为git的用户
    passwd git // 密码设置为git 这里git替换为将要设置的密码
  • 将新创建的git用户添加到sudo组

    1
    2
    chmod 740 /etc/sudoers
    vim /etc/sudoers
  • 在如下内容后面添加:

    1
    2
    3
    4
    ## Allow root to run any commands anywhere
    root ALL=(ALL) ALL
    --在这里添加----
    git ALL=(ALL) ALL
  • 修改权限

    1
    chmod 400 /etc/sudoers
  • 本地创建rsa秘钥,注意这里是本地操作不是远程服务器

    1
    ssh-keygen -t rsa
  • 将id_rsa.pub文件里的内容复制到远程服务器的authorized_keys文件中

    1
    2
    3
    su git
    mkdir ~/.ssh
    vim ~/.ssh/authorized_keys
  • 修改权限

    1
    2
    3
    cd ~
    chmod 600 .ssh/authorized_keys
    chmod 700 .ssh
  • 本地测试git服务

    1
    ssh -v git@SERVER //@后是你自己的服务器公网IP,如果不出现failed字样,说明成功
  • 云服务其中创建站点目录

    1
    2
    3
    su root //使用root用户
    mkdir /home/hexo // 创建网站根目录为/home/hexo
    chown git:git -R /home/hexo
  • 云服务器安装Nginx

    1
    2
    yum install -y nginx    // 安装
    systemctl start nginx.service // 启动服务
  • 查看nginx.conf配置文件的位置

    1
    nginx -t  // 查看位置,一般为 /etc/nginx/nginx.conf
  • 修改配置文件

    1
    2
    vim /etc/nginx/nginx.conf //修改配置文件
    // root后添加/home/hexo
  • 重启Nginx服务

    1
    systemctl restart nginx.service
  • 建立git仓库并修改权限

    1
    2
    3
    4
    su root
    cd /home/git
    git init --bare blog.git
    chown git:git -R blog.git
  • 打开blog.git/hooks/post-receive文件并填入如下内容

    1
    2
    3
    4
    vim blog.git/hooks/post-receive
    // 填入如下内容
    #!/bin/sh
    git --work-tree=/home/hexo --git-dir=/home/git/blog.git checkout -f
  • 修改权限

    1
    chmod +x /home/git/blog.git/hooks/post-receive
  • 修改Nginx配置文件中的域名信息

    1
    2
    vim /etc/nginx/nginx.conf //修改配置文件
    // 在server_name后添加自己的域名
  • 在自己的DNS解析控制台修改域名解析IP,修改A记录

  • 在本地Hexo目录下修改_config.yml文件中的deploy后的repo

    1
    git@SERVER:/home/git/blog.git   //@后为云服务器公网IP
  • 部署测试一下

    1
    hexo g

常见错误

在最后执行hexo g的时候遇到了如下错误:

1
2
bash: git-receive-pack: 未找到命令
fatal: Could not read from remote repository.

原因:远程服务器上的git安装路径是/usr/local/src/git,不是默认路径,所以
建立链接文件:

1
ln -s /usr/local/src/git/bin/git-receive-pack /usr/bin/git-receive-pack

目前还没有遇到过其他问题,如果您出现了其他问题可以评论交流。

参考资料

CATALOG
  1. 1. 阅读指引
    1. 1.1. 环境
    2. 1.2. 配置步骤
  2. 2. 前期准备
  3. 3. 迁移工作
    1. 3.1. 整体思路
    2. 3.2. 服务器配置并安装Git仓库托管
      1. 3.2.1. 安装git编译所需要的依赖包
      2. 3.2.2. 安装git
      3. 3.2.3. 创建git用户
      4. 3.2.4. 配置rsa公钥
    3. 3.3. GitHubPages作为Web服务器->安装并配置Nginx云服务器的Web服务
      1. 3.3.1. 云服务其中创建站点目录
      2. 3.3.2. 安装配置Nginx
      3. 3.3.3. git仓库配置git hook
    4. 3.4. 域名解析到GitHubPages->域名解析到云服务器的IP
    5. 3.5. Hexo配置推送到github仓库->Hexo配置推送到云服务器git仓库
  4. 4. 配置命令指引
    1. 4.1. 常见错误
  5. 5. 参考资料