搭建步骤

  1. 阿里购买域名(购买后需要3天左右才能进行备案)
  2. 阿里购买服务器(ECS)
  3. 项目搭建
    • 安装Docker
    • 安装MySQL(选)
    • 安装Halo
    • 安装Nginx
    • 安装fail2ban
  4. 公安联网备案

假装你已经有了一个Linux服务器🙂

安装Docker

1. 更新yum

yum update

2. 卸载旧版Docker

yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine \
    docker-selinux

3. 安装docker必要的软件包

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

4. 添加docker的yum源才能下载,这里使用阿里镜像

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

5. 创建yum缓存,可加快下载操作速度

yum makecache

6. 安装docker、docker-cli

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

7. 验证,可以看到版本号就成功啦

docker --version

8. 启动Docker

# 启动
systemctl start docker

# 停止
systemctl stop docker

# 重启
systemctl restart docker

# 查看状态:显示绿色的Active: active(running),则启动成功
systemctl status docker

# 设置开机自启
systemctl enable docker

# 退出:Ctrl+C

9. 创建文件夹放配置文件:halo、nginx、mysql

mkdir -p /blog/{halo,nginx,mysql}

10. Docker相关指令解释

镜像相关

# 获取镜像
docker pull <容器>:版本号

# 获取最新镜像,相当于:docker pull <容器>:lasted
docker pull <容器>

# 查看所有镜像
docker images

# 为镜像创建新标签(会新增一个改过名的镜像)
docker tag <源镜像名称>:<源标签> <新镜像名称>:<新标签>

# 删除镜像
docker rmi <镜像名称>:<标签>
docker rmi <镜像ID>

容器启动命令

docker run <容器>

基本参数

  • -d: 在后台运行容器并打印容器ID,适合运行守护进程(如Web服务器)。
  • -i:保持STDIN(标准输入)打开,用于交互式应用(如命令行工具)。
  • -t:分配一个伪终端(TTY),通常与-i一起使用,模拟真实终端环境。
  • --name:为容器指定一个名称。
  • -p:将容器端口映射到宿主机端口,允许外部访问容器内的服务。
  • -v:容器卷技术,容器中的数据本身存放于容器中,一旦删除容器,数据也会随之删除,可以将文件挂载到宿主机中,删除时只会删除容器本身。对被挂载的文件进行修改时,也会影响容器。类似双向绑定,用于持久化数据或共享文件。
  • -e:设置环境变量的参数,可以在启动容器时向容器内部传递环境变量
  • --restart:设置容器的重启策略。
    • always my_image:总是重启。
    • on-failure:仅在失败时重启。
    • no:不会重启。
    • unless-stopped:容器总是会自动重启,除非它被手动停止,或者Docker本身被停止。
    • on-failure:<max-retries>: 仅当容器以非零状态退出时,容器会自动重启,但重启次数最多为指定的<max-retries>
  • --priviledged=true:获取访问宿主机的权限
# 进入容器指令(容器内必须有bash)
docker exec -it <容器> bash

# 退出容器指令
输入 exit 或按  Ctrl+D
# 查看运行中的容器
docker ps

# 查看所有容器,包括运行中的,如果容器状态一直是exit或retry,说明启动失败
docker ps -a

# 删除容器
docker rm -f <容器>

安装MySQL

Halo默认使用H2数据库,但是容易损坏,建议换成其他如MySQL等Halo支持的数据库。

1. 获取镜像

docker pull mysql

2. 创建文件夹用于挂载数据

mkdir -p /blog/mysql/{conf,data,log}

3. 创建配置文件

touch /blog/mysql/conf/my.cnf

4. 配置中写入内容

vim /blog/mysql/conf/my.cnf
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Custom config should go here
!includedir /etc/mysql/conf.d/

5. 配置目录权限

chmod 777 /blog/mysql/data /blog/mysql/log
# 配置文件必须设置644权限,否则会报错无效
chmod 644 /blog/mysql/conf/my.cnf

6. 启动镜像

docker run \
--name mysql -p 3306:3306 \
-v /blog/mysql/data:/var/lib/mysql \
-v /blog/mysql/config:/etc/mysql/conf.d \
-v /blog/mysql/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql 

-e MYSQL_ROOT_PASSWORD=123456:设置MySQL的root用户的密码

7. 进入容器

docker exec -it mysql bash

8. 修改mysql配置

# 登录mysql
mysql -uroot -p123456

# 选择mysql数据库
use mysql

# 查询配置
select user,host from user;
# 结果如下:
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
# 如果root那一行的host为localhost,执行更新语句
update user set host = '%' where user='root';

# 给root用户设置密码
alter user 'root'@'%' identified with 
mysql_native_password by '123456';

# 刷新配置生效
flush privileges;

# 创建Halo项目需要的表
CREATE DATABASE halo CHARACTER 
SET utf8mb4 COLLATE utf8mb4_general_ci;
# 退出mysql 
exit
# 退出容器
exit

安装Halo

官网地址:Halo 文档
官方维护的三个镜像源:

1. 获取镜像

docker pull registry.fit2cloud.com/halo/halo:2.20 

2. 修改名称

docker tag registry.fit2cloud.com/halo/halo:2.20 halo:latest

3. 简单启动项目

docker run -it -d \
--name halo -p 8090:8090 halo 

4. 进入容器

docker exec -it halo bash

# 查看当前目录
pwd
# 列出当前目录的文件,不包含隐藏文件
ls
# 列出当前目录的文件,包含隐藏文件
ls -a

5. 查看halo的项目配置文件,在 /application/BOOT-INF/classes

# 进入文件目录
cd /application/BOOT-INF/classes
# 查看项目的yaml配置文件
ls -a
# 查看文件
cat application.yaml
# 查看halo的工作空间:.halo2
cd /root
ls -a
# 退出容器
exit

6. 复制容器的配置文件到宿主机目录下

# 复制配置文件
docker cp \
halo:/application/BOOT-INF/classes/application.yaml /blog/halo

# 进入目录修改文件
cd /blog/halo

7. 查看mysql运行时的ip地址

# 可以看到最后Networks-bridge-IPAddress的值,后面填写mysql的ip地址
docker inspect mysql 

8. 修改配置文件 application.yaml

spring:
  output:
    ansi:
      enabled: detect
  r2dbc:
    url: r2dbc:pool:mysql://{ip}:3306/halo # 换成自己的mysql的ip
    username: root # 换成自己的账号
    password: 123456 # 换成自己的密码
  sql:
    init:
      mode: always
      platform: mysql # 把h2改成mysql

9. 启动容器

# 删除容器
docker rm -f halo

# 重新启动
docker run -it -d \
--name halo \
-p 8090:8090 \
-v /blog/halo:/root/.halo2 \
--restart=unless-stopped halo 

# 查看是否启动成功:可以看到html页面的源码就成功啦
wget -O- http://localhost:8090

# 如果启动失败,可以查看 /blog/halo/log 下面的日志查看原因

10. 开放端口

在阿里云ECS实例的安全组中的入网开放8090端口,虚拟机防火墙默认是关闭的,不需要操作。如果需要开启防火墙则需要放行该端口才能访问。

# 查看防火墙状态
systemctl status firewalld

# 关闭防火墙
systemctl stop firewalld

# 放行8090端口
firewall-cmd --zone=public --add-port=8090/tcp --permanent

#关闭8090端口
firewall-cmd --zone=public --remove-port=8090/tcp --permanent

 #重新载入 返回 success 代表成功
firewall-cmd --reload 

# 查看所有开放的端口
firewall-cmd --list-all

安装Nginx

alpine:是 Nginx 镜像的一个变体,基于 Alpine Linux 构建,是一个轻量级的 Linux 发行版,专注于简单、安全和资源效率,适合容器化环境。

1. 获取镜像

docker pull nginx:alpine

2. 简单方式启动容器

docker run -d -p 80:80 --name nginx nginx:alpine

3. 复制配置文件

# 把 nginx 容器的 /etc/nginx/nginx.conf 复制到到宿主机的 /blog/nginx中
docker cp nginx:/etc/nginx/nginx.conf /blog/nginx
docker cp nginx:/etc/nginx/conf.d /blog/nginx

4. 修改配置,进行反向代理

# 查看halo容器的ip地址,查看最后Networks-bridge-IPAddress的值
docker inspect halo

5. 添加相关配置

修改/blog/nginx/conf.d/default.config;在server - location /中的root /usr/share/ningx/html所在的代码块中添加

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        # 以下为5行添加内容
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 换成自己的ip和端口
        proxy_pass http://172.17.0.2:8090;# 内网地址
    }

6. 删除之前的容器

docker rm -f nginx

7. 重新启动nginx

docker run -d -p 80:80 \
--name nginx \
-v /blog/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /blog/nginx/conf.d:/etc/nginx/conf.d \
-v /blog/nginx/logs:/var/log/nginx nginx:alpine

8. 开放端口

开放阿里云安全组的入网80端口,访问公网ip就可以直接看到网站

9. 配置域名

  1. 修改配置文件
# 修改/blog/nginx/conf.d/ 的default.conf文件
server {
    listen 80;
    server_name www.example.com;  # 替换为你的域名
}
  1. 如果域名已备案成功,需要开启DNS解析
  2. DNS配置:阿里云云解析DNS-公网DNS解析-权威域名解析-新增域名-解析设置-添加记录

记录类型:A
记录值:公网IP

  1. 开启解析之后,10分钟内差不多可使用http://www.example.com访问

10. 配置HTTPS

  1. 需要获取数字证书,可在阿里数字证书管理服务-证书管理-SSL证书管理-右侧个人测试证书-创建证书,每年20次免费机会,3个月过期。也可以通过其他方式获得…
  2. 获得.pem.crt,.key文件。
  3. 新建目录
# 创建cert文件家用于存放两个文件
mkdir -p /blog/nginx/cert
  1. 将文件上传至服务器

可使用其他FTP工具:略

  1. 修改default.conf配置文件
server {
    listen 443 ssl;# 监听443,用于ssl
    server_name  www.example.com;# 自己的域名
    
    # 配置ssl
    ssl_certificate /etc/nginx/cert/www.example.com.pem;
    ssl_certificate_key /etc/nginx/cert/www.example.com.key;
    ssl_session_timeout 5m;# 会话超时时间
    ssl_protocols TLSv1.2 TLSv1.3;# 服务器tls协议版本
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;# 服务器支持的加密套件
    ssl_prefer_server_ciphers on;# 服务器与客户端协商加密套件时,优先使用服务器配置
    
    client_max_body_size 512M;# 配置客户端请求体最大值
    client_body_buffer_size 10m;# 配置请求体缓存区大小
    
    # ...其他配置
}
# 重定向
server {
    listen 80;
    server_name www.example.com;
    # 重定向所有 HTTP 请求到 HTTPS
    rewrite ^(.*) https://$server_name$1 permanent;
}
  1. 重新启动服务
# 删除容器
docker rm -f nginx

# 启动
docker run -d -p 80:80 -p 443:443 \
--name nginx \
-v /blog/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /blog/nginx/conf.d:/etc/nginx/conf.d \
-v /blog/nginx/logs:/var/log/nginx \
-v /blog/nginx/cert:/etc/nginx/cert \
nginx:alpine

  1. 开放端口
# 如果启动防火墙开启443端口
firewall-cmd --zone=public --add-port=443/tcp --permanent  
# 同时阿里云也需开放443端口,略...

  1. 访问https://www.example.com

如果启动或访问失败,查看/blog/nginx/logs/error.log进行排查

安装fail2ban

fail2ban:是一款开源的安全工具,通过监视日志文件,封禁ip、端口实现限制访问。

1. 安装

yum install - y fail2ban
  1. 目录解释
/etc/fail2ban/
- filter.d # 放置各种匹配规则,自带很多默认配置
- action.d # 当监控到某种规则之后的操作,自带很多默认配置
- jail.conf # 默认监视配置

  1. 配置ssh
# 进入目录
cd /etc/fail2ban
# fail2ban会自动读取jail.local配置文件
cp jail.conf jail.local
# 清空jail.local 写自己需要的配置

  1. jail.local配置文件
[DEFAULT]	# 默认配置,当某个监狱没有配置时使用
ignoreip = 127.0.0.1 # 忽略ip
bantime = 3600	# 封禁时间
findtime = 3600	# 多少秒钟之内
maxretry = 3	# 最大尝试次数

[sshd]
enabled = true 	# 是否启用
port = ssh 	# ssh相当于22端口
filter   = sshd	# 默认的过滤规则
logpath = /var/log/secure  # ssh的日志文件,不同系统不同,或 /var/log/auth.log
maxretry = 3	# 最大尝试次数
bantime = 86400	# 封禁时间
findtime = 86400	
banaction = iptables-multiport	# 默认的封禁ip端口行为

# 该配置文件中请自行删除 [# 注释],否则可能启动失败

  1. 启动fail2ban
# 开机自启
systemctl enable fail2ban 

# 启动服务
systemctl start fail2ban 

# 查看状态是否启动成功:最后一行Server ready 
# Ctrl + c 退出查看页面
systemctl status fail2ban 

# 重启
systemctl restart fail2ban

# 查看启动的规则:出现了sshd则配置成功
fail2ban-client status

# 查看被禁掉的ip
fail2ban-client banned

# 取消封禁
fail2ban-client set sshd unbanip 192.168.1.2

  1. 还可以自定义各种规则,请自行探索…