直接给结论:对于生产环境,最低建议 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,稳定性略逊一筹(但在云厂商提供的镜像中差异已很小)。
- 适合人群:大多数开发者,尤其是新手,文档多,坑少。
- 优势:社区资源极其丰富,遇到问题搜 StackOverflow 答案最多。软件源更新快,安装 JDK/MySQL/Redis 方便(
- 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. 必须做的优化项
-
Swap 分区:
- 即使你有 2G 内存,也建议划分 2G 的 Swap。
- 作用:当内存瞬间飙高时,Swap 作为缓冲区,避免进程直接被 Kill(OOM Killer)。虽然 Swap 慢,但比崩了好。
- 设置
vm.swappiness=10,让系统尽量不用 Swap,除非万不得已。
-
JVM 参数调优:
- 务必设置
-Xms等于-Xmx,避免运行时频繁分配内存导致的 GC 停顿。 - 例如:
-Xms512m -Xmx512m -XX:+UseG1GC
- 务必设置
-
MySQL 参数调优:
max_connections: 设为 100-200(低配服务器别开太大,每个连接都占内存)。innodb_buffer_pool_size: 设为总内存的 25%-30%。
-
安全组/防火墙:
- 只开放 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。
- 核心原则:内存不够,参数来凑;网络不通,防火墙来补;业务重要,上云托管。
云技术博客