前言
前两天 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 | sudo rm /var/lib/dpkg/info/oracle-java8-installer* |
然后就可以重新安装 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 | ubuntu@VM-240-186-ubuntu:~$ mkdir blog.git |
这里的仓库就是 Hexo 配置文件里的 Deploy 仓库,在配置文件中修改如下(记得将 IP 地址换成自己 CVM 的 IP):
1 | deploy: |
此时就已经可以向 CVM 推送 Hexo 了,但还没有部署到 Tomcat 目录。
那么继续呗,切换到 Tomcat 的 webapps 目录,然后克隆前面创建的远程仓库:
1 | ubuntu@VM-240-186-ubuntu:~$ cd /home/ubuntu/tomcat7/webapps/ |
回到远程仓库,配置 GitHook:
1 | ubuntu@VM-240-186-ubuntu:~/tomcat7/webapps$ cd /home/ubuntu/blog.git/ |
在 post-receive
中添加如下代码:
1 |
|
保存退出,还得为这个文件添加可执行权限:1
ubuntu@VM-240-186-ubuntu:~/blog.git$ chmod +x hooks/post-receive
现在在本地执行 hexo d
命令,就可以在看到 GitHooks 的反馈:
1 | remote: Remote is updating code... //第一句 echo |
然后到 CVM 的 tomcat7/webapps
下就可以看到自动部署过来的文件了:
1 | ubuntu@VM-240-186-ubuntu:~/tomcat7/webapps/blog$ ls -al |
最后只需要修改 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 | → ping alphagao1993.github.io |
啧啧,差距是如此地明显,而且 GitPage 还有丢包呢。(貌似最后还是暴露了 IP 啊 -_-||)