在轻量服务器(如腾讯云轻量应用服务器、阿里云共享型实例,通常 1C2G 或 2C4G)上同时运行 MySQL、Redis 和 Java 应用(JAR包),关键在于 资源合理分配 + 轻量级配置 + 启动管理优化。以下是经过生产验证的精简、安全、可维护的实践方案:
✅ 前提检查(务必执行)
# 查看资源(重点关注内存和磁盘)
free -h # 确保可用内存 ≥ 1.2GB(MySQL+Redis+Java最低需求)
df -h # 确保剩余磁盘 ≥ 5GB
lscpu # 确认 CPU 核心数(1核够用,但2核更稳)
⚠️ 若为 1C1G(如腾讯云入门款):不建议强装三者共存(OOM风险高),推荐:
- 用 SQLite 替代 MySQL(单机小应用),或
- 将 MySQL/Redis 迁至云数据库(如腾讯云 CVM 共享型或 Serverless DB),本机只跑 Java 应用(最稳妥)
✅ 推荐方案:容器化(Docker)—— 最轻量、易隔离、易维护(首选!)
✅ 优势:避免依赖冲突、内存可控、一键启停、日志分离
📦 所需空间 < 300MB,内存占用可精细限制
1️⃣ 安装 Docker(轻量版)
# Ubuntu/Debian(其他系统见 https://docs.docker.com/engine/install/)
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker # 刷新组权限(或重新登录)
2️⃣ 创建 docker-compose.yml(统一编排)
# /opt/app/docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:8.0-oracle
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: your_strong_root_pass
MYSQL_DATABASE: myapp
MYSQL_USER: appuser
MYSQL_PASSWORD: app_pass_123
command: --max-connections=50 --innodb-buffer-pool-size=64M --skip-log-bin
volumes:
- ./mysql-data:/var/lib/mysql
- ./mysql-conf.cnf:/etc/mysql/conf.d/custom.cnf:ro
networks: [app-net]
mem_limit: 256m
cpus: "0.5"
redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --maxmemory 64mb --maxmemory-policy allkeys-lru
volumes:
- ./redis-data:/data
networks: [app-net]
mem_limit: 96m
cpus: "0.25"
java-app:
image: openjdk:17-jre-slim
restart: unless-stopped
depends_on: [mysql, redis]
environment:
SPRING_PROFILES_ACTIVE: prod
DB_URL: jdbc:mysql://mysql:3306/myapp?useSSL=false&serverTimezone=Asia/Shanghai
REDIS_HOST: redis
REDIS_PORT: "6379"
volumes:
- ./app.jar:/app.jar
- ./application-prod.yml:/app-config/application.yml:ro
- ./logs:/app-logs
command: java -Xms128m -Xmx384m -jar /app.jar --spring.config.location=file:/app-config/
networks: [app-net]
mem_limit: 512m
cpus: "0.75"
ports: ["8080:8080"]
networks:
app-net:
driver: bridge
3️⃣ 配置文件(最小化)
-
./mysql-conf.cnf(减少 MySQL 内存占用):[mysqld] skip-host-cache skip-name-resolve innodb_buffer_pool_size = 64M key_buffer_size = 16M max_connections = 50 table_open_cache = 50 sort_buffer_size = 256K read_buffer_size = 256K -
./application-prod.yml(Spring Boot 示例):spring: datasource: url: ${DB_URL} username: ${DB_USER:appuser} password: ${DB_PASSWORD:app_pass_123} redis: host: ${REDIS_HOST:redis} port: ${REDIS_PORT:6379} logging: file: name: /app-logs/app.log
4️⃣ 一键启动 & 管理
cd /opt/app
docker-compose up -d # 后台启动
docker-compose logs -f java-app # 查看 Java 日志
docker-compose ps # 查看状态
docker-compose down # 停止全部
✅ 内存占用实测(2C4G 轻量服务器):
- MySQL:~180MB
- Redis:~15MB
- Java App(Spring Boot):~400MB(含 JVM)
→ 总内存占用 ≈ 600MB,系统预留充足缓冲。
✅ 替代方案:纯二进制安装(无 Docker,适合极简环境)
⚠️ 仅推荐给熟悉 Linux 系统调优的用户;需手动管理进程、端口、内存
| 组件 | 安装方式 | 关键优化点 |
|---|---|---|
| MySQL | apt install mysql-server |
编辑 /etc/mysql/mysql.conf.d/mysqld.cnf:innodb_buffer_pool_size = 64M,禁用 performance_schema |
| Redis | apt install redis-server |
编辑 /etc/redis/redis.conf:maxmemory 64mb,maxmemory-policy allkeys-lru,supervised systemd |
| Java | apt install openjdk-17-jre |
启动时加 JVM 参数:java -Xms128m -Xmx384m -jar app.jar |
📌 进程管理(systemd)示例(以 Java 应用为例):
sudo tee /etc/systemd/system/myapp.service <<'EOF'
[Unit]
Description=My Java Application
After=network.target mysql.service redis-server.service
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Xms128m -Xmx384m -jar /opt/myapp/app.jar
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
✅ 必做优化项(提升稳定性)
-
Swap 交换分区(防 OOM)(1C2G 必开):
sudo fallocate -l 1G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab -
防火墙放行端口:
sudo ufw allow 8080 # Java 应用 sudo ufw allow 3306 # MySQL(仅内网访问!生产环境禁止开放公网) sudo ufw allow 6379 # Redis(同上!务必 bind 127.0.0.1) sudo ufw enable -
MySQL/Redis 安全加固:
-- MySQL:删除匿名用户,限制 root 远程登录 DELETE FROM mysql.user WHERE User=''; DROP USER 'root'@'%'; FLUSH PRIVILEGES;# Redis:编辑 /etc/redis/redis.conf bind 127.0.0.1 ::1 protected-mode yes requirepass your_strong_redis_password
❌ 绝对避免的坑
- 🔴 将 MySQL/Redis 暴露到公网(极易被勒索或X_X)
- 🔴 不设 JVM 内存上限(
-Xmx缺失 → 占满内存崩溃) - 🔴 在 1C1G 上硬跑三者(即使调优也极易因瞬时 GC/IO 触发 OOM)
- 🔴 使用默认配置(MySQL 默认 buffer_pool_size=128MB+,Redis 默认无内存限制)
✅ 最终验证命令
# 检查服务状态
systemctl is-active mysql redis-server && echo "DB OK"
curl -s http://localhost:8080/actuator/health | jq .status # Spring Boot 健康检查
# 检查内存是否健康
free -h | grep "Mem|Swap"
docker stats --no-stream # Docker 用户
需要我为你生成:
- ✅ 完整的
docker-compose.yml+ 配置文件压缩包? - ✅ 适配 CentOS 7/8 的二进制安装脚本?
- ✅ Spring Boot 应用连接 MySQL+Redis 的 starter 配置?
欢迎随时告诉我你的具体环境(OS/版本/Java 版本/应用框架),我可定制交付 👇
秒懂云