Linux服务器部署Spring Boot生产环境核心是稳、可查、可持续,需严审JDK版本(Spring Boot 3.x要求JDK 17+)、JAR包完整性与权限,必须用systemd管理服务(含User、Restart、journal日志),配置外置application-prod.yml并用环境变量注入敏感信息,同时检查防火墙、SELinux及端口冲突。

Linux服务器部署Spring Boot生产环境,核心是稳、可查、可持续——不是“能跑就行”,而是“出问题能快速定位、挂了能自动恢复、配置改了不用重打包”。
环境与包必须严审
很多启动失败其实卡在基础环节:
- JDK版本必须匹配:Spring Boot 3.x 要求 JDK 17+,运行 java -version 确认输出含 17 或更高;JDK 8 会直接报
UnsupportedClassVersionError - JAR包不能直接从开发机拷贝:确保是用目标服务器同版本JDK执行 mvn clean package -Dmaven.test.skip=true 打的包
- 上传后验证完整性:运行 java -Djarmode=layertools -jar your-app.jar list,输出应包含 dependencies 和 spring-boot-loader,否则不是合法可执行包
- 检查文件权限:ls -l your-app.jar 确保非 root 用户(如 deploy)有读取权限,否则 systemd 切换用户后会因无权读取而静默失败
必须用 systemd 管理服务
nohup 或 shell 脚本只是临时方案,生产环境禁用:
- 创建专用用户:useradd -r -s /sbin/nologin deploy,禁止登录且权限最小化
- 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(防OOM或异常退出后服务离线)
StandardOutput=journal 和 StandardError=journal(日志统一进 journalctl) - 启用并启动:systemctl daemon-reload && systemctl enable myapp.service && systemctl start myapp
配置必须外置且安全
application-prod.yml 绝对不能打进 JAR 包:
- 放到外部目录,例如 /opt/myapp/config/application-prod.yml,Spring Boot 启动时会自动扫描
config/子目录 - 敏感信息(数据库密码、Redis密钥等)用环境变量注入:
在 service 文件中加 Environment="DB_PASSWORD=xxx",配置文件里写password: ${DB_PASSWORD} - 禁用 profile 混用:确保 --spring.profiles.active=prod 显式指定,不依赖默认 fallback
系统级防护不能漏
上线前务必确认:
- 防火墙放行对应端口(如 8080),命令示例:firewall-cmd --permanent --add-port=8080/tcp && firewall-cmd --reload
- SELinux 若启用,需设为 permissive 或添加对应策略,否则可能拦截网络绑定,临时验证可运行 setenforce 0
- 检查端口冲突:ss -tuln | grep :8080,避免被其他进程占用
- 预留日志空间:在 application-prod.yml 中配置日志轮转,如
max-size: 100MB、max-history: 30,防止磁盘打满