在 Linux 云服务器上部署 Spring Boot 项目时,推荐配置需兼顾稳定性、性能、可观测性、安全性和可维护性。以下是一套经过生产验证的推荐实践(适用于中等流量 Web 应用,如 REST API 或管理后台;高并发/大数据场景需进一步调优):
✅ 一、服务器基础配置(以主流云厂商为例)
| 项目 | 推荐配置 | 说明 |
|---|---|---|
| 操作系统 | Ubuntu 22.04 LTS / CentOS Stream 9 / Alibaba Cloud Linux 3 | 优先选长期支持(LTS)、内核较新、社区活跃的发行版;避免使用已 EOL 的版本(如 CentOS 7/8) |
| CPU & 内存 | ≥ 2 核 CPU + 4GB RAM(起步) 生产建议:4 核 8GB 起 |
Spring Boot 默认堆内存 -Xmx 建议设为总内存的 50%~75%,预留系统和 JVM 元空间、直接内存等 |
| 磁盘 | ≥ 50GB SSD(建议 NVMe)+ 独立 /var/log 分区(或挂载日志盘) |
避免日志填满根分区导致服务异常;SSD 提升 I/O 性能(尤其数据库/日志写入) |
| 网络 | 绑定弹性公网 IP + 配置安全组(最小权限原则) | 仅开放必要端口(如 80/443、22),禁用 root 远程登录 |
✅ 二、JVM 与 Spring Boot 运行时配置
🔹 启动脚本(start.sh 示例,使用 java -jar + JVM 参数)
#!/bin/bash
APP_JAR="myapp.jar"
JAVA_OPTS="-server
-Xms512m -Xmx2g # 堆内存:根据服务器调整(例:8G内存 → -Xms2g -Xmx4g)
-XX:+UseG1GC # JDK 8u212+/11+ 推荐 G1,低延迟且自动调优
-XX:MaxGCPauseMillis=200
-XX:+UseStringDeduplication
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/myapp/logs/heap.hprof
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
-Xloggc:/opt/myapp/logs/gc.log
-Dfile.encoding=UTF-8
-Duser.timezone=Asia/Shanghai"
nohup java $JAVA_OPTS -jar $APP_JAR
--spring.profiles.active=prod
--logging.config=/opt/myapp/config/logback-spring.xml
> /dev/null 2>&1 &
echo $! > /opt/myapp/app.pid
✅ 关键建议:
- 使用
G1GC(非 CMS,后者已废弃);若 JDK ≥ 17,可试ZGC(超低延迟,需-XX:+UseZGC)- 必加
-Dfile.encoding=UTF-8和-Duser.timezone=Asia/Shanghai(避免中文乱码/时区问题)- 通过
--spring.profiles.active=prod激活生产配置- 禁止在命令行传敏感配置(如 DB 密码),改用环境变量或配置中心
✅ 三、配置管理(生产级最佳实践)
| 方式 | 推荐方案 | 说明 |
|---|---|---|
| 配置文件 | application-prod.yml + 外部化配置目录 |
将 application.yml 放 JAR 内,application-prod.yml 放 /opt/myapp/config/,启动时加 --spring.config.location=file:/opt/myapp/config/ |
| 敏感信息 | 环境变量 或 Spring Cloud Config / Nacos / Apollo | 例:export SPRING_DATASOURCE_PASSWORD=xxx → Spring Boot 自动绑定 spring.datasource.password |
| 动态配置 | Nacos(阿里开源,轻量易用)或 Apollo(携程,企业级) | 支持配置热更新、灰度发布、版本回滚、审计日志 |
✅ 四、进程管理与守护(替代简单 nohup)
| 方案 | 推荐 | 原因 |
|---|---|---|
| ✅ Systemd(强烈推荐) | 创建 /etc/systemd/system/myapp.service |
支持开机自启、崩溃自动重启、日志集成(journalctl -u myapp)、资源限制 |
| ❌ Supervisor / nohup | 仅临时调试用 | 缺乏标准生命周期管理,日志分散,无健康检查 |
📌 示例 myapp.service:
[Unit]
Description=My Spring Boot App
After=network.target
[Service]
Type=simple
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Xms512m -Xmx2g -jar /opt/myapp/myapp.jar --spring.profiles.active=prod
Restart=always
RestartSec=10
Environment="JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto" # 指定 JDK 路径
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp
# 安全加固(可选)
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
[Install]
WantedBy=multi-user.target
启用:
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
sudo journalctl -u myapp -f # 实时查看日志
✅ 五、日志与监控(不可少!)
| 类别 | 推荐方案 | 说明 |
|---|---|---|
| 应用日志 | Logback + logback-spring.xml |
按日归档(<rollingPolicy>)、压缩、保留 30 天;异步输出提升性能 |
| 日志收集 | Filebeat → Elasticsearch/Kibana 或 Loki + Grafana | 集中式检索分析(避免登录每台机器查日志) |
| 应用监控 | Micrometer + Prometheus + Grafana | Spring Boot Actuator 暴露 /actuator/metrics 等端点,Prometheus 抓取指标(JVM、HTTP、DB、Cache) |
| 健康检查 | 启用 Actuator:management.endpoints.web.exposure.include=health,info,metrics,prometheus,loggersmanagement.endpoint.health.show-details=when_authorized |
配合 Nginx/LB 健康探测(/actuator/health) |
✅ 六、反向X_X与 HTTPS(生产必备)
-
Nginx 部署在前端(非直接暴露 Spring Boot 端口):
server { listen 80; server_name your-domain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name your-domain.com; ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; # Spring Boot 默认端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 60; } } - ✅ 使用 Let’s Encrypt(certbot)免费 HTTPS
- ✅ 关闭 Spring Boot 的 HTTP 端口(
server.http.port=不配),只走 HTTPS
✅ 七、安全加固(必须项)
- ✅ 禁用 Actuator 敏感端点(如
/env,/shutdown,/jolokia)或加 Spring Security 保护 - ✅ 使用非 root 用户运行应用(如创建
myapp用户) - ✅ 防火墙:
ufw或firewalld仅放行22, 80, 443 - ✅ 定期更新系统 & JDK(使用
amazon-corretto/temurin等 LTS JDK) - ✅ 数据库连接池:HikariCP(默认)+ 合理配置
maximumPoolSize=20(根据 DB 连接数上限调整)
🚀 附:一键检查清单(上线前必做)
- [ ] JVM 参数已优化(堆内存、GC、时区、编码)
- [ ] 使用 systemd 管理,设置
Restart=always - [ ] 日志路径独立且有轮转策略(避免磁盘爆满)
- [ ] Nginx 反向X_X + HTTPS 强制跳转
- [ ] Actuator 端点按需暴露,敏感接口受保护
- [ ] 数据库密码等敏感配置通过环境变量注入
- [ ] 配置了
spring.profiles.active=prod - [ ] 监控接入(至少 JVM 内存、HTTP QPS、错误率)
- [ ] 备份策略:应用配置、数据库、SSL 证书
需要我为你生成:
- ✅ 完整的
systemd service文件模板 - ✅ 生产级
logback-spring.xml - ✅ Nginx + HTTPS + Spring Boot 完整配置示例
- ✅ Prometheus + Grafana 监控面板 JSON
- ✅ Docker 化部署方案(如果需容器化)
欢迎随时告诉我你的具体场景(如:QPS 预估、是否用数据库/Redis、是否已有 CI/CD),我可以为你定制优化建议 👇
CLOUD技术博