努力
加油

CentOS或Ubuntu系统下部署Java+MySQL+Redis三件套,最低硬件配置建议?

直接给结论:对于生产环境,最低建议 2核4G(2C4G);如果是个人学习、测试或极低流量的小项目,极限压缩到 1核2G(1C2G)也是能跑通的,但体验会有些“紧”。

千万别碰 1核1G,除非你只是用来跑个 Hello World。在那种配置下,Java 的 JVM 启动可能就要吃掉大半内存,MySQL 稍微查两下就 Swap 交换,Redis 如果数据量稍大一点就会 OOM(内存溢出),整个系统会卡成 PPT。

下面拆解一下为什么这么配,以及各组件在低配下的“生存法则”。

1. 内存是核心瓶颈(JVM vs OS vs Cache)

Linux 内核本身需要占用 100MB-300MB 左右的常驻内存。剩下的才是给你用的。

  • Java (Spring Boot/Boot-like):
    • 默认情况下,JVM 的最大堆内存(Xmx)通常设置为物理内存的 1/4。
    • 在 2G 内存机器上,如果不调整参数,JVM 可能尝试申请 512MB 堆,加上非堆内存(Metaspace, Code Cache 等),起步就是 800MB-1GB。
    • 关键点:你必须手动指定 -Xms 和 -Xmx。比如设为 512m 或 768m,防止 JVM 动态扩容时把系统撑爆。
  • MySQL:
    • MySQL 是个“吃内存大户”,尤其是 InnoDB 缓冲池(innodb_buffer_pool_size)。
    • 在 2G 内存下,innodb_buffer_pool_size 建议设为 256M – 512M。设大了容易 OOM,设小了磁盘 IO 压力大。
    • 如果你用 Docker 部署,记得限制容器的内存上限,否则 MySQL 容器可能会因为没有限制而拖垮宿主机。
  • Redis:
    • Redis 是纯内存数据库。
    • 如果只是存 Session、简单的 Key-Value 缓存,数据量不大,2G 内存完全够用。
    • 注意开启 maxmemory-policy allkeys-lru,防止内存打满导致服务不可用。

2. CPU 决定并发处理能力

  • 1核 (1C):
    • Java 是多线程应用,Tomcat/Jetty 处理请求时,一个请求进来可能涉及多个线程协作。1核在高并发下(哪怕只有几十个 QPS)容易出现线程排队,响应延迟飙升。
    • MySQL 在处理复杂查询、排序、Join 时也会单核瓶颈明显。
    • 适用场景:个人博客、内部工具、日均 PV < 1000 的网站。
  • 2核 (2C):
    • 这是真正的“入门级生产配置”。可以较好地应对并发的 Java 线程调度,MySQL 也能同时处理几个连接而不怎么卡顿。
    • 适用场景:小型企业官网、API 接口服务、日 PV 几千到几万的项目。

3. 操作系统选择:CentOS vs Ubuntu

既然提到了这两个,简单说下在低配下的差异:

  • Ubuntu (推荐 20.04 LTS 或 22.04 LTS):
    • 优势:社区资源极其丰富,遇到问题搜 StackOverflow 答案最多。软件源更新快,安装 JDK/MySQL/Redis 方便(apt install)。
    • 劣势:相对 CentOS,稳定性略逊一筹(但在云厂商提供的镜像中差异已很小)。
    • 适合人群:大多数开发者,尤其是新手,文档多,坑少。
  • CentOS (推荐 CentOS Stream 9 或 AlmaLinux/Rocky Linux):
    • 注意:原生的 CentOS 7 已经 EOL(停止维护),CentOS 8 也停了。现在国内云服务器默认多为 CentOS Stream 或替换版。
    • 优势:企业级稳定,安全性高,很多老教程基于此。
    • 劣势:新软件版本可能滞后,安装某些最新版软件可能需要加第三方源。
    • 适合人群:运维背景强、追求极致稳定、有遗留系统迁移需求。

结论:对于新项目,首选 Ubuntu 22.04 LTS。省心,资料多。

4. 实际部署建议(避坑指南)

A. 使用 Docker Compose 一键部署(最推荐)

不要直接在裸机上装三个独立的服务,管理麻烦且容易冲突。用 Docker Compose 是最佳实践。

version: '3.8'
services:
  app:
    image: openjdk:17-slim # 或者你的自定义镜像
    ports:
      - "8080:8080"
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb
      - SPRING_REDIS_HOST=redis
    depends_on:
      - db
      - redis
    deploy:
      resources:
        limits:
          memory: 1G # 限制 Java 最大内存,别让它抢光
    command: java -Xms512m -Xmx512m -jar /app.jar

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: mydb
    volumes:
      - ./mysql_data:/var/lib/mysql
    deploy:
      resources:
        limits:
          memory: 1G # 限制 MySQL 内存
    command: --innodb-buffer-pool-size=256M --max-connections=100

  redis:
    image: redis:7-alpine
    volumes:
      - ./redis_data:/data
    deploy:
      resources:
        limits:
          memory: 256M # Redis 不需要太多内存做缓存

B. 必须做的优化项

  1. Swap 分区:

    • 即使你有 2G 内存,也建议划分 2G 的 Swap。
    • 作用:当内存瞬间飙高时,Swap 作为缓冲区,避免进程直接被 Kill(OOM Killer)。虽然 Swap 慢,但比崩了好。
    • 设置 vm.swappiness=10,让系统尽量不用 Swap,除非万不得已。
  2. JVM 参数调优:

    • 务必设置 -Xms 等于 -Xmx,避免运行时频繁分配内存导致的 GC 停顿。
    • 例如:-Xms512m -Xmx512m -XX:+UseG1GC
  3. MySQL 参数调优:

    • max_connections: 设为 100-200(低配服务器别开太大,每个连接都占内存)。
    • innodb_buffer_pool_size: 设为总内存的 25%-30%。
  4. 安全组/防火墙:

    • 只开放 22 (SSH), 80/443 (Web)。
    • 严禁 直接暴露 MySQL (3306) 和 Redis (6379) 端口到公网!这是被扫库爆破的重灾区。通过内网通信或 Nginx 反向XX访问。

5. 云厂商产品小贴士(国内环境)

  • 轻量应用服务器 (Lighthouse/Tencent Cloud Lighthouse):
    • 如果你预算极低,买这种“盒子”式服务器,往往 2C2G 一年才几百块,带宽共享但够用。适合个人项目。
  • ECS/CVM 标准型:
    • 性能更稳定,IOPS 更高。如果预算允许,选标准型而非突发性能型(t5/t6/cvm-burst),因为突发型有 CPU 积分限制,一旦积分用完,CPU 会被限速到 10%,你的网站会直接假死。
  • 云数据库 RDS + 云缓存 Redis:
    • 如果预算稍宽裕(比如月付 100+),强烈建议把 MySQL 和 Redis 单独买云服务。
    • 理由:它们自动备份、高可用、无需你操心内存泄漏、重启恢复等问题。你自己部署在 2G 服务器上,一旦 MySQL 崩溃,你可能要半夜起来救火,而云 RDS 基本不用管。

总结

  • 最低可行配置:1核2G(仅限学习/极小流量),需精心调优 JVM 和 MySQL 参数,必须开 Swap。
  • 推荐起步配置:2核4G(性价比最高,能跑大部分中小型项目,有余量应对突发流量)。
  • 系统:Ubuntu 22.04 LTS。
  • 部署方式:Docker Compose。
  • 核心原则:内存不够,参数来凑;网络不通,防火墙来补;业务重要,上云托管。