spring boot生产环境部署核心是稳、可查、可持续,需验证jdk版本匹配、jar包完整性,用systemd守护进程,外置application-prod.yml配置,通过环境变量注入敏感信息,并检查防火墙、selinux及端口冲突。

Spring Boot 项目在 Linux 生产环境部署,核心不是“能不能跑起来”,而是“能不能稳、能不能查、能不能续”。直接用 java -jar 启动看似简单,但没日志轮转、没进程守护、没配置隔离、没 JVM 调优,上线三天必出问题。
如何确认 JDK 和 jar 包已就位
别跳过这步——很多“启动失败”其实卡在环境上。先验证 JDK 版本是否匹配项目要求(比如 Spring Boot 3.x 需 JDK 17+):
java -version 输出必须含 17 或更高;若为 1.8.0_XXX,则不兼容 Spring Boot 3+,会报 UnsupportedClassVersionError。
jar 包上传后检查权限和完整性:
- 用
ls -l your-app.jar确认非 root 用户也能读取(尤其用 systemd 切换用户时) - 用
java -Djarmode=layertools -jar your-app.jar list快速验证 jar 是合法的 Spring Boot 可执行包(输出包含dependencies、spring-boot-loader等) - 避免把开发机打包的 jar 直接传上去——确保
mvn clean package -Dmaven.test.skip=true是在目标 JDK 版本下执行的
systemd service 是生产首选,不是“可选”
nohup 或 shell 脚本启动无法自动拉起、无法统一管理生命周期、日志分散难聚合。systemd 是现代 Linux 的标准服务管理器,必须用。
关键配置点:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
-
ExecStart必须写全路径:/usr/bin/java -Xms512m -Xmx1024m -jar /opt/myapp/app.jar --spring.profiles.active=prod - 加
User=deploy(不要用 root),提前创建无登录权限用户:useradd -r -s /sbin/nologin deploy - 加
Restart=always和RestartSec=10,防止 OOM 或异常退出后服务静默离线 -
StandardOutput=journal和StandardError=journal,让journalctl -u myapp能查到所有输出
示例片段(存为 /etc/systemd/system/myapp.service):
[Service] User=deploy WorkingDirectory=/opt/myapp ExecStart=/usr/bin/java -Xms512m -Xmx1024m -jar /opt/myapp/app.jar --spring.profiles.active=prod Restart=always RestartSec=10 StandardOutput=journal StandardError=journal
application-prod.yml 必须外置,不能打进 jar
打进去的配置改一次就得重打包,违反十二要素原则。生产配置必须从外部加载:
- 把
application-prod.yml放到/opt/myapp/config/下 - 启动命令中显式指定:
--spring.config.location=file:/opt/myapp/config/(注意末尾斜杠) - 同时加
--spring.config.name=application,否则它会去找application.yml而不是application-prod.yml - 数据库密码等敏感字段,优先用环境变量注入:
SPRING_DATASOURCE_PASSWORD=xxx,比明文写在 yml 里安全
验证是否生效:启动后立刻查日志,搜索 Active profiles,应输出 prod;再搜 Started Application 前的 Tomcat started on port(s): 8080,确认端口和 profile 都对。
防火墙、SELinux、端口冲突是隐形杀手
服务明明启动成功,却连不上?大概率卡在这三处:
- 腾讯云/阿里云控制台的安全组规则,必须放行应用端口(如
8080),**仅开放服务器本地防火墙(firewalld/ufw)不够** - CentOS 8+/Alibaba Cloud Linux 默认启用 SELinux,会拦截 Java 绑定端口,临时关掉验证:
setenforce 0;长期方案是配策略:semanage port -a -t http_port_t -p tcp 8080 - 检查端口是否被占:
ss -tulnp | grep ':8080',常见冲突源是残留的旧进程、宝塔面板、或另一个 Spring Boot 实例
特别注意:如果用了 Nginx 反向代理,Spring Boot 应监听 127.0.0.1:8080 而非 0.0.0.0:8080,避免应用端口直接暴露公网。
最常被忽略的是 JVM 参数和日志滚动——没设 -Xmx,容器化环境容易被 OOM kill;没配 logging.file.max-size 和 logging.file.max-history,几个月后磁盘爆满。这些不是“上线后再加”,是部署脚本里必须固化的第一行。










