迁移 Hexo 到腾讯云服务器 CVM

前言

前两天 Github 不知道抽什么风,加载速度跟蜗牛爬行一般,同样的,部署到 GitPages 的 Hexo 博客也是慢的出奇,虽然我的博客到现在也没什么人看,但是我自己看啊,我自己就忍受不了这龟速,对于程序员来说,等待简直就是浪费青春啊。因此,有了想把博客迁移到访问速度快的地方。

一开始没想到要部署到云服务器,我自己虽然搭着腾讯的学生优惠的车买了超级便宜的云服务器,但也就是放几个静态网页暗爽一下。所以刚开始是学着别人在 GitCafe 建立一个镜像,也就是现在的 coding.net ,这里还是得吐槽下 coding.net 的网站风格,各种不习惯啊。关于 coding.net 我就不多说了,因为在这个过程中我偶然看到有人说自己是 hexo + GitHook 自动部署到腾讯云服务器的,一想,我不是也有服务器么,然后看到 GitHook 好像很高端的样子,于是搜索了相关东西。

关于 GitHook 我也不做过多介绍,在我看来这是一种类似于数据库触发器的一种机制,根据某种事件的发生来执行预定的脚本。实现网站的自动部署的原理也就是先在服务器建立一个远程仓库,然后在服务器的网站目录再克隆一下这个仓库,作为最终部署的目录,一般是 Tomcat 的 webapps 目录。远程仓库被预定的动作,比如本次就是收到提交代码,来使服务器本地仓库进行更新。说白了就是旁边的远程仓库有人提交代码哦,那我本地仓库也都得同步一下嘛,那就执行下 git pull origin master 不就行了嘛。就是这样咯。

大致明白了实现的原理,就准备开工了。但是我的服务器之前安装的 windows 系统,一开始就打算在 windows 系统里开搞,但是不得不吐槽腾讯还是很小气,就 1G 的 RAM 开的东西稍微一多就卡的不行,因为实现自动部署需要安装 SSH 服务,在尝试安装 Cygwin 之后经历各种苦难,终于还是放弃 windows 了。索性立刻将服务器系统换成了 Ubuntu Server 14.04 LTS。

准备 CVM

开始之前需要为 CVM 安装远程桌面,这里我不再多说,具体配置和过程参考 https://yq.aliyun.com/articles/43232

接下来就是为 CVM 安装 SSH 服务,实现免密码登录 CVM ,这样上传文件也比较方便。
在 CVM 上执行:

1
sudo apt-get install ssh

然后查看当前用户目录下隐藏的 .ssh 文件夹,如果不存在就自己创建,要确保 .ssh 文件夹属于当前用户,而不是 root 。

安装了 SSH 之后,就可以通过 SSH 输入密码来登录 CVM ,使用 scp 命令将本地 rsa 公钥上传到 CVM :

1
scp /home/alpha/.ssh/id_rsa.pub ubuntu@XXXX.XXXX.XXXX.XXXX:/home/ubuntu/.ssh

然后在 CVM 里执行

1
cp id_rsa.pub authorized_keys

如果不使用 scp 命令,也可以在 CVM 上安装 vim ,通过 vim 在 CVM 的 .ssh 目录中建立一个 authorized_keys 文件并打开,然后手工将本地的 rsa 公钥内容复制到 这个文件里面。

authorized_key 文件建立完成后要记得修改这个文件的权限:

1
chmod 600 authorized_keys

到这里就可以实现免密码登录 CVM 了,就不用再去面对难看又难用的 xfce4 了,之后的步骤也会轻松很多。

1
ssh ubuntu@XXXX.XXXX.XXXX.XXXX

安装 JDK 和 Tomcat7

本来我在我本地的 Ubuntu 安装的时候是很简单的,执行一句代码就行。

1
sudo apt install oracle-java8-installer

但是在 CVM 上,其下载速度简直慢到没朋友,而且还出了一系列的错误,耽误了很长功夫。

之后我在本地 Ubuntu 上下载 JDK 也是很慢,无法忍受就强行退出了。通过 wget 命令也只能返回一个错误的 html 网页,而用 uget 也下载不了,严重怀疑 oracle 官网宕机了。没办法,我切到 windows 系统使用迅雷大概几十秒就下载好了(不得不慨叹还是迅雷好用)。

在使用 scp 将 jdk 上传到 CVM 之后,终于是安装好了,不过后来因为上面的过程留下了一个问题,就是在之后使用 sudo apt-get install 或者其他的 apt 命令都会导致一个错误:系统会自动连接之前的安装 jdk 的任务,然后又无法下载,就这样陷入死循环。。。

解决办法:(如果出现问题的是 java7 ,就把下面的 java8 换成 java7)

1
2
3
sudo rm /var/lib/dpkg/info/oracle-java8-installer* 
sudo apt-get purge oracle-java8-installer*
sudo rm /etc/apt/sources.list.d/*java*

然后就可以重新安装 JDK 或者其他软件了。通过本地安装 JDK 的配置过程就不在详述了,可以参考 http://www.linuxidc.com/Linux/2016-09/135403.htm

安装 Tomcat 也是一样,通过 scp 上传到 CVM ,解压就可以了,这里我使用的是 Tomcat7。另外记得配置 tomcat 开机自启动,否则哪天随手一重启,你可不一定记得再开启 tomcat 了。关于 tomcat 自启动可以参考 http://blog.csdn.net/my2010sam/article/details/43987743

实现自动部署 Hexo 到 Tomcat

在进行这一步之前,确保你的 CVM 安装了 Git,本地已经安装好 Hexo。

由于之前已经可以通过 SSH 免密码登录 CVM 了(如果没有最好先实现免密码登录 CVM,否则提交代码需要输入密码),因此直接在 CVM 的用户目录下创建 Git 仓库:

1
2
3
ubuntu@VM-240-186-ubuntu:~$ mkdir blog.git
ubuntu@VM-240-186-ubuntu:~$ cd blog.git/
ubuntu@VM-240-186-ubuntu:~/blog.git$ git init --bare

这里的仓库就是 Hexo 配置文件里的 Deploy 仓库,在配置文件中修改如下(记得将 IP 地址换成自己 CVM 的 IP):

1
2
3
4
5
6
deploy:
type: git
repo:
github: git@github.com:AlphaGao1993/AlphaGao1993.github.io.git
qcloud: ubuntu@xxxx.xxxx.xxxx.xxxx:/home/ubuntu/blog.git
branch: master

此时就已经可以向 CVM 推送 Hexo 了,但还没有部署到 Tomcat 目录。

那么继续呗,切换到 Tomcat 的 webapps 目录,然后克隆前面创建的远程仓库:

1
2
ubuntu@VM-240-186-ubuntu:~$ cd /home/ubuntu/tomcat7/webapps/
ubuntu@VM-240-186-ubuntu:~/tomcat7/webapps$ git clone /home/ubuntu/blog.git/ blog

回到远程仓库,配置 GitHook:

1
2
ubuntu@VM-240-186-ubuntu:~/tomcat7/webapps$ cd /home/ubuntu/blog.git/
ubuntu@VM-240-186-ubuntu:~/blog.git$ vim hooks/post-receive

post-receive 中添加如下代码:

1
2
3
4
5
6
#!/bin/sh
echo "Remote is updating code..." //这两句 echo 也可以不要,但是会在你执行 hexo d 之后给你反馈
cd /home/ubuntu/tomcat7/webapps/blog //注意这里是 Tomcat 下的路径,是克隆后的仓库
unset GIT_DIR
git pull origin master //从远程仓库更新代码
echo "Update code finished"

保存退出,还得为这个文件添加可执行权限:

1
ubuntu@VM-240-186-ubuntu:~/blog.git$ chmod +x hooks/post-receive

现在在本地执行 hexo d 命令,就可以在看到 GitHooks 的反馈:

1
2
3
4
remote: Remote is updating code...          //第一句 echo
remote: From /home/ubuntu/blog
这里省略几十行。。。
remote: Update code finished //第二句 echo

然后到 CVM 的 tomcat7/webapps 下就可以看到自动部署过来的文件了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ubuntu@VM-240-186-ubuntu:~/tomcat7/webapps/blog$ ls -al
total 108
drwxrwxr-x 12 ubuntu ubuntu 4096 Nov 10 15:49 .
drwxr-xr-x 10 ubuntu ubuntu 4096 Nov 10 14:00 ..
drwxrwxr-x 8 ubuntu ubuntu 4096 Nov 10 15:49 .git
drwxrwxr-x 6 ubuntu ubuntu 4096 Nov 10 13:10 2016
-rw-rw-r-- 1 ubuntu ubuntu 10346 Nov 10 15:49 404.html
-rw-rw-r-- 1 ubuntu ubuntu 13 Nov 10 13:10 CNAME
drwxrwxr-x 2 ubuntu ubuntu 4096 Nov 10 15:49 about
drwxrwxr-x 4 ubuntu ubuntu 4096 Nov 10 15:49 archives
drwxrwxr-x 2 ubuntu ubuntu 4096 Nov 10 15:49 css
drwxrwxr-x 2 ubuntu ubuntu 4096 Nov 10 13:10 images
-rw-rw-r-- 1 ubuntu ubuntu 44553 Nov 10 15:49 index.html
drwxrwxr-x 3 ubuntu ubuntu 4096 Nov 10 13:10 js
drwxrwxr-x 9 ubuntu ubuntu 4096 Nov 10 13:10 lib
drwxrwxr-x 3 ubuntu ubuntu 4096 Nov 10 13:10 page
drwxrwxr-x 30 ubuntu ubuntu 4096 Nov 10 15:49 tags
ubuntu@VM-240-186-ubuntu:~/tomcat7/webapps/blog$

最后只需要修改 Tomcat 的相关配置,就可以通过 http 访问自己的博客啦,我想这个就不需要我再详细说明了把。

测试一下:

1
2
3
4
5
6
7
8
→ ping alphagao.com
PING alphagao.com (123.206.194.233) 56(84) bytes of data.
64 bytes from 123.206.194.233: icmp_seq=1 ttl=54 time=19.8 ms
64 bytes from 123.206.194.233: icmp_seq=2 ttl=54 time=12.2 ms
64 bytes from 123.206.194.233: icmp_seq=3 ttl=54 time=5.16 ms
64 bytes from 123.206.194.233: icmp_seq=4 ttl=54 time=4.66 ms
64 bytes from 123.206.194.233: icmp_seq=5 ttl=54 time=7.34 ms
64 bytes from 123.206.194.233: icmp_seq=6 ttl=54 time=5.77 ms

1
2
3
4
5
6
7
→ ping alphagao1993.github.io
PING github.map.fastly.net (151.101.16.133) 56(84) bytes of data.
64 bytes from 151.101.16.133: icmp_seq=1 ttl=43 time=377 ms
64 bytes from 151.101.16.133: icmp_seq=4 ttl=43 time=369 ms
64 bytes from 151.101.16.133: icmp_seq=5 ttl=43 time=370 ms
64 bytes from 151.101.16.133: icmp_seq=6 ttl=43 time=369 ms
64 bytes from 151.101.16.133: icmp_seq=17 ttl=43 time=369 ms

啧啧,差距是如此地明显,而且 GitPage 还有丢包呢。(貌似最后还是暴露了 IP 啊 -_-||)