0%

腾讯云服务器自建博客

简介

hexo 博客系统会将 md 文件转换成可以在浏览器里访问的 html 文件,如果将转换后的文件放在云服务器上,起一个 nginx 服务即可达自建博客的目的,从此告别龟速的 GitHub pages。

环境

本地:macOS Mojave 10.14.6

云服务器:腾讯云 Centos8

准备好 hexo 编译后文件

将 hexo 编译后的文件手动拷贝到云服务器的特定目录下,我的存放位置是:

1
2
su root
mkdir /home/hexo # 此目录为网站的根目录

配置 nginx 服务

  • 安装

因此第一步是安装 nginx,我用的是腾讯云的 Centos8,安装比较简单:

1
yum install nginx
  • 修改配置

nginx 默认配置文件目录为:/etc/nginx/conf/nginx.conf,找到这个文件后修改下面的几个配置:

1
2
3
4
5
6
7
server {
listen 80; #监听80端口
server_name www.foogry.wang; #你的服务器名,通常是域名,如果是域名,你就需要监听80端口
root /home/hexo; #网站的根目录,也就是你 hexo 编译后的文件存放位置
location / {
}
}
  • 启动服务
1
systemctl restart nginx.service

或者

1
nginx -s reload
  • 预览效果

这时顺利的话,在浏览器里输入 你前面配置的 server_name 或者你的云服务器公网 ip 地址就能看到网站了。

自动部署

创建云服务器 git 服务账户

1
2
3
4
adduser git #加入git用户
passwd git #配置你的密码
chmod 740 /etc/sudoers #修改权限 r=4 w=2 x=1 rwx=7 r__=4 ___=0,也就是说git的sudo使用权为只读
vim /etc/sudoers

打开 suduers,找到以下内容:

1
2
## Allow root to run any commands anywhere
root ALL=(ALL) ALL

在它的下面加入以下内容:

1
git ALL=(ALL) ALL

保存后,需要将权限修改回来

1
chmod 400 /etc/sudoers

搭建 git 服务

本地电脑上修改并重新生成 hexo 文件后,同步上传到云服务器上自己搭建的 git 服务器上。

1
2
3
4
su root
cd /home/git # 在 git 用户目录下创建
git init --bare hexo.git
chown git:git -R hexo.git

这样就在云服务器上搭建了一个空的 git 服务,可以在本地电脑上做下测试:

1
2
3
git clone git@你的云服务器公网ip:/home/git/hexo.git
Cloning into 'hexo'...
warning: You appear to have cloned an empty repository.

或者用下面的方式也能测试:

1
ssh -v git@你的云服务器公网ip

将本地 hexo 文件上传到云服务器

到这里,本地电脑上编译好的 hexo 网站文件就可以上传到云服务器上我们搭建好的 git 服务了,我的本地上传脚本:

1
2
3
4
5
6
7
8
9
10
# 创建发布用 git 仓库
cd public # 你自己的 hexo 编译结果输出目录
git init
git add .
git commit -m "update at `date` "

# 改变云服务器 remote url
git remote add cloud git@你的云服务器ip:/home/git/hexo.git
# 提交博客内容
git push -u cloud master -f

自动部署

使用 git-hooks 同步网站根目录

1
vim hexo.git/hooks/post-receive

填入以下内容,其中 /home/hexo 为网站目录,根据自己的填入,保存退出。

1
2
#!/bin/sh
git --work-tree=/home/hexo --git-dir=/home/git/hexo.git checkout -f

该钩子的意思是当本地有提交到服务器时,会将文件放在/home/hexo下

-f 这个参数如果在多人协作的博客中可能会引发不好的结果,因为他是强制更新的意思,会将本地版本覆盖掉远程服务器的版本,但是是个人的博客系统就无所谓了

保存后,要赋予 post-receive 文件可执行权限:

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

配置公钥到服务器

为了避免每次 push 的时候输入密码,可以将本地电脑的公钥配置到 git 服务器上。

  • 获取本地电脑公钥

如何获取本地电脑的公钥可以参考之前的文章:《让Octopress博客在多台Mac上同时使用》2.创建并添加ssh key 章节。

拿到本地电脑的 id_rsa.pub 文件内容后 copy 以供后文使用。

  • 配置公钥到服务器

在服务器端,切换至刚刚创建好的 git 用户下,创建 .ssh 文件和 authorized_keys 文件

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

修改权限:

1
2
3
cd ~
chmod 600 .ssh/authorzied_keys # 将文件设置为可读可写
chmod 700 .ssh #将该文件夹设置为可读可写可执行,注意文件夹的可执行是指能访问

问题

  • git push 到远程仓库后报错:
1
2
3
4
5
6
Enumerating objects: 172, done.
Counting objects: 100% (172/172), done.
Delta compression using up to 4 threads
Compressing objects: 100% (166/166), done.
error: remote unpack failed: unable to create temporary object directory
error: failed to push some refs to 'git@你的云服务器公网ip:/home/git/hexo.git'

解决方案:

远程服务器下给 /home/hexo.git 开启写权限:

1
2
su root
chown git:git -R hexo.git

参考文档