在 Linux 云服务器上部署 Spring Boot 项目时,推荐配置需兼顾稳定性、性能、可维护性与安全性。以下为经过生产验证的综合推荐(适用于中等流量 Web 应用,如 API 服务、管理后台等):
✅ 一、服务器基础配置(以主流云厂商为例)
| 项目 | 推荐配置 | 说明 |
|---|---|---|
| 操作系统 | Ubuntu 22.04 LTS 或 CentOS Stream 9 / Rocky Linux 9 | LTS 版本长期支持、安全更新及时;避免使用已 EOL 的 CentOS 7/8 |
| CPU & 内存 | ≥ 2 核 CPU + 4 GB RAM(起步) 建议:4 核 + 8 GB(日活 1w+ 或含缓存/定时任务) |
Spring Boot 默认堆内存约 1/4 总内存;避免内存不足导致频繁 GC 或 OOM |
| 磁盘 | ≥ 50 GB SSD(系统盘)+ 独立数据盘(如 MySQL、日志) | SSD 提升 I/O 性能;日志/数据库分离便于备份与扩容 |
| 网络 | 绑定弹性公网 IP + 配置安全组(最小权限开放:仅 80/443/22) |
禁用 root 远程登录,强制密钥认证 |
✅ 二、Java 运行环境
- JDK 版本:✅ OpenJDK 17 LTS(推荐 Eclipse Temurin 或 Amazon Corretto)
⚠️ 避免 JDK 8(已停止免费更新)、JDK 21(新特性多但部分库兼容性待验证);Spring Boot 3.x 要求 JDK 17+。
- JVM 参数示例(
application.yml或启动脚本中配置):java -Xms512m -Xmx1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+UseStringDeduplication -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai -jar myapp.jar✅ 关键说明:
-Xms和-Xmx设为相同值(避免堆动态扩容开销)- G1 GC 适合大堆且低延迟场景(>4GB 堆建议
-XX:G1HeapRegionSize=2M) - 时区和编码显式指定,避免中文乱码/时间错误
✅ 三、部署方式(生产级推荐)
| 方式 | 推荐度 | 说明 |
|---|---|---|
| ✅ systemd 服务(最推荐) | ⭐⭐⭐⭐⭐ | 稳定、开机自启、日志集成(journalctl -u myapp)、资源限制简单 |
| Docker + docker-compose | ⭐⭐⭐⭐☆ | 适合微服务/多环境一致部署;需额外管理镜像、网络、卷;注意 JVM 容器内存感知问题(加 -XX:+UseContainerSupport) |
| Nginx 反向X_X + JAR 直接运行 | ⭐⭐⭐⭐ | 简单可靠,Nginx 处理 HTTPS、静态资源、负载均衡、限流 |
❌ java -jar 手动前台运行 |
⚠️ 不推荐 | 无进程守护、断网即退出、日志难管理 |
📌 systemd 示例(/etc/systemd/system/myapp.service):
[Unit]
Description=My Spring Boot App
After=network.target
[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Xms512m -Xmx1g -jar /opt/myapp/myapp.jar
Restart=always
RestartSec=10
Environment="JAVA_HOME=/usr/lib/jvm/temurin-17-jdk-amd64"
Environment="SPRING_PROFILES_ACTIVE=prod"
# 内存与文件限制(可选)
MemoryLimit=1.5G
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
启用:
sudo systemctl daemon-reload && sudo systemctl enable myapp && sudo systemctl start myapp
✅ 四、关键生产配置(Spring Boot 层)
在 application-prod.yml 中启用:
server:
port: 8080
tomcat:
max-connections: 500
accept-count: 100
max-http-header-size: 16384
spring:
profiles:
active: prod
datasource:
hikari:
maximum-pool-size: 20 # 根据 DB 连接数上限调整(如 MySQL max_connections=200 → 服务端留余量)
minimum-idle: 5
connection-timeout: 30000
validation-timeout: 3000
idle-timeout: 600000
max-lifetime: 1800000
logging:
level:
root: INFO
com.mycompany: DEBUG # 按需开启
file:
name: /var/log/myapp/app.log # ⚠️ 确保目录存在且 appuser 有写权限
logback:
rollingpolicy:
max-file-size: 100MB
max-history: 30
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus,loggers,threaddump
endpoint:
health:
show-details: when_authorized
✅ 五、安全加固(必须项)
- 🔐 HTTPS 强制:通过 Nginx 终止 SSL(Let’s Encrypt 免费证书),Spring Boot 中配置:
server: forward-headers-strategy: framework # 配合 Nginx X-Forwarded-* 头 spring: web: resources: add-mappings: false # 静态资源由 Nginx 处理 - 🔐 敏感配置外置:
- 数据库密码、API Key 等绝不硬编码,使用:
•--spring.config.location=file:/etc/myapp/config/(外部配置目录)
• 或环境变量:SPRING_DATASOURCE_PASSWORD=xxx
• 或 HashiCorp Vault / 云厂商 KMS(高安全要求场景)
- 数据库密码、API Key 等绝不硬编码,使用:
- 🔐 防火墙:启用
ufw(Ubuntu)或firewalld(RHEL),仅放行必要端口 - 🔐 最小权限原则:创建专用用户(如
appuser),禁用 shell 登录(/sbin/nologin)
✅ 六、监控与运维(提升可观测性)
| 工具 | 用途 | 推荐配置 |
|---|---|---|
| Prometheus + Grafana | 指标采集(JVM、HTTP、DB) | Spring Boot Actuator /actuator/prometheus 对接 |
| ELK / Loki + Grafana | 日志集中分析 | Filebeat 收集 /var/log/myapp/*.log |
| Uptime Kuma / Healthchecks | 服务健康拨测 | 监控 /actuator/health 端点 |
| 定期备份 | 数据库 + 配置文件 + JAR 包 | 使用 cron + rsync 或云快照 |
🚫 常见避坑提醒
- ❌ 不要将
application.yml放在 JAR 包内(难以修改)→ 外置配置 - ❌ 不要关闭 Actuator 安全(至少
/health开放,其他端点加 Basic Auth) - ❌ 不要在生产环境使用 H2 / HSQLDB 内存数据库
- ❌ 不要忽略
@Transactional传播行为导致事务失效 - ❌ 避免在 Controller 中直接处理大文件上传 → 用 Nginx 限流/超时控制
💡 附:一键检查清单(部署前执行)
# 1. 检查 Java 版本
java -version
# 2. 检查用户与权限
ls -ld /opt/myapp /var/log/myapp/
id -u appuser
# 3. 检查端口占用
sudo ss -tuln | grep ':8080'
# 4. 测试配置加载
java -jar myapp.jar --spring.config.location=file:/etc/myapp/config/ --dry-run
# 5. 查看 systemd 状态
sudo systemctl status myapp
sudo journalctl -u myapp -n 50 --no-pager
如需进一步定制(如:高并发优化、K8s 部署、多实例负载均衡、灰度发布方案),欢迎补充业务场景(QPS、数据规模、是否微服务等),我可为你提供针对性架构建议 👇
祝你部署顺利,零故障上线!🚀
云知识CLOUD