Spring Boot部署教程

举报
tianxia_1 发表于 2026/10/23 00:01:06 2026/10/23
【摘要】 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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。