轻量服务器上如何同时安装并运行MySQL、Redis和Java应用(JAR包)?

在轻量服务器(如腾讯云轻量应用服务器、阿里云共享型实例,通常 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.cnfinnodb_buffer_pool_size = 64M,禁用 performance_schema
Redis apt install redis-server 编辑 /etc/redis/redis.confmaxmemory 64mbmaxmemory-policy allkeys-lrusupervised 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

✅ 必做优化项(提升稳定性)

  1. 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
  2. 防火墙放行端口

    sudo ufw allow 8080    # Java 应用
    sudo ufw allow 3306    # MySQL(仅内网访问!生产环境禁止开放公网)
    sudo ufw allow 6379    # Redis(同上!务必 bind 127.0.0.1)
    sudo ufw enable
  3. 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 版本/应用框架),我可定制交付 👇
未经允许不得转载:秒懂云 » 轻量服务器上如何同时安装并运行MySQL、Redis和Java应用(JAR包)?