在Centos上使用Docker部署Hexo博客(腾讯云平台)

在CentOS上使用 Docker 运行 nginx 容器,这个容器挂载了Hexo部署目录来实现访问服务

前言

假设公网IP 111.11.1.11
域名 www.gaoyuanqi.cn

下面出现的 111.11.1.11www.gaoyuanqi.cn 均需换成自己的

关于域名备案

如果使用中国大陆服务器,域名必须备案才能访问博客
如果使用中国海外服务器,域名无需也不支持备案,但可以访问博客

本地

创建一个 hexo 目录作为项目目录,后面会自动创建3个目录:

  • hexo/hexo:hexo博客文件
  • hexo/ssl:ssl证书文件
  • hexo/conf:nginx的conf配置文件

云主机

安全组需开放22、80、443端口,腾讯云默认开放所有端口
22 :ssh访问
80 :http访问
443 :https访问

环境

本地环境

windows10 64位

云主机环境

centos 9 64位

安装

在本地安装应用

Node.jsGitHexo 安装见:

这里创建了 hexo/hexo/ 目录

在服务器安装应用

1、安装git

1
sudo yum install git

2、查看git版本

1
git --version

3、安装docker

Docker配置

1、配置阿里云镜像加速

2、拉取nginx镜像

1
docker pull nginx:latest

3、启动nginx服务

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
  • -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 :使用标签为 latestnginx 镜像,即上面拉取的nginx镜像

4、查看运行的容器

1
docker ps

正常如下图所示:
nginx-web

5、拷贝default.conf文件

nginx-web 容器内的 /etc/nginx/conf.d/ 目录下本来有一个 default.conf 文件,不过因为在与宿主机上的 /home/nginx/conf.d 目录挂载时被覆盖了
没有该文件,浏览器访问出现 502 Bad Gateway 报错
因此下面要运行一个新nginx容器,然后拷贝该容器上的 default.conf 文件到挂载目录

1
2
3
4
docker run -d --name=ceshi nginx:latest
docker cp ceshi:/etc/nginx/conf.d/default.conf /home/nginx/conf.d/default.conf
docker stop ceshi
docker rm ceshi

6、获取nginx-web容器IP

1
docker inspect nginx-web

如下图 172.17.0.2
nginx-web

配置ssh公钥

设置ssh公钥后可以免密码部署git仓库:

创建git仓库

创建hexo.git仓库(必要)

1、创建部署目录(root权限下执行)

1
2
3
mkdir -p /home/nginx/html/hexo
mkdir -p /home/nginx/conf.d
mkdir -p /home/nginx/ssl

2、创建hexo.git仓库

1
2
3
su git
cd ~
git init --bare hexo.git

3、编辑hexo.git钩子文件

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

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

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

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

4、授予钩子文件可执行权限

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

创建ssl.git仓库

1、创建ssl.git仓库

1
2
cd ~
git init --bare ssl.git

2、编辑ssl.git钩子文件

1
vi ~/ssl.git/hooks/post-receive

i 键进入输入模式,写入

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

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

3、授予钩子文件可执行权限

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

创建conf.git仓库

1、创建conf.git仓库

1
2
cd ~
git init --bare conf.git

2、编辑conf.git钩子文件

1
vi ~/ssl.git/hooks/post-receive

i 键进入输入模式,写入

1
git --work-tree=/home/nginx/conf.d --git-dir=/home/git/conf.git checkout -f

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

3、 授予钩子文件可执行权限

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

域名配置

以腾讯云为例

域名解析

解析 www.gaoyuanqi.cn 如下(第三条)
yuming

  • 主机记录www
  • 记录类型A
  • 记录值云主机公网IP
  • 如果域名是 www.abc.gaoyuanqi.cn主机记录www.abc

申请ssl证书

如果使用 www.gaoyuanqi.cn 访问博客,则证书绑定域名必须是 www.gaoyuanqi.cn,两者保持一致
下载的ssl证书是一个压缩包,解压后其中有一个 Nginx 文件夹,将该文件夹重命名为 www.gaoyuanqi.cn

拉取远程仓库

进入 hexo/ 项目目录下打开终端

1、拉取ssl.git

1
git clone git@111.11.1.11:/home/git/ssl.git

2、拉取conf.git

1
git clone git@111.11.1.11:/home/git/conf.git

此时 hexo 项目目录下有 hexosslconf 三个文件夹

推送本地仓库

推送hexo.git

编辑 hexo/hexo/_config.yml 站点配置文件(最下面写入):

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

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

然后在 hexo/hexo/ 目录下打开终端推送:

1
2
3
hexo clean
hexo g
hexo d

推送ssl.git

首先将装有ssl证书文件的 www.gaoyuanqi.cn 文件夹复制到 hexo/ssl/ 目录下

然后在 hexo/ssl/ 目录下打开终端:

1
2
3
git add .
git commit -m 'ssl'
git push

推送conf.git

  • hexo/conf/ 目录下创建一个名为 www.gaoyuanqi.cn.conf 的站点配置文件
  • .conf 前面一般以域名命名
  • www.gaoyuanqi.cn.conf 文件内容分两种情况: http访问https访问

http访问配置

如果不配置ssl证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# HTTP server
#
server {
listen 80 default_server;
listen [::]:80;
server_name www.gaoyuanqi.cn;

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;
}

}

行数说明

  • 4 :监听80端口,default_server 即设为默认虚拟主机,无效访问会转到该站点
  • 6 :域名或者云主机公网IP
  • 9 :nginx-web容器内的hexo部署目录路径,与宿主机 /home/nginx/html 目录挂载
  • 17-20 :nginx-web容器内的50x.html文件路径,与宿主机 /home/nginx/html 目录挂载(上面运行ceshi容器时已经拷贝下来,也可手动新建)

https访问配置

如果配置ssl证书

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
# HTTP server
#
server {
listen 80 default_server;
listen [::]:80;
server_name www.gaoyuanqi.cn;

# 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://www.gaoyuanqi.cn$1 permanent;

}

# HTTPS server
#
server {
listen 443 ssl;
server_name www.gaoyuanqi.cn;

# ssl配置
#
ssl_certificate /etc/nginx/ssl/www.gaoyuanqi.cn/1_www.gaoyuanqi.cn_bundle.crt;
ssl_certificate_key /etc/nginx/ssl/www.gaoyuanqi.cn/2_www.gaoyuanqi.cn.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;
}

#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;
}

}

行数说明

  • 4 :监听80端口,default_server 即设为默认虚拟主机,无效访问会转到该站点
  • 6 :域名或者云主机公网IP
  • 11 :将 www.gaoyuanqi.cn 的访问转发到代理地址即 nginx-web 容器,格式为 http://容器IP:容器端口
  • 13 :将http访问重定向为https访问,即定向到第二个 server 块,需要注意ssl证书到期时间
  • 21 :域名
  • 25-26 :nginx-web容器内的ssl证书路径,与宿主机 /home/nginx/ssl 目录挂载
  • 33-36 :nginx-web容器内的hexo部署目录路径,与宿主机 /home/nginx/html 目录挂载
  • 42-45 :nginx-web容器存放50x.html文件路径,与宿主机 /home/nginx/html 目录挂载(上面运行ceshi容器时已经拷贝下来,也可手动新建)

推送

hexo/conf/ 目录下打开终端:

1
2
3
git add .
git commit -m 'conf'
git push

重启 nginx-web

在root用户下

重启nginx-web容器

1
docker restart nginx-web

查看运行的容器

1
docker ps

正常运行容器所示
nginx-web

但如果
nginx-web0

则很大概率 www.gaoyuanqi.cn.conf 站点配置文件不正确,比如,域名不一致、conf文件有不合法字符等

浏览器访问 https://www.gaoyuanqi.cn
hexo-cn

其它问题

容器被删除

如果容器被删除了,宿主机上的数据依然会保留,执行:

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

就可以重新运行