安小琪's blog

少年有梦,不应止于心动

hexo博客从github迁移到阿里云服务器

npfs06.top 从建站以来静态页面都是同时托管在 GitHub Pages 上,_config.yml 的 deploy 块如下

这是我之前的域名解析:

网站图床选择的是七牛云,也进行了cdn加速,按照我平时的图片使用量,每个月的费用是0.5元左右,所以图床不准备变更了

博客因为是基于github的,网页访问及其不稳定,比如:

  1. 加载时间长

  2. 时不时抽筋无法访问

所以决定将博客迁移到云服务器

云服务器配置如下:


有了云服务器之后,建议ssh连上,省的每次登入都要输入账号密码(这里我用的是xshell)

登录云服务器安装git和nginx

1
2
sudo apt install git
sudo apt install nginx

安装成功之后浏览器输入服务器ip地址打开是nginx默认页面

修改默认打开页面

nginx的默认界面是/var/www/html

也可不修改默认打开页面只需将博客文件放到/var/www/html下即可

如果需要修改的话,找到nginx配置文件,我的是/etc/nginx/sites-available下的default文件,建议先备份

重新载入Nginx,使配置生效

1
service nginx reload

如果报错,看看找对配置文件没,实在改不过来恢复原来的备份文件,执行命令后没什么显示即执行成功

git clone

git clone https://github.com/npfs06/npfs06.github.io 将github pages内容克隆到网站根目录

这个时候,我们即使没有备案,通过 IP 也可以访问自己的博客,可以直接在浏览器的地址栏输入阿里云公网的 IP 访问自己的博客。如果通过公网 IP 访问没有问题,说明环境搭建成功。

域名访问

如果有域名并已备案,在阿里云上控制台设置域名指向服务器的公网 IP 的 A 记录,这样就可以通过域名访问博客。

虽然看起来我们似乎将原来托管在 GitHub 或 Coding 上的博客迁移到阿里云服务器上了,但是博客源代码是通过手动 git clone 下来到 /var/www/html/npfs06.github.io 上的,如果我们需要对博客进行修改或者发布新的文章,运行 hexo d还是将会更新的博客源代码上传至 GitHub 或 Coding 上,并没有自动上传到阿里云的服务器上。如果想同步修改,还是需要在服务器的 /var/www/html/npfs06.github.io 目录下删除原来所有的博客源代码重新 git clone,或者通过 git pull 同步。

这是非常不方便的,因为博客的每一次修改都需要登上阿里云服务器手动同步,而我们期望的是能持续集成和部署。解决方法很简单,在阿里云的机器上搭建一个 Git 远程仓库(相对本地仓库来说),像 GitHub 一样,每次通过 hexo d 时候,也将网站内容更新到阿里云的 Git 仓库中,并自动同步到 /var/www/html/npfs06.github.io 中。

创建一个Git裸库,只用于保存Repository信

创建 git 用户:

1
adduser git

在 /home/git 目录下创建裸仓 blog.git:

1
2
cd /home/git
git init --bare hexo.git

修改 blog.git 的所有者和组权限:

1
chown -R git:git blog.git

获取本地机器 SSH 的公钥:

1
cat ~/.ssh/id_rsa.pub

复制公钥,将公钥写入阿里云机器的 /home/git/.ssh/authorized_keys 文件中

在 /home/git/blog.git/hooks/post-receive 文件中写入:

1
2
#!/bin/sh
git --work-tree=/var/www/html/npfs06.github.io --git-dir=/home/git/blog.git checkout -f

其中 npfs.06.github.io` 是我网站的文件名,这里需要换成你的网站文件名

修改本地机器上的 _config.yml 文件,在 deploy 块中添加阿里云机器上刚创建的 hexo.git 仓库:

其中 47.96.160.180 改为你的阿里云公网 IP 即可

这样就可以做到每次执行 hexo d 命令时,不仅将网站内容同步到 GitHub 或 Coding 上,同时也同步到阿里云机器的 /var/www/html/npfs06.github.io 目录中,做到自动化部署。


接下来我们测试一下在本地将本篇文字push到github,看下服务器能否同步更新

hexo g -d

这里需要输入服务器登入密码, 如果服务器配置过SSH 公钥的,可以免密推送

可以看到网页上成功显示这篇文章

服务器上成功同步更新


补充

如果配置完成之后发现网页无法访问,可能是因为防火墙的443端口没有正确开启

1
2
firewall-cmd --add-port=443/tcp --permanent   //防火墙开启443端口
firewall-cmd --reload //重启