在 Linux 云服务器上部署 Spring Boot 项目时,推荐配置需兼顾稳定性、性能、可维护性与安全性。以下是一套经过生产验证的综合推荐(适用于中等流量 Web 应用,如企业后台、API 服务等):
✅ 一、服务器基础配置(云厂商选型参考)
| 项目 | 推荐配置 | 说明 |
|---|---|---|
| 操作系统 | Ubuntu 22.04 LTS / CentOS Stream 9 / AlmaLinux 9 | 优先选长期支持(LTS)版本,安全更新及时;避免 CentOS 7/8(已 EOL) |
| CPU & 内存 | ≥ 2核 CPU + 4GB RAM(起步) 建议:4核8GB(日活 1w+ 或含缓存/定时任务) |
Spring Boot 默认堆内存 -Xms2g -Xmx2g 需预留系统内存(OS + JVM + 其他进程) |
| 磁盘 | ≥ 50GB SSD(推荐 NVMe) | 系统盘 + 日志存储;若用 Elasticsearch/MongoDB 等,需额外数据盘 |
| 网络 | 绑定固定公网 IP,配置安全组(仅开放 80/443/22/管理端口) | ❗禁止开放 22 端口给全网,建议白名单或跳板机 |
✅ 二、JVM 与 Spring Boot 运行时优化
▪️ 启动脚本示例(start.sh)
#!/bin/bash
APP_JAR="myapp.jar"
JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64" # 推荐 JDK 17(LTS)
JAVA_OPTS="-server
-Xms2g -Xmx2g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+UseStringDeduplication
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/myapp/heap-dump.hprof
-Dfile.encoding=UTF-8
-Duser.timezone=Asia/Shanghai
-Dspring.profiles.active=prod"
nohup ${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar ${APP_JAR} > /dev/null 2>&1 &
echo $! > /var/run/myapp.pid
✅ 关键点说明:
- 使用 JDK 17+(Spring Boot 3.x 强制要求;2.x 推荐 JDK 17,兼容性好、GC 性能优)
- 堆内存设为
Xms == Xmx(避免动态扩容开销),占总内存 50%~75%(留足 OS 缓存、Metaspace、直接内存)- G1 GC 适合大堆(≥4GB),低延迟场景更优;小内存可用 ZGC(JDK 17+)
- 必加
-Dfile.encoding=UTF-8和-Duser.timezone=Asia/Shanghai(防乱码/时区错误)
▪️ Spring Boot 生产配置(application-prod.yml)
server:
port: 8080
tomcat:
max-connections: 5000
max-threads: 200
min-spare-threads: 20
connection-timeout: 30000
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,application/json,application/javascript
spring:
profiles:
active: prod
datasource:
hikari:
maximum-pool-size: 30
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
redis:
lettuce:
pool:
max-active: 20
max-idle: 10
min-idle: 2
logging:
level:
root: INFO
com.mycompany: WARN # 关键包调高日志级别
file:
name: /var/log/myapp/app.log
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
server:
port: 9001 # 独立 Actuator 端口(安全组限制访问)
⚠️ 注意:
- 禁用
/actuator/env,/actuator/beans等敏感端点(或通过 Spring Security 严格鉴权)- 日志路径使用绝对路径,确保目录存在且应用有写权限(
chown myapp:myapp /var/log/myapp)
✅ 三、进程管理与守护(推荐 systemd)
创建 /etc/systemd/system/myapp.service:
[Unit]
Description=My Spring Boot Application
After=network.target
[Service]
Type=simple
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Xms2g -Xmx2g -jar /opt/myapp/myapp.jar
Restart=always
RestartSec=10
Environment=SPRING_PROFILES_ACTIVE=prod
StandardOutput=journal
StandardError=journal
# 防止 OOM Killer 杀死进程(可选)
OOMScoreAdjust=-500
[Install]
WantedBy=multi-user.target
启用服务:
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
sudo journalctl -u myapp -f # 查看实时日志
✅ 优势:自动重启、日志集成、依赖管理、资源隔离。
✅ 四、安全加固(必须项)
| 领域 | 措施 |
|---|---|
| 系统层 | • 创建专用非 root 用户(useradd -r -s /sbin/nologin myapp)• 禁用密码登录,仅用 SSH 密钥 • 安装 fail2ban 防暴力破解 |
| 应用层 | • Nginx 反向X_X(SSL 终结、限流、WAF 规则) • Spring Security 配置 CSRF、CORS、CSP、HSTS • 敏感配置(DB 密码、API Key)用 spring-cloud-starter-config 或 Vault 管理 |
| 网络层 | • 云安全组:仅放行 80/443(HTTP/HTTPS)、9001(仅内网或 X_X 访问 Actuator)• 关闭 22 端口公网暴露,改用跳板机或 Cloud Shell |
✅ 五、监控与运维
| 工具 | 用途 | 推荐配置 |
|---|---|---|
| Prometheus + Grafana | 监控 JVM、HTTP 指标、数据库连接池 | Spring Boot Actuator /actuator/prometheus 对接 |
| ELK / Loki | 集中式日志分析 | Filebeat 收集 /var/log/myapp/*.log → Kafka → Logstash/Elasticsearch |
| Nginx | 反向X_X + SSL + 静态资源托管 | 配置 HTTP/2、Gzip、缓存头、IP 限流(limit_req) |
| Backup | 数据库 + 配置文件自动备份 | crontab + mysqldump + rsync 到对象存储(如 OSS/S3) |
🚫 避坑清单(血泪经验)
- ❌ 不要直接用
java -jar xxx.jar启动(无守护、无日志轮转、OOM 后不自启) - ❌ 不要在
application.yml中硬编码密码(用--spring.config.import=configserver:或环境变量) - ❌ 不要关闭
spring-boot-starter-validation(参数校验是第一道防线) - ❌ 不要忽略
@Transactional的传播行为和异常类型(默认只对RuntimeException回滚) - ❌ 不要让 Spring Boot 打包成 fat-jar 后仍用
java -cp加载外部 jar(类加载冲突!)
🔧 附:一键检查脚本(部署后运行)
# check-env.sh
echo "=== JVM Info ==="
ps aux | grep java | grep -v grep
java -version
echo -e "n=== Memory Usage ==="
free -h
df -h
echo -e "n=== App Status ==="
systemctl is-active myapp
curl -s http://localhost:8080/actuator/health | jq .
echo -e "n=== Logs (last 5 lines) ==="
tail -5 /var/log/myapp/app.log
如需进一步定制(如:高并发场景调优、容器化 Docker 部署、K8s Helm Chart、灰度发布方案),欢迎补充业务规模(QPS/日活/数据量)和架构细节,我可提供针对性方案 👇
是否需要我为你生成:
- ✅ 完整的
Dockerfile+docker-compose.yml(带 Nginx/PostgreSQL) - ✅ Nginx HTTPS 反向X_X配置模板(含 Let’s Encrypt 自动续签)
- ✅ Prometheus 监控指标采集规则(Grafana Dashboard JSON)?
欢迎随时提出!
轻量云Cloud