最近买了一台腾讯云主机, 然后就把之前搭建在Coding.me上的博客迁移到了这台主机上,过程中也遇到一些小问题, 这里记录一下。

安装Nginx

Nginx是一个高性能的Web服务器,用它是为了将云主机上的博客文件映射出去,提供一个外部可访问的入口。我个人选择的是Ubuntu 14.04 LTS, 所以我这里都以Ubuntu为例作说明。

Nginx的安装基本上通过下面两条命令即可:

1
2
sudo apt-get update
sudo apt-get install nginx

更详细的说明可到这里.

部署博客源码到云主机

我之前是将我的博客部署在Coding上, 所以我就直接从Coding上Clone了一份到我的主机上。

1
git clone git_url blog

上面的步骤完成后, 可以把此git库中的上游信息删除掉(因为以后这里就是上游了),否则你每次从自己本地机器上push上来commit后, 这里的状态就会是有待提交的commit。具体操作可以这样: vim .git/config打开后将其中的remote部分删掉即可。

Nginx配置

在目录/etc/nginx/conf.d/下新建一个配置文件myblog.conf:

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
server_name ghui.me;
access_log /home/ghui/.log/access.log;
error_log /home/ghui/.log/error.log;

location / {
root /home/ghui/ghui.me; //博客资源路径
index index.html;
}
}

其中, access_log与error_log 路径需要提前创建好,否则nginx会报错。然后重新reload一下nginx的配置:
sudo service nginx reload

修改域名指向

完成上面的步骤后就可以将你的域名指向这个新的主机了,修改域名的A纪录指向新主机的IP地址。重新访问一下博客,看看能不能访问到,如果没问题就再在终端下ping一下域名,看看返回的ip是不是新的主机ip,如果是就代表域名修改生效了。

修改Hexo deploy地址

Hexo支持直接发布博客到指定的git仓库,我之前是指向Coding上的仓库地址的,现在就可以直接指向自己的云主机上的了。 这个地址由你的主机IP与git库地址组成。关于搭建git远程程仓库可以看这里, 完成这项步骤后,你可以尝试修改点东西做一个提交试试,你会发现会报这样的错误:
[remote rejected] master -> master (branch is currently checked out), 这是因为你尝试去提交commit到一个被检出的远程分支,具体请接着往下看。

修改Git配置实现自动部署

原则上一个上游版本库应该是一个裸版本库,因为上游版本库只是用来存放下游的commit的,但我们这里比较特殊:

  1. 我们需要它作为上游版本库来接收我们的提交
  2. 需要它作为博客的发布目录(默认需要检出,具备workspace)

这样的话就会出现上面我们提交时遇到的错误了。具体可以到这里了解更多。

解决方案

我这里是通过在远程仓库上额外新建一个单独的分支pages, 这个分支在远程仓库上是默认检出的。同时本地与远程git库中都额外存在一个master分支, 本地master分支是默认检出的, 我们平时也在这个分支下开发, 然后push到远程仓库上对应的master分支上,然后再利用git的hook技术将此次提交到master上的commit自动merge到pages分支上, 这样就不会有上面的错误了。因为我们并没有提交到一个被检出的远程分支上。

增加Git Hook
在远程仓库的.git/hooks/目录下创建一下叫post-update的文件,并赋予可执行权限chmod +x post-update, 通过VIM编辑写入如下内容:

1
2
3
4
5
6
#! /bin/sh
echo "hook..."
unset GIT_DIR
cd ..
git merge master
echo "after hook..."

实现的功能就是当从本地推送commit上来完成远程版本库的更新后,会触发此脚本执行merge操作, 将提交到master上的commit自动merge到pages分支上,实现自动发布功能。在写这个hook文件时遇到了一个问题,感兴趣的可以到这里了解详情

post-update是一个服务器端钩子。当从本地版本库完成一个push后,并且当所有引用都更新完毕后,在远程版本库上该脚本被触发。
更多关于Git Hook的内容可以到这里了解更多

别的解决方法: 除了这种方法之外,还可以通过在服务器上建一个裸版本库A,专门用来接收来自本地的提交, 再建立一个非裸版本库B作为博客的输出目录,然后当接收到提交后通过hook自动在B中pull拉取更新。这也是文末参考链接中的解决方法,但这样会存在两个版本库有两份重复的.git,并不如我们上面的方法好。

参考链接

  1. 在云服务器上搭建HEXO博客环境
  2. 阿里云 ubuntu 部署hexo,并与本地同步,实现自动部署

版权声明

文章版权归本人所有,如需转载需在明显位置处保留作者信息及原文链接 !