一、服务器基础环境
服务器总内存:1.6Gi,Swap 分区:2.0Gi
部署方式:1Panel + Docker Compose
Halo 版本:halohub/halo-pro:2.24.2
MySQL 版本:mysql:8.4.5
部署目录:
Halo:
/opt/1panel/apps/halo/haloMySQL:
/opt/1panel/apps/mysql/mysql
二、优化目标
限制 Halo 进程 JVM 堆内存,避免 Java 内存溢出占用服务器全部内存
限制 Docker 容器 CPU、物理内存资源上限,防止服务抢占系统资源
优化 MySQL 缓冲池参数,适配小内存服务器,降低数据库内存占用
三、第一次优化操作流程
# 停止Halo容器
cd /opt/1panel/apps/halo/halo
sudo docker-compose down
# 停止MySQL容器
cd /opt/1panel/apps/mysql/mysql
sudo docker-compose down2. 修改 Halo 配置文件(docker-compose.yml)
配置修改内容:
新增 JVM 堆内存参数:
JVM_OPTS=-Xms256m -Xmx450m容器资源限制:CPU 上限 0.5 核、内存上限 512M
networks:
1panel-network:
external: true
services:
halo:
image: halohub/halo-pro:2.24.2
container_name: halo-pro
restart: always
command:
- --spring.r2dbc.url=r2dbc:pool:mysql://mysql:3306/halo_85n664?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
- --spring.r2dbc.username=root
- --spring.r2dbc.password=Shitou521!
- --spring.sql.init.platform=mysql
environment:
- JVM_OPTS=-Xms256m -Xmx450m
volumes:
- ./data:/root/.halo2
ports:
- "8090:8090"
networks:
- 1panel-network
deploy:
resources:
limits:
cpus: 0.5
memory: 512M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s3. MySQL 配置优化
MySQL 容器初始docker-compose.yml未配置资源限制
进入 MySQL 配置目录,修改my.cnf,新增 InnoDB 缓冲池参数:
[mysqld]
innodb_buffer_pool_size = 384M
host-cache-size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/4. 启动容器(首次启动报错修复)
启动 MySQL 时报错yaml: line 22: did not find expected '-' indicator,修正 yml 缩进语法后正常启动
# 启动MySQL
cd /opt/1panel/apps/mysql/mysql
sudo docker-compose up -d
# 启动Halo
cd /opt/1panel/apps/halo/halo
sudo docker-compose up -d5. 优化后内存查看
# 查看整机内存
free -h
# 查看进程内存占用
ps aux --sort=-%mem | head -15MySQL 进程内存占用约 24.4%
Halo Java 进程内存占用约 18.8%
优化后整机内存占用上升至 1.2Gi,可用内存偏低,需要二次缩容优化
1. 再次停止两个服务容器
cd /opt/1panel/apps/halo/halo
sudo docker-compose down
cd /opt/1panel/apps/mysql/mysql
sudo docker-compose down
cpus: 1.0
memory: 512M
容器内存限制下调为:memory: 512M,CPU 保持 1.0核
shitou@iZ2ze6kzllv871qq54rx3lZ:/opt/1panel/apps/mysql/mysql$ cat docker-compose.yml
networks:
1panel-network:
external: true
services:
mysql:
image: mysql:8.4.5
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: Shitou521!
TZ: Asia/Shanghai
command:
- --mysql-native-password=on
volumes:
- ./data:/var/lib/mysql
- ./conf/my.cnf:/etc/my.cnf
- ./log:/var/log/mysql
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
networks:
- 1panel-network
ports:
- "3306:3306"
deploy:
resources:
limits:
cpus: 1.0
memory: 512M
3. 重新启动容器
# 先启动MySQL
cd /opt/1panel/apps/mysql/mysql
sudo docker-compose up -d
# 再启动Halo
cd /opt/1panel/apps/halo/halo
sudo docker-compose up -d五、优化关键说明
JVM 参数作用:-Xms为 JVM 初始堆内存,-Xmx为最大堆内存,需小于容器内存限制,预留系统开销
MySQL 优化要点:小内存服务器innodb_buffer_pool_size建议设置为物理内存的 50% 左右,本次设置 384M 适配 1.6G 服务器
YAML 报错踩坑:docker-compose.yml 对缩进严格敏感,不能使用 Tab 缩进、横线层级必须对齐,否则启动失败
两次优化原因:首次配置后整机可用内存不足,对 Halo 做小幅度缩容,平衡站点稳定性与服务器内存开销