侧边栏壁纸
博主头像
人生短短几个秋

行动起来,活在当下

  • 累计撰写 45 篇文章
  • 累计创建 20 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

开启博客之旅

人生短短几个秋
2025-01-24 / 0 评论 / 0 点赞 / 112 阅读 / 0 字

博客地址:https://lijilong.com.cn/

后台地址:https://lijilong.com.cn/admin

服务器信息

服务器镜像

本文使用的是阿里云服务器,使用Halo 建站工具镜像创建服务器

image-20250119211519748

Docker Compose

Docker Compose的配置文件:/opt/halo/docker-compose.yml

services:
  # Halo 服务配置
  halo:
    # 使用的 Halo 镜像
    image: registry.fit2cloud.com/halo/halo-pro:2.20
    # 容器重启策略,始终重启(即使容器异常退出)
    restart: always
    # 依赖的服务,当 halodb 的健康检查通过后再启动 Halo
    depends_on:
      halodb:
        condition: service_healthy  # 条件:依赖服务健康检查通过
    # 使用的自定义网络
    networks:
      halo_network:
    # 挂载宿主机目录到容器中,保存 Halo 配置和数据
    volumes:
      - ./halo2:/root/.halo2  # 宿主机的 halo2 文件夹挂载到容器的 /root/.halo2
    # 配置端口映射
    ports:
      - "127.0.0.1:8090:8090"  # 将宿主机 127.0.0.1:8090 端口映射到容器的 8090 端口
    # 健康检查配置,确保服务运行正常
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]  # 检查服务是否可用
      interval: 30s  # 健康检查时间间隔
      timeout: 5s    # 健康检查超时时间
      retries: 5     # 健康检查失败的重试次数
      start_period: 30s  # 容器启动后等待的时间,避免误判
    # 环境变量配置
    environment:
      # 配置 JVM 参数,默认为 -Xmx256m -Xms256m,可根据实际需求调整
      - JVM_OPTS=-Xmx512m -Xms512m
    # 启动时的命令行参数
    command:
      # 配置 PostgreSQL 数据库连接信息
      - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
      - --spring.r2dbc.username=halo
      # 数据库密码,与下方 POSTGRES_PASSWORD 保持一致
      - --spring.r2dbc.password=dFlUZyaTtKyf4S8t
      # 数据库平台初始化配置
      - --spring.sql.init.platform=postgresql
      # 配置外部访问地址,改为实际的访问地址
      - --halo.external-url=http://localhost:8090/

  # 数据库服务配置
  halodb:
    # 使用的 PostgreSQL 镜像版本
    image: postgres:15.4
    # 容器重启策略,始终重启
    restart: always
    # 使用的自定义网络
    networks:
      halo_network:
    # 挂载宿主机目录到容器中,保存数据库数据
    volumes:
      - ./db:/var/lib/postgresql/data  # 宿主机的 db 文件夹挂载到容器的 /var/lib/postgresql/data
    # 健康检查配置,确保数据库服务正常运行
    healthcheck:
      test: [ "CMD", "pg_isready" ]  # 检查 PostgreSQL 是否准备好
      interval: 10s  # 健康检查时间间隔
      timeout: 5s    # 健康检查超时时间
      retries: 5     # 健康检查失败的重试次数
    # 数据库环境变量配置
    environment:
      - POSTGRES_PASSWORD=dFlUZyaTtKyf4S8t  # PostgreSQL 数据库的密码
      - POSTGRES_USER=halo                  # PostgreSQL 数据库的用户名
      - POSTGRES_DB=halo                    # PostgreSQL 使用的数据库名称
      - PGUSER=halo                         # PostgreSQL 用户名(环境变量)

  # Nginx 服务配置
  nginx:
    # 使用的 Nginx 镜像
    image: nginx
    # 容器重启策略,始终重启
    restart: always
    # 挂载宿主机目录到容器中,保存配置文件和日志
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d  # Nginx 配置文件挂载路径
      - ./nginx/ssl:/etc/nginx/ssl        # Nginx SSL 证书挂载路径
      - ./nginx/log:/var/log/nginx        # Nginx 日志挂载路径
    # 使用宿主机网络模式,直接与宿主机共享网络
    network_mode: host

# 配置自定义网络
networks:
  halo_network:  # 自定义网络名称,用于服务间的通信

Docker Compose运行了三个服务:Halo、nginx、postgres

image-20250119211840491

  • Halo安装目录:/opt/halo/halo2

  • nginx安装目录:/opt/halo/nginx

    nginx的配置文件,/opt/halo/nginx/conf.d/halo.conf

    upstream halo {
      server 127.0.0.1:8090;  # 配置名为 "halo" 的上游服务器,指向本地的 8090 端口,通常是 Halo 应用程序的监听端口。
    }
    
    server {
        listen 80 default_server;  # 配置 Nginx 监听 80 端口,设置为默认的 HTTP 服务器。
        listen [::]:80 default_server;  # 同上,但是支持 IPv6 地址。
        
        # 配置代理头部,转发给后端服务器
        proxy_set_header Host $host;  # 设置 "Host" 请求头,将客户端的 Host 头部传递给后端服务。
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 将客户端的 IP 地址(经过代理的 IP 地址链)添加到 "X-Forwarded-For" 请求头。
        proxy_set_header X-Forwarded-Host $server_name;  # 设置 "X-Forwarded-Host" 请求头,传递服务器名称。
        proxy_set_header X-Real-IP $remote_addr;  # 将客户端的真实 IP 地址传递给后端服务器。
        
        proxy_http_version 1.1;  # 强制使用 HTTP/1.1 协议版本与后端服务器通信。对于代理传递的请求,HTTP/1.1 支持持久连接等特性。
        
        # 升级 WebSocket 连接所需的设置
        proxy_set_header Upgrade $http_upgrade;  # 转发 WebSocket 的 "Upgrade" 请求头。
        proxy_set_header Connection $http_connection;  # 转发 WebSocket 的 "Connection" 请求头。
    
        client_max_body_size 1024m;  # 设置客户端请求的最大体积为 1024MB,如果请求体积超过此限制,Nginx 会拒绝请求。
    
        location / {
          proxy_pass http://halo;  # 请求转发到名为 "halo" 的上游服务器(127.0.0.1:8090)。
          proxy_set_header HOST $host;  # 转发客户端请求的 Host 请求头。
          proxy_set_header X-Forwarded-Proto $scheme;  # 设置 "X-Forwarded-Proto" 请求头,传递当前请求的协议(http 或 https)。
          proxy_set_header X-Real-IP $remote_addr;  # 转发客户端的真实 IP 地址。
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 转发客户端的代理链地址。
        }
    
        # 以下 SSL 配置被注释掉了,但它们的作用是启用 HTTPS 配置
        # listen 443 ssl http2 default_server;  # 配置 Nginx 监听 443 端口并启用 SSL 和 HTTP/2。
        # listen [::]:443 ssl http2 default_server;  # 同上,支持 IPv6 地址。
        # if ($scheme = http) {  # 如果请求是 HTTP(非 HTTPS)
        #     return 301 https://$host$request_uri;  # 将 HTTP 请求重定向到 HTTPS。
        # }
        # ssl_certificate /etc/nginx/ssl/lijilong.com.cn.pem;  # 配置 SSL 证书的完整链文件。
        # ssl_certificate_key /etc/nginx/ssl/lijilong.com.cn.key;  # 配置 SSL 证书的私钥文件。
    
        ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;  # 启用 SSL/TLS 协议的版本,确保支持 TLS 1.0 到 TLS 1.3。
        ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED;  # 配置 SSL 使用的密码套件,确保加密的安全性。
        ssl_prefer_server_ciphers on;  # 启用服务器优先选择密码套件,增强安全性。
        ssl_session_cache shared:SSL:10m;  # 配置 SSL 会话缓存,10MB 大小,提高 HTTPS 性能。
        ssl_session_timeout 10m;  # 设置 SSL 会话缓存的超时时间为 10 分钟。
        error_page 497 https://$host$request_uri;  # 将 HTTP 请求转发为 HTTPS(当客户端直接访问 HTTP 时)。
        
        # 转发 HTTPS 请求头
        proxy_set_header X-Forwarded-Proto https;  # 设置 "X-Forwarded-Proto" 请求头为 https,表明这是 HTTPS 请求。
        
        # 添加 HTTP Strict Transport Security (HSTS) 头部,增强安全性
        add_header Strict-Transport-Security "max-age=31536000";  # 设置 HSTS 策略,要求浏览器强制使用 HTTPS,最大缓存时间为 1 年(31536000 秒)。
    }
    
    

Halo

访问HALO

系统启动后即可访问halo,直接访问服务器的80端口即可访问,如http://x.x.x.x:80

halo默认端口是8090,但是这里的halo是docker运行的,没有映射服务器的8090端口到镜像的8090端口,所以不能通过服务器IP+8090端口直接访问halo,同时因为nginx中配置了80端口监听,转发到了8090端口,所以实际上只输服务器IP就可以访问halo了,另外阿里云服务器需要在安全组中放开80端口才能访问。

添加归档页面

默认没有归档页面,需要自行添加。

  1. 在【页面】中新建【归档】页面,并将别名设置为【archives】,然后发布此页面。

    image-20250125142442879

  2. 在【菜单】中添加【归档】页面。

    image-20250125142556924

  3. 此时页面上就有【归档】页面了。

    image-20250125142658406

开启HTTPS访问

  1. 证书上传位置可以随意,这里路径配置了文件映射:/opt/halo/nginx/ssl/ –>/etc/nginx/ssl
  2. 如果证书过期记得及时更换
  1. 需要有一个自己的域名,并开启了域名映射到服务器
  2. 上传SSL证书到【/opt/halo/nginx/ssl/】目录下,并确保拥有访问权限
  3. 修改nginx配置文件,(/opt/halo/nginx/conf.d/halo.conf)添加以下内容
    # 以下 SSL 配置被注释掉了,但它们的作用是启用 HTTPS 配置
    listen 443 ssl http2 default_server;  # 配置 Nginx 监听 443 端口并启用 SSL 和 HTTP/2。
    listen [::]:443 ssl http2 default_server;  # 同上,支持 IPv6 地址。
    if ($scheme = http) {  # 如果请求是 HTTP(非 HTTPS)
        return 301 https://$host$request_uri;  # 将 HTTP 请求重定向到 HTTPS。
    }
    ssl_certificate /etc/nginx/ssl/lijilong.com.cn.pem;  # 配置 SSL 证书的完整链文件。
    ssl_certificate_key /etc/nginx/ssl/lijilong.com.cn.key;  # 配置 SSL 证书的私钥文件。
    
    ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;  # 启用 SSL/TLS 协议的版本,确保支持 TLS 1.0 到 TLS 1.3。
    ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED;  # 配置 SSL 使用的密码套件,确保加密的安全性。
    ssl_prefer_server_ciphers on;  # 启用服务器优先选择密码套件,增强安全性。
    ssl_session_cache shared:SSL:10m;  # 配置 SSL 会话缓存,10MB 大小,提高 HTTPS 性能。
    ssl_session_timeout 10m;  # 设置 SSL 会话缓存的超时时间为 10 分钟。
    error_page 497 https://$host$request_uri;  # 将 HTTP 请求转发为 HTTPS(当客户端直接访问 HTTP 时)。
    
    # 转发 HTTPS 请求头
    proxy_set_header X-Forwarded-Proto https;  # 设置 "X-Forwarded-Proto" 请求头为 https,表明这是 HTTPS 请求。
    
    # 添加 HTTP Strict Transport Security (HSTS) 头部,增强安全性
    add_header Strict-Transport-Security "max-age=31536000";  # 设置 HSTS 策略,要求浏览器强制使用 HTTPS,最大缓存时间为 1 年(31536000 秒)。

然后重启nginx

docker restart halo-nginx-1

等待重启完成就可以使用HTTPS访问了

image-20250119213149640

修改halo的外部访问地址:

通过"com.docker.compose.project.config_files": "/opt/halo/docker-compose.yml",可以知道是通过Docker Compose 启动的,配置文件在/opt/halo/docker-compose.yml,修改其中的--halo.external-url=http://localhost:8090/为想要的地址,如--halo.external-url=https://lijilong.com.cn/然后重启halo。

需要通过compose重启才能生效:

# 停止并移除 docker-compose.yml 定义的所有容器,但不会删除数据卷和网络。
docker-compose down

# 重新启动服务,并后台运行
docker-compose up -d

# 检查服务状态
docker-compose ps

原始的文件内容如下:

services:
  halo:
    image: registry.fit2cloud.com/halo/halo-pro:2.20
    restart: always
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      halo_network:
    volumes:
      - ./halo2:/root/.halo2
    ports:
      - "127.0.0.1:8090:8090"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s
    environment:
      # JVM 参数,默认为 -Xmx256m -Xms256m,可以根据实际情况做调整,置空表示不添加 JVM 参数
      - JVM_OPTS=-Xmx512m -Xms512m
    command:
      - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
      - --spring.r2dbc.username=halo
      # PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
      - --spring.r2dbc.password=dFlUZyaTtKyf4S8t
      - --spring.sql.init.platform=postgresql
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=http://localhost:8090/
  halodb:
    image: postgres:15.4
    restart: always
    networks:
      halo_network:
    volumes:
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: [ "CMD", "pg_isready" ]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_PASSWORD=dFlUZyaTtKyf4S8t
      - POSTGRES_USER=halo
      - POSTGRES_DB=halo
      - PGUSER=halo
  nginx:
    image: nginx
    restart: always
    volumes:
     - ./nginx/conf.d:/etc/nginx/conf.d
     - ./nginx/ssl:/etc/nginx/ssl
     - ./nginx/log:/var/log/nginx
    network_mode: host

networks:
  halo_network:

halo主页跳转地址为http://localhost:8090

这个需要修改/opt/halo/docker-compose.yml文件下的halo.external-url

# 外部访问地址,请根据实际需要修改(注意,这里就是三个横线)
- --halo.external-url=http://localhost:8090/

然后使用Docker compose重启,启动完成后主页地址就改好了

一定要是Docker compose的方式重启,如果直接Docker restart的话是不生效的

# 停止并移除 docker-compose.yml 定义的所有容器,但不会删除数据卷和网络。
docker-compose down

# 重新启动服务,并后台运行
docker-compose up -d

# 检查服务状态
docker-compose ps

后续请查看这篇文件进行主题优化:Halo主题优化

0

评论区