在 Linux 云服务器上部署 Spring Boot 项目时,推荐配置需兼顾稳定性、性能、可观测性、安全性和运维便利性。以下是一套经过生产验证的综合推荐(适用于中等流量 Web/API 服务,如日活 1w–10w 的业务系统):
✅ 一、服务器基础配置(以主流云厂商为例)
| 项目 | 推荐配置 | 说明 |
|---|---|---|
| 操作系统 | Ubuntu 22.04 LTS 或 CentOS Stream 9 / Rocky Linux 8/9 | 优先选长期支持(LTS)版本,内核较新(≥5.4),兼容性好、安全更新及时;避免使用已 EOL 的 CentOS 7 |
| CPU & 内存 | 2–4 核 CPU + 4–8 GB RAM | Spring Boot 默认 JVM 堆内存建议设为总内存的 50%~75%; • 2C4G:适合开发/测试或轻量级服务(QPS < 300) • 4C8G:推荐生产起步配置(QPS 500–2000+,支持合理 GC 和监控) |
| 磁盘 | ≥40 GB SSD(建议 NVMe) | 系统盘 + 应用日志 + JVM dump 目录需足够空间;日志按天轮转 + 压缩 + 定期清理(如 logrotate) |
| 网络 | 公网 IP + 安全组严格限制(仅开放 80/443/22/自定义管理端口) | ❗禁用 root 远程登录,强制密钥认证 |
✅ 二、JVM 运行时配置(关键!)
# 示例:启动脚本中使用的 JAVA_OPTS(强烈建议通过 application.yml 外部化配置 + JVM 参数分离)
JAVA_OPTS="-server
-Xms2g -Xmx2g # 堆内存固定(避免动态伸缩GC抖动),建议设为相等值
-XX:+UseG1GC # JDK 8u212+/11+/17+ 默认且推荐,低延迟、大堆友好
-XX:MaxGCPauseMillis=200
-XX:+UseStringDeduplication # 减少字符串重复内存占用(尤其 JSON/HTTP 场景)
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/myapp/heapdump.hprof
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
-Xloggc:/var/log/myapp/gc.log -XX:+RotateGCLogFiles -XX:NumberOfGCLogFiles=10
-Dfile.encoding=UTF-8
-Duser.timezone=Asia/Shanghai"
🔍 提示:
- 使用
jstat/jmap/jstack或Arthas实时诊断;- 生产环境务必关闭
-XX:+UseCompressedOops(64位系统默认开启,无需显式设置);- JDK 版本:OpenJDK 17 LTS(推荐)或 21 LTS(Spring Boot 3.x 强制要求 JDK 17+)。
✅ 三、Spring Boot 应用层优化配置(application-prod.yml)
server:
port: 8080
tomcat:
max-connections: 1000
accept-count: 200
max-http-post-size: 10MB
connection-timeout: 5000
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,application/json,application/xml
min-response-size: 1024
spring:
profiles:
active: prod
datasource:
hikari:
maximum-pool-size: 20 # 根据 DB 连接数上限和 QPS 调整(通常 10–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
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus,loggers,threaddump,heapdump
endpoint:
health:
show-details: when_authorized
server:
port: 9090 # 独立 Actuator 端口(安全组隔离)
💡 安全增强:
- Actuator 端点必须加 Spring Security(Basic Auth 或 JWT);
/actuator/env,/actuator/beans等敏感端点禁止暴露公网;- 使用
spring-boot-starter-actuator+micrometer-registry-prometheus对接 Prometheus。
✅ 四、进程管理与守护(推荐 systemd)
✅ 创建 /etc/systemd/system/myapp.service:
[Unit]
Description=My Spring Boot App
After=network.target
[Service]
Type=simple
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java $JAVA_OPTS -jar /opt/myapp/app.jar --spring.profiles.active=prod
Restart=always
RestartSec=10
SuccessExitStatus=143
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
Environment="LANG=en_US.UTF-8"
# 防止 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 # 查看日志
✅ 五、日志与监控体系(生产必备)
| 组件 | 推荐方案 | 说明 |
|---|---|---|
| 日志收集 | Filebeat → Elasticsearch / Loki |
替代传统 rsyslog,支持结构化日志(Logback JSON encoder) |
| 指标监控 | Prometheus + Grafana + Micrometer |
监控 JVM、HTTP、DB、Cache、线程池等核心指标 |
| 链路追踪 | SkyWalking(轻量)或 Jaeger + OpenTelemetry |
Spring Boot 3.x 推荐 OTel 自动注入 |
| 告警 | Alertmanager(Prometheus 生态)或 Grafana Alerting |
设置 GC 时间、HTTP 5xx、线程阻塞、内存泄漏等阈值告警 |
✅ 六、安全加固(必须项)
- ✅ 使用反向X_X(Nginx/Traefik):终止 HTTPS、限流(
limit_req)、防 CC、隐藏Server头; - ✅ Nginx 配置 HTTPS(Let’s Encrypt 免费证书 + 自动续期);
- ✅ Spring Security 启用 CSRF(非 API 场景)、CORS 白名单、HSTS、X-Content-Type-Options;
- ✅ 数据库连接使用最小权限账号(只授予
SELECT/INSERT/UPDATE所需表); - ✅ 敏感配置(DB 密码、API Key)绝不硬编码:使用
Spring Cloud Config/Vault/ 环境变量 +--spring.config.import=configtree:/etc/secrets/; - ✅ 定期
apt update && apt upgrade+unattended-upgrades开启。
✅ 七、部署与 CI/CD 建议
- 构建产物:
mvn clean package -DskipTests→ 生成app.jar(Fat Jar)或使用jlink+jpackage(JDK 14+)构建原生镜像(可选); - 推荐 Docker 化(但非必须):
FROM eclipse-jetty:11-jre17-slim COPY app.jar /var/lib/jetty/webapps/app.jar EXPOSE 8080 - CI/CD 工具:GitHub Actions / GitLab CI / Jenkins(自动构建 → 单元测试 → 部署到预发 → 人工审批 → 生产)
🚫 避坑清单(高频错误)
| 错误做法 | 正确做法 |
|---|---|
java -jar app.jar & 启动(无守护、易退出) |
✅ 使用 systemd 或 supervisord |
logging.file.name 写死绝对路径(权限问题) |
✅ 改用 logging.file.path: /var/log/myapp/(确保目录存在+myapp用户可写) |
不设 Xmx → JVM 用满物理内存 → 触发 OOM Killer |
✅ 必须显式设置 -Xms/-Xmx |
Actuator 暴露 /actuator/env 到公网 |
✅ 仅允许内网访问 + Basic Auth |
| 日志不轮转 → 单个文件达数十 GB → 磁盘爆满 | ✅ logback-spring.xml 配置 <rollingPolicy> + logrotate 双保险 |
如需我帮你:
- ✅ 生成完整的
systemd service文件模板 - ✅ 提供
logback-spring.xml轮转+压缩配置 - ✅ 输出 Nginx 反向X_X + HTTPS + 限流完整配置
- ✅ Spring Boot 3.x + JDK 17 最小安全启动脚本
- ✅ Prometheus + Grafana 监控大盘 JSON
欢迎随时告诉我你的具体场景(如:是否已有 Nginx?是否用 Docker?QPS 预估?是否需要高可用集群?),我可以为你定制化输出 👇
祝你上线顺利,零事故!🚀
云服务器