一、准备工作

本章教程基于Docker搭建,所以需要你提前在服务器上安装好Docker环境。
Docker安装教程:https://blog.csdn.net/qq_19309473/article/details/113101602

二、流程

(1) docker安装mysql

#创建 Docker 自定义桥接网络,方便docker内部通信
docker network create halo-mysql-nginx-net

# 拉取mysql镜像
docker pull mysql

# 创建文件夹
mkdir -p ~/.halo/mysql

# 启动 MySQL 实例 xxxxxxxxx为你自己设置的密码
docker run --name halo-mysql -v ~/.halo/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xxxxxxxx --net halo-mysql-nginx-net --restart=unless-stopped -d mysql

# 进入 MySQL 容器中登录 MySQL 并创建 Halo 需要的数据库
docker exec -it halo-mysql /bin/bash

# 登录 MySQL
mysql -u root -p
# 输入 MySQL 数据库密码

# 创建数据库
create database halodb character set utf8mb4 collate utf8mb4_bin;

# 使用 exit 退出MySQL 
# 使用 exit 退出容器 因为之前设置了--restart=unless-stopped 不用担心容器停止

docker安装mysql命令解释

--name halo-mysql                  #设置容器名字
-v ~/.halo/mysql:/var/lib/mysql    #卷挂载。 本地地址:容器内部地址
-e MYSQL_ROOT_PASSWORD=xxxxxxxx    #设置mysql密码
--net halo-mysql-nginx-net          #挂载网络
--restart=unless-stopped            #除非手动停止否则自动重启
-d                                 #后台运行
mysql                              #mysql版本

(2) docker安装halo

下载halo镜像

docker pull halohub/halo:1.4.17

创建工作目录

mkdir -p ~/.halo/halo && cd ~/.halo/halo

下载配置文件到工作目录

wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml

修改配置文件,配置数据库或者端口等

vim application.yaml

# 你需要做如下几个步骤:
# 注释 H2 database configuration.部分
# 启用 MySQL database configuration.部分
# 修改 datasource 下的 url 中的 ip 地址部分为容器名称并修改密码为您设定的 MySQL 密码

image.png

(3)启用halo

docker run -it -d --name halo -p 8090:8090 -v ~/.halo/halo:/root/.halo --net halo-mysql-nginx-net --restart=unless-stopped halohub/halo:1.4.17

docker安装halo命令解释

-it -d                       #运行方式
--name halo                  #设置容器名字
-p 8090:8090                 #端口设置
-v ~/.halo/halo:/root/.halo  #卷挂载。 本地地址:容器内部地址
--net halo-mysql-nginx-net   #挂载网络
--restart=unless-stopped     #除非手动停止否则自动重启
halohub/halo:1.4.17          #halo版本

到这里就可以去浏览器 使用ip:8090打开个人博客网站。会看到 Halo 安装向导,前提是安全组开放了8090端口

(4)配置nginx代理

docker安装nginx

#拉取nginx镜像
docker pull nginx

# 先运行一个nginx容器test
docker run --name test -p 81:80 -d nginx

# 建立服务器本地的文件夹
mkdir -p ~/.halo/nginx/data/nginx/conf ~/.halo/nginx/data/nginx/conf.d ~/.halo/nginx/data/nginx


# 从容器拷贝文件到本地方便之后挂载test
docker cp test:/etc/nginx/nginx.conf ~/.halo/nginx/data/nginx/conf && docker cp test:/etc/nginx/conf.d/default.conf ~/.halo/nginx/data/nginx/conf.d && docker cp test:/usr/share/nginx/html ~/.halo/nginx/data/nginx


# 删除这个测试容器
docker rm test -f

# 再安装需要的nginx容器
docker run \
--name halo-nginx \
-p 80:80 \
-p 443:443 \
-v ~/.halo/nginx/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v ~/.halo/nginx/data/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-v ~/.halo/nginx/data/nginx/html:/usr/share/nginx/html \
-v ~/.halo/nginx/data/nginx/log:/var/log/nginx \
-v ~/.halo/nginx/data/nginx/certs:/etc/nginx/certs \
--network halo-mysql-nginx-net \
--restart=unless-stopped \
-d \
nginx

此时访问服务器ip地址 看到Welcome to nginx! 即为成功

docker安装nginx参数说明

--name halo-nginx                 # 给容器取名为halo-nginx
-p 80:80                          # 容器80端口映射到宿主机80端口,HTTP
-p 443:443                        # 容器443端口映射到宿主机443端口,HTTPS
-v ~/.halo/nginx/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf               # nginx.conf可以配置反向代理
-v ~/.halo/nginx/data/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf  # default.conf可以配置反向代理
-v ~/.halo/nginx/data/nginx/html:/usr/share/nginx/html            # 挂载html目录,存放静态网页
-v ~/.halo/nginx/data/nginx/log:/var/log/nginx                    # 挂载log目录,存放日志
-v ~/.halo/nginx/data/nginx/certs:/etc/nginx/certs                # 挂载certs目录,存放ssl证书
--network halo-net                # 将Nginx容器加入与Halo容器同一网络。
--restart=unless-stopped          # Docker启动时自动启动这个容器
-d                                # 设置后台容器运行



修改本地nginx配置文件default.conf ,之后容器restart即可同步进去容器的配置

vim /root/.halo/nginx/data/nginx/conf.d/default.conf

删除原有全部内容 并修改如下:

每个server功能:第一个 禁用ip访问;第二个 强制跳转https;第三个禁用https的ip访问 ; 第四个只允许https的域名访问

域名和证书要改成你自己的!!!!!!!!!!

return 400 404 444 看自己选择

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name _;
        return 404;
}

server {
    listen      80;
    server_name 你自己的域名;
    return 301  https://$host$request_uri;
}

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    ssl_certificate     /etc/nginx/certs/自己的证书.pem;
    ssl_certificate_key /etc/nginx/certs/自己的证书.key;
    server_name _;
    return 404;
}

server {
    listen       443 ssl;
    server_name  你自己的域名;

    ssl_certificate     /etc/nginx/certs/自己的证书.pem;
    ssl_certificate_key /etc/nginx/certs/自己的证书.key;

    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    client_max_body_size 1024m;
    location / {
      proxy_pass http://halo:8090;
      proxy_set_header HOST $host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For
      $proxy_add_x_forwarded_for;
    }
}
# 重启nginx 服务
docker restart halo-nginx

至此就差不多了,,剩下的自己摸索吧,哈哈哈