在 Linux 云服务器上部署 Spring Boot 项目时,推荐配置需兼顾稳定性、性能、安全性、可维护性和成本效益。以下是从生产环境角度出发的综合推荐(适用于中等流量 Web 应用,如企业后台、API 服务、中小型 SaaS):
✅ 一、服务器硬件配置(参考)
| 场景 | 推荐配置 | 说明 |
|---|---|---|
| 轻量级/开发测试/低并发(<100 QPS) | 2核 CPU / 4GB RAM / 50GB SSD | 使用 t3.medium(AWS)、ecs.c6.large(阿里云)或同规格;适合预发/内部系统 |
| 生产主力(中等并发,100–1000 QPS) | 4核 CPU / 8GB RAM / 100GB SSD | ⭐ 最常用推荐起点;可支撑 Spring Boot + MySQL + Redis 典型栈 |
| 高并发/大数据量/实时性要求高 | 8核+ / 16GB+ RAM / 多盘(系统盘+数据盘分离) | 建议启用 APM(如 SkyWalking)、JVM GC 调优、连接池精细化配置 |
💡 关键提示:
- 内存 > CPU:Spring Boot 默认堆内存占用较大(尤其启用 Actuator、WebFlux、大量 Starter),建议 RAM ≥ 8GB 起步(避免频繁 GC 和 OOM)。
- 务必使用 SSD:磁盘 I/O 影响日志写入、临时文件、JAR 解压速度(Spring Boot fat-jar 启动时会解压到
tmp目录)。- 避免共享型实例(如 AWS t3/t2、阿里云共享型),选计算优化型(c 系列)或通用型(g 系列)。
✅ 二、操作系统与基础环境
| 项目 | 推荐配置 | 说明 |
|---|---|---|
| OS | Ubuntu 22.04 LTS 或 CentOS Stream 9 / Alibaba Cloud Linux 3 | LTS 版本长期支持、生态完善、安全更新及时;避免 CentOS 7(2024年6月已 EOL) |
| JDK | OpenJDK 17(LTS) 或 JDK 21(LTS) | ✅ Spring Boot 3.x 强制要求 JDK 17+;推荐使用 Eclipse Temurin 或 Amazon Corretto(免费、生产就绪、含 JVM 优化) |
| Shell | bash 或 zsh(配合 oh-my-zsh 提升运维效率) |
— |
| 防火墙 | ufw(Ubuntu)或 firewalld(CentOS/ALinux) |
仅开放必要端口:80/443(反向X_X)、22(SSH)、9000-9010(Actuator 端点,需严格限制 IP) |
✅ 三、Spring Boot 运行时关键配置(application-prod.yml 示例)
# 1. 服务器配置
server:
port: 8080
tomcat:
max-connections: 5000
accept-count: 500
max-threads: 200
min-spare-threads: 10
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,application/json,application/javascript
# 2. JVM 启动参数(重要!见下方单独说明)
# java -Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Dfile.encoding=UTF-8 ...
# 3. 日志(异步 + 滚动 + 限制大小)
logging:
level:
root: INFO
com.yourpackage: DEBUG # 生产慎用
file:
name: /var/log/myapp/app.log
logback:
rollingpolicy:
max-file-size: 100MB
max-history: 30
# 4. Actuator(生产必须严格保护!)
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus,loggers,threaddump
endpoint:
health:
show-details: when_authorized
security:
roles: ACTUATOR_ADMIN # 配合 Spring Security 使用
✅ 四、JVM 参数推荐(运行脚本示例)
#!/bin/bash
APP_JAR="/opt/myapp/app.jar"
JAVA_HOME="/usr/lib/jvm/temurin-17-jdk-amd64"
$JAVA_HOME/bin/java
-Xms4g -Xmx4g # 堆内存:设为相等,避免动态扩容抖动
-XX:+UseG1GC # G1 垃圾收集器(JDK9+ 默认,适合大堆)
-XX:MaxGCPauseMillis=200 # 目标停顿时间(毫秒)
-XX:+ExplicitGCInvokesConcurrent # System.gc() 触发并发 GC(避免 Full GC)
-XX:+HeapDumpOnOutOfMemoryError # OOM 时自动生成堆转储
-XX:HeapDumpPath=/var/log/myapp/heap-dumps/
-Dfile.encoding=UTF-8 # 防止中文乱码
-Dspring.profiles.active=prod
-jar $APP_JAR
🔍 调优建议:
- 初始堆(
-Xms)= 最大堆(-Xmx),避免运行时扩容开销;- 堆内存 ≤ 物理 RAM 的 75%(预留内存给 OS、Native 内存、Direct Buffer);
- 使用
jstat -gc <pid>和jmap -histo定期监控 GC 行为。
✅ 五、部署与运维最佳实践
| 类别 | 推荐方案 | 说明 |
|---|---|---|
| 进程管理 | ✅ systemd(强烈推荐) | 替代 nohup/screen;支持开机自启、自动重启、日志集成(journalctl -u myapp) |
| 反向X_X | ✅ Nginx(非 Apache) | 静态资源托管、HTTPS 终结、负载均衡、限流、请求头过滤;禁用 server_tokens |
| HTTPS | ✅ Let's Encrypt(certbot)自动续签 | 免费、可信、自动化;Nginx 中配置 ssl_certificate |
| 日志集中 | ✅ Filebeat → ELK / Loki+Grafana | 避免单机日志丢失;结构化日志(Logback JSON encoder)更易分析 |
| 监控告警 | ✅ Prometheus + Grafana + Spring Boot Actuator /actuator/prometheus |
关键指标:jvm_memory_used_bytes, http_server_requests_seconds_count, process_cpu_usage |
| 备份策略 | ✅ 数据库定时备份(mysqldump/pg_dump)+ 应用配置 Git 管理 + JAR 包版本归档 |
不备份 /tmp、/logs 等临时目录 |
✅ 六、安全加固(必做项)
- ✅ SSH:禁用密码登录,仅用密钥;修改默认端口;设置
fail2ban - ✅ Spring Boot:关闭
env、beans、configprops等敏感 Actuator 端点;启用spring.security.user.name/password或 OAuth2 - ✅ 数据库:应用账号最小权限(仅 CRUD 所需表);禁止远程 root 登录;MySQL 启用
skip-networking或绑定127.0.0.1 - ✅ 文件权限:
/opt/myapp/所有者为appuser:appgroup,JAR 权限644,启动脚本755 - ✅ 定期更新:
apt update && apt upgrade -y(Ubuntu)或dnf update -y(ALinux/CentOS)
🚫 避坑清单(常见错误)
| 错误做法 | 正确做法 |
|---|---|
❌ 直接用 java -jar app.jar 前台运行 |
✅ 用 systemd 守护,防止终端断开进程退出 |
❌ application.yml 中硬编码数据库密码 |
✅ 使用 spring.cloud.config / vault / 或环境变量 SPRING_DATASOURCE_PASSWORD |
| ❌ 日志输出到 stdout 且不滚动 | ✅ 配置 Logback RollingFileAppender,限制大小与保留天数 |
❌ 不配置 server.tomcat.max-connections |
✅ 防止连接耗尽(尤其 Nginx upstream 未配 max_fails 时) |
❌ 忽略 spring.servlet.context-path 导致静态资源 404 |
✅ 若使用上下文路径(如 /api),确保 Nginx location 与之匹配 |
✅ 附:一键部署脚本骨架(供参考)
# deploy.sh(需 root 或 sudo 权限)
APP_USER="myapp"
APP_HOME="/opt/myapp"
JAR_NAME="app.jar"
# 创建用户 & 目录
useradd -r -s /bin/false $APP_USER
mkdir -p $APP_HOME/{logs,heap-dumps}
chown -R $APP_USER:$APP_USER $APP_HOME
# 上传 JAR & 配置
# scp app.jar config/ $APP_USER@$SERVER:$APP_HOME/
# 注册 systemd 服务(/etc/systemd/system/myapp.service)
# ...(内容见上方 JVM 启动命令)
systemctl daemon-reload
systemctl enable myapp
systemctl start myapp
journalctl -u myapp -f # 查看实时日志
如需我为你:
- ✨ 生成完整的
systemd服务文件模板 - ✨ 输出 Nginx 反向X_X + HTTPS 完整配置
- ✨ 提供 Logback JSON 日志配置 + Filebeat 示例
- ✨ 分析你的
jstatGC 日志给出调优建议 - ✨ 定制化 Docker + Docker Compose 部署方案
欢迎随时告诉我你的具体场景(如:QPS 预估、是否用 MySQL/Redis、是否已有 Nginx、是否需集群),我可以为你精准定制 ✅
祝你部署顺利,生产稳定!🚀
CLOUD云计算