Spring Boot部署教程
【摘要】 Spring(Spring Boot)项目的部署,核心流程是打成可执行 jar → 放到 Linux 服务器 → 用 systemd 或 Docker 托管 → Nginx 反向代理到域名。一、打包:先确认能打出正确的 jarpom.xml 里必须有 Spring Boot 插件(Gradle 用 bootJar),否则打出来的 jar 里没有内嵌 Tomcat,运行会报 no main m...
Spring(Spring Boot)项目的部署,核心流程是打成可执行 jar → 放到 Linux 服务器 → 用 systemd 或 Docker 托管 → Nginx 反向代理到域名。
一、打包:先确认能打出正确的 jar
pom.xml 里必须有 Spring Boot 插件(Gradle 用 bootJar),否则打出来的 jar 里没有内嵌 Tomcat,运行会报 no main manifest attribute:xml
编辑
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
bash
编辑
mvn clean package -DskipTests
# 产物在 target/xxx.jar
java -jar target/app.jar --spring.profiles.active=prod # 先在本地跑通再上传
注意两点:Spring Boot 3.x 要求 JDK 17+(JDK 8/11 只能配 2.7.x);包名如果是
javax.* 报错,说明代码还是旧版本,要改成 jakarta.*。生产配置单独写 application-prod.yml(数据库、Redis 用线上地址,日志级别调成 INFO)。二、服务器准备
以 CentOS / Ubuntu 为例:
bash
编辑
# 装 JDK(版本要和打包时一致)
sudo yum install -y java-17-openjdk # CentOS
sudo apt install -y openjdk-17-jre-headless # Ubuntu
java -version
# 建目录、传包
sudo mkdir -p /opt/myapp && sudo chown $USER /opt/myapp
scp target/app.jar user@服务器IP:/opt/myapp/
云服务器的安全组要放行 22(SSH)、80/443(HTTP/HTTPS),应用端口 8080 建议只对 127.0.0.1 开放或不放——后面靠 Nginx 进,别裸曝在外网。系统防火墙同理:
firewall-cmd --permanent --add-service=http && firewall-cmd --reload。三、三种运行方式(按场景选一个)
方式 A:临时测试,nohup 一把梭
bash
编辑
nohup java -Xms512m -Xmx1024m -jar /opt/myapp/app.jar \
--spring.profiles.active=prod >> /opt/myapp/app.log 2>&1 &
tail -f app.log # 看日志
ps -ef | grep java # 找 PID
kill <PID> # 停掉
缺点:重启服务器不会自启,挂了没人拉起来,只适合调试。
方式 B:生产推荐,systemd 托管(自启 + 崩溃重启)
ini
编辑
# /etc/systemd/system/myapp.service
[Unit]
Description=My Spring Boot App
After=network.target
[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Xms512m -Xmx1024m -jar /opt/myapp/app.jar --spring.profiles.active=prod
Restart=always
RestartSec=10
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
bash
编辑
sudo useradd -M -s /sbin/nologin myapp # 别用 root 跑应用
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
sudo systemctl status myapp # 看状态
journalctl -u myapp -f # 看日志
sudo systemctl restart myapp # 更新 jar 后重启即可
方式 C:容器化,Docker(环境一致、回滚方便)
dockerfile
编辑
# Dockerfile(多阶段构建,镜像小)
FROM eclipse-temurin:17-jdk AS build
WORKDIR /app
COPY . .
RUN ./mvnw package -DskipTests
FROM eclipse-temurin:17-jre-slim
WORKDIR /app
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx1024m"
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["sh","-c","java $JAVA_OPTS -jar app.jar"]
bash
编辑
docker build -t myapp:1.0 .
docker run -d -p 8080:8080 --name myapp --restart=unless-stopped myapp:1.0
docker logs -f myapp
# 多服务(含 MySQL/Redis)用 docker-compose.yml 一次拉起
三种方式的取舍:本地试跑 → nohup;正式对外 → systemd;有 CI/CD、多实例或微服务 → Docker/K8s。
四、Nginx 反向代理(对外访问的标配)
不暴露 8080 端口,用域名 + 80/443 访问,还能顺带解决跨域、静态资源和 HTTPS:
nginx
编辑
# /etc/nginx/conf.d/myapp.conf
server {
listen 80;
server_name api.example.com;
client_max_body_size 20M; # 上传文件大小限制
location / {
proxy_pass http://127.0.0.1:8080;
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_http_version 1.1;
proxy_connect_timeout 30s;
proxy_read_timeout 60s;
}
}
bash
编辑
sudo nginx -t && sudo systemctl reload nginx
Spring Boot 侧建议加
server.forward-headers-strategy=framework,否则拿到的客户端 IP、协议会是 Nginx 的。多个后端实例就在 upstream 里列出来做负载均衡;WebSocket 要补 Upgrade / Connection 头。五、常见问题排查速查
| 现象 | 排查方向 |
|---|
| 现象 | 排查方向 |
|---|---|
| 启动失败、无日志 | journalctl -u myapp -e / docker logs;多半是 JDK 版本不对或端口被占 |
| 端口被占 | netstat -tunlp | grep 8080,改 server.port 或杀掉旧进程 |
| 外网访问不通 | 先 curl 127.0.0.1:8080 确认服务正常 → 再看安全组/防火墙/Nginx 配置 |
| 502 Bad Gateway | Nginx 通了但后端没起,或 proxy_pass 地址写错 |
| 内存爆、被 OOM Kill | 调 -Xms/-Xmx,2核4G 机器建议堆不超过 1G,留内存给系统和数据库 |
| 中文乱码 | 启动参数加 -Dfile.encoding=UTF-8,镜像里设 TZ=Asia/Shanghai |
| 事务/定时任务不生效 | 检查是不是自己 new 的对象,必须交给 Spring 容器管理 |
📚 延伸资料
如果需要更系统的图文教程,可以参考这些方向的内容:
- Spring Boot 官方文档 "Installing Spring Boot Applications" — 讲 fully executable jar、init.d / systemd 注册的权威说明,systemd 方案的源头
- SpringBoot 项目云服务器部署全攻略 — 从选云服务器规格、安全组、Maven profile 打包、rsync 传包到 systemd 和性能优化的完整链路
- Docker 部署 SpringBoot 项目超详细教程 — 镜像加速、Dockerfile 编写、构建运行、防火墙开放、常见问题,适合容器化入门
- Nginx 反向代理 Spring Boot 后端接口 — 讲清为什么不用 8080 裸访,含上传大小、502/413 处理、前后端分离部署
后续想深入哪一块可以告诉我:比如配 CI/CD 自动发布(GitHub Actions / Jenkins)、Docker Compose 一键拉起 MySQL+Redis+应用、上 HTTPS(Certbot 免费证书),或者K8s 部署与滚动更新,我可以给出对应的完整配置。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)