在 Linux 服务器上运行 Java Spring Boot 应用,最小可行配置(Minimal Production-Ready Setup)需兼顾功能性、稳定性与基本安全性。以下是核心必备项,按优先级分层说明:
✅ 一、基础运行环境(硬性要求)
| 组件 | 要求 | 说明 |
|---|---|---|
| JDK | OpenJDK 17+(推荐 17 或 21 LTS) | Spring Boot 3.x 要求 JDK 17+;避免使用 Oracle JDK(许可风险);建议用 apt install openjdk-17-jdk(Ubuntu/Debian)或 dnf install java-17-openjdk-devel(RHEL/CentOS)。 |
| Spring Boot 可执行 JAR | myapp.jar(含嵌入式 Tomcat/Jetty) |
使用 mvn clean package 构建,确保 pom.xml 中 <packaging>jar</packaging> 且启用 spring-boot-maven-plugin。 |
⚠️ 注意:无需单独安装 Tomcat/Nginx(除非需要反向X_X、HTTPS、负载均衡等高级功能)。
✅ 二、最小化系统配置(保障稳定运行)
| 配置项 | 推荐做法 | 原因 |
|---|---|---|
| 用户隔离 | 创建专用非 root 用户(如 sudo useradd -r -s /bin/false springapp) |
禁止以 root 运行应用,遵循最小权限原则。 |
| 启动方式 | 使用 systemd 服务(强烈推荐) |
实现开机自启、进程守护、日志集成、自动重启。示例 /etc/systemd/system/myapp.service:ini<br>[Unit]<br>Description=My Spring Boot App<br>After=network.target<br><br>[Service]<br>Type=simple<br>User=springapp<br>WorkingDirectory=/opt/myapp<br>ExecStart=/usr/bin/java -Dspring.profiles.active=prod -jar /opt/myapp/myapp.jar<br>Restart=always<br>RestartSec=10<br>Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"<br><br>[Install]<br>WantedBy=multi-user.target<br>✅ 启用: sudo systemctl daemon-reload && sudo systemctl enable --now myapp |
| 文件权限 | chown -R springapp:springapp /opt/myapp,chmod 644 myapp.jar |
防止权限泄露或意外修改。 |
| JVM 参数(基础) | 至少指定堆内存(防 OOM):-Xms512m -Xmx1024m(根据服务器内存调整) |
避免默认堆大小过小(可能仅几十 MB)导致频繁 GC 或崩溃。 |
✅ 三、关键应用配置(必须检查)
| 配置位置 | 必须项 | 示例值 |
|---|---|---|
application-prod.yml(或 application.properties) |
server.port: 8080(或自定义端口) |
避免与系统服务冲突(如 80/443 需 root 权限,生产中通常用反向X_X暴露) |
spring.profiles.active: prod |
激活生产配置 | |
logging.file.name: /var/log/myapp/app.log |
日志持久化(配合 systemd 时可省略,日志由 journalctl 管理) | |
management.endpoints.web.exposure.include: health,info |
禁用敏感端点(如 env, beans, shutdown),生产环境严禁暴露! |
🔒 安全提示:
- 删除或注释
application.yml中的management.endpoint.*.show-details: always- 确保
application-prod.yml不包含明文密码(使用环境变量或密钥管理服务)
✅ 四、网络与防火墙(基础防护)
| 操作 | 命令/说明 |
|---|---|
| 开放应用端口 | sudo ufw allow 8080(若启用 UFW)或 sudo firewall-cmd --permanent --add-port=8080/tcp(firewalld) |
| 禁止直接访问管理端点 | 若需访问 /actuator/health,通过 Nginx 反向X_X + IP 白名单或 Basic Auth 保护(见下文进阶建议) |
✅ 五、验证清单(部署后必做)
# 1. 检查服务状态
sudo systemctl status myapp
# 2. 查看实时日志
sudo journalctl -u myapp -f
# 3. 测试健康接口(本地)
curl http://localhost:8080/actuator/health
# 4. 检查端口监听
ss -tlnp | grep :8080
# 5. 验证 JVM 进程归属
ps aux | grep myapp.jar # 确认运行用户为 springapp
🚫 常见错误(避免踩坑)
- ❌ 用
java -jar app.jar &启动 → 进程无守护,终端关闭即退出 - ❌ 未设置
Restart=always→ JVM 崩溃后服务不可用 - ❌ 在
application.yml中写死数据库密码 → 改用SPRING_DATASOURCE_PASSWORD=xxx环境变量 - ❌ 忘记
systemctl daemon-reload→ 修改 service 文件后不生效
📌 进阶建议(非必需但强烈推荐)
- 反向X_X:用 Nginx 处理 HTTPS、静态资源、负载均衡(即使单机也推荐)
- 日志轮转:通过
logback-spring.xml配置TimeBasedRollingPolicy - 监控:集成 Actuator + Prometheus + Grafana
- 安全加固:启用 Spring Security,禁用 HTTP TRACE 方法,设置
Content-Security-Policy
✅ 总结一句话:
JDK 17+ + systemd 服务 + 非 root 用户 + 合理 JVM 参数 + 生产 Profile + 关闭敏感 Actuator 端点 = 最小可用生产配置。
如需,我可为你生成完整的 systemd 服务模板、application-prod.yml 示例,或 Nginx 反向X_X配置。欢迎继续提问!
CLOUD云枢