后台地址:https://lijilong.com.cn/admin
服务器信息
服务器镜像
本文使用的是阿里云服务器,使用Halo 建站工具镜像创建服务器
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
-
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端口才能访问。
添加归档页面
默认没有归档页面,需要自行添加。
-
在【页面】中新建【归档】页面,并将别名设置为【archives】,然后发布此页面。
-
在【菜单】中添加【归档】页面。
-
此时页面上就有【归档】页面了。
开启HTTPS访问
- 证书上传位置可以随意,这里路径配置了文件映射:/opt/halo/nginx/ssl/ –>/etc/nginx/ssl
- 如果证书过期记得及时更换
- 需要有一个自己的域名,并开启了域名映射到服务器
- 上传SSL证书到【/opt/halo/nginx/ssl/】目录下,并确保拥有访问权限
- 修改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访问了
修改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主题优化
评论区