Hexo博客迁移到腾讯云

一开始博客在github pages上,速度比较慢。后来在网上发现许多人说托管到Netify很快,还自带CDN加速。但我迁移过去,发现国内的网根本就登不上,又检测了一下在大陆访问博客的速度,惨不忍睹。最终老老实实买台腾讯云服务器,把博客迁移过去。顺手写篇文章记录一下。


必备环境

服务器(作者用的是腾讯云的),域名www.xiaoniuhululu.com(需要备案)

云主机 安全组需开放22、80、443端口,腾讯云默认开放所有端口

22 :ssh访问

80 :http访问

443 :https访问

本地:装好 git, 一个能正常在本地运行的hexo 博客

我们先将服务器的环境 配置一下:

  1. 安装git
1
sudo yum install git
  1. 安装docker

为什么使用docker,通过 docker 拉取 nginx 镜像,将该镜像运行的容器作为代理服务器和反向代理.

我们通过 daocloud 加速安装,这样方便快捷

1
curl -sSL https://get.daocloud.io/docker | sh

查看docker版本

1
docker -v

Docker version 20.10.5, build 55c4c88

设置docker自启动

1
sudo systemctl enable docker

启动docker

1
sudo systemctl start docker
  1. 拉取nginx镜像

搜索nginx镜像

1
docker search nginx

拉取最新 nginx 镜像到云主机

1
docker pull nginx:latest

查看镜像

1
docker images

查看nginx镜像版本

1
docker image inspect nginx:latest | grep -i version
  1. 运行nginx容器

运行一个名为 nginx-web 的容器

1
2
3
4
5
6
7
8
9
10
11
docker run -d \
--name nginx-web \
-p 80:80 \
-p 443:443 \
--restart always \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
-v /home/nginx/conf.d:/etc/nginx/conf.d \
-v /home/nginx/html:/usr/share/nginx/html \
-v /home/nginx/log:/var/log/nginx \
-v /home/nginx/ssl:/etc/nginx/ssl \
nginx:latest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
其中:

-d :在分离模式下(后台)运行
--name :给运行的容器取一个名字,这里是 nginx-web
-p :docker宿主机端口映射nginx-web容器端口,即80映射80,443映射443
--restart :将 nginx-web 容器设为自启动
-v :将docker宿主机的目录路径绑定装载到nginx-web容器的目录路径,即两者路径下的数据会自动同步且保持一致,目录不存在自动创建

/usr/share/zoneinfo/Asia/Shanghai :将宿主机时间同步到容器,因为容器与宿主机时间相差8小时
/home/nginx/conf.d :存放站点配置文件
/home/nginx/html :存放hexo部署目录
/home/nginx/log :存放nginx-web容器运行日志
/home/nginx/ssl :存放ssl证书,用于https访问

nginx:latest :使用标签为 latest 的 nginx 镜像,即上面拉取的nginx镜像

查看所以容器:

1
docker ps -a

出现下面代表容器创建并运行成功

  1. 拷贝default.conf文件
    nginx-web 容器在 /etc/nginx/conf.d/ 目录下有一个 default.conf 文件,因为该目录与宿主机上的 /home/nginx/conf.d 目录挂载时被删除了。没有该文件,浏览器访问报错 502 Bad Gateway 。因此下面要运行一个新nginx容器,然后拷贝该容器上的 default.conf 文件到挂载目录就解决了

首先,运行一个名为ceshi的新容器

1
docker run -d --name=ceshi nginx:latest

将ceshi容器内的default.conf文件拷贝到宿主机

1
docker cp ceshi:/etc/nginx/conf.d/default.conf /home/nginx/conf.d/default.conf

还有ceshi容器的 50x.html 文件(其实新建一个也可以)

1
docker cp ceshi:/usr/share/nginx/html/50x.html /home/nginx/html/50x.html

这时可以删除ceshi容器

首先停止容器

1
docker stop ceshi

然后删除容器

1
docker rm ceshi
  1. 创建git用户
1
useradd git

会自动在宿主机上创建 /home/git 用户目录

更改文件权限

1
chmod 740 /etc/sudoers

配置git用户权限

1
vim /etc/sudoers

按 i 键进入输入模式,在 root ALL=(ALL) ALL 下一行添加

1
git ALL=(ALL) ALL

按 ESC 键退出输入模式,输入 :wq 保存

改回文件权限

1
chmod 400 /etc/sudoers

更改git密码

1
sudo passwd git

创建 /home/nginx/html/hexo 部署目录

与nginx-web容器的/usr/share/nginx/html/hexo目录挂载

1
mkdir /home/nginx/html/hexo

切换到git用户(下面都是用git用户)

1
su git
  1. 创建hexo.git仓库

hexo.git 仓库用来存放hexo博客部署文件

创建hexo.git仓库

1
2
$ cd ~
$ git init --bare hexo.git

配置 post-receive 钩子文件实现从 hexo.git 仓库克隆新的博客静态文件到 /home/nginx/html/hexo (需root用户手动创建hexo文件夹,上面已经创建过了)目录下。这样以后部署博客时只需要本地 git push 就好,无需在云主机操作

编辑hexo.git钩子文件

1
vim ~/hexo.git/hooks/post-receive

按 i 键进入输入模式,写入:

1
git --work-tree=/home/nginx/html/hexo --git-dir=/home/git/hexo.git checkout -f

按 ESC 键退出输入模式,按 :wq 保存

授予钩子文件可执行权限

1
2
3
$ chmod +x ~/hexo.git/hooks/post-receive
$ cd ~
$ sudo chmod -R 777 /home/nginx/html/hexo

可能提示要输入git密码

如果再添加一个网站,只需
root用户下创建一个 ceshi 文件夹

1
2
mkdir /home/nginx/html/ceshi
su git

除了只需要更改仓库名和目录路径,其它同上,nginx-web容器可以代理多个网站

本地

  1. 域名绑定服务器+ 申请ssl证书

笔者用的是 阿里云的域名,去阿里云控制台把域名与服务器绑在一起,这部分很简单,就省略了
申请ssl证书,用的腾讯的,下载下来后注意:

如果使用 www.xiaoniuhululu.com 访问博客,则证书绑定域名必须是 www.xiaoniuhululu.com ,两者保持一致

下载的ssl证书是一个压缩包,解压后其中有一个 Nginx 文件夹,重命名该文件夹为www.xiaoniuhululu.com

  1. 推送ssl证书和nginx 配置文件至 服务器中

笔者 使用的是winscp工具上传的,上传好后

ssl证书 上传至服务器 /home/nginx/ssl

nginx 配置文件,先在本地写好,然后上传至服务器 /home/nginx/conf.d

配置文件:xiaoniuhululu.com.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
###https访问

server {
listen 80 default_server;
listen [::]:80;
server_name xiaoniuhululu.com;

location / {
root /usr/share/nginx/html/hexo;
index index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
location ~ \.php$ {
proxy_pass http://172.17.0.2:80;
}
rewrite ^(.*) https://xiaoniuhululu.com$1 permanent;

}


server {
listen 443 ssl;
server_name xiaoniuhululu.com;

ssl_certificate /etc/nginx/ssl/www.xiaoniuhululu.com/1_xiaoniuhululu.com_bundle.crt;
ssl_certificate_key /etc/nginx/ssl/www.xiaoniuhululu.com/2_xiaoniuhululu.com.key;

# ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
ssl_prefer_server_ciphers on;

location / {
root /usr/share/nginx/html/hexo;
index index.html index.htm;
}

}

注意:路径一定要一一对应,可以自定义

  1. 推送本地hexo博客

修改hexo博客的配置文件hexo/_config.yml:

1
2
3
4
deploy:
type: git
repository: git@111.11.1.11:/home/git/hexo.git
branch: master

注意前面和冒号 : 后的空格

推送到云主机 hexo.git 仓库
hexo目录下右键 Git bash Here

执行部署命令,文件会自动部署到服务器的hexo.git仓库中,静态文件会上传到nginx/html/hexo中

1
2
3
hexo clean
hexo g
hexo d

启动nginx容器

1
docker restart 容器的id

如果没启动成功,或者页面不正常,可以查看nginx的日志 在/home/nginx/log中,

把问题一一解决后,浏览器访问 www.xiaoniuhululu.com

参考:https://www.gaoyuanqi.cn/hexo-tenxunyun-xin/


本篇文章到这里就结束啦,如果喜欢的话,多多支持,欢迎关注!