VPS部署Java Spring Boot教程


Spring Boot是Java生态最流行的Web框架,内嵌Tomcat服务器,可以打包为独立的JAR文件直接运行。本文介绍在搬瓦工VPS上部署Spring Boot应用的完整流程,包括JDK安装、JAR部署、Systemd服务管理和Nginx反向代理。

Tip: Spring Boot应用内存占用较高(通常300MB+),建议选择1GB以上内存的搬瓦工方案。

安装JDK

Debian/Ubuntu 系统:

# 安装OpenJDK 17(Spring Boot 3.x要求Java 17+)
sudo apt update
sudo apt install openjdk-17-jdk -y

# 验证安装
java -version
javac -version

CentOS/AlmaLinux 系统:

sudo yum install java-17-openjdk java-17-openjdk-devel -y
java -version

设置JAVA_HOME环境变量:

# 查找JDK安装路径
update-alternatives --list java

# 添加环境变量
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

构建JAR包

在本地开发环境构建Spring Boot项目,生成可执行JAR包:

# Maven项目
./mvnw clean package -DskipTests

# Gradle项目
./gradlew bootJar

# 生成的JAR文件位于 target/ 或 build/libs/ 目录

上传和部署JAR包

# 创建部署目录
sudo mkdir -p /opt/springboot/myapp
sudo mkdir -p /var/log/springboot

# 上传JAR文件(本地执行)
scp target/myapp-1.0.0.jar root@your-vps-ip:/opt/springboot/myapp/app.jar

# 创建生产环境配置文件
sudo nano /opt/springboot/myapp/application-prod.yml
server:
  port: 8080
  address: 127.0.0.1

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: dbuser
    password: dbpassword

logging:
  file:
    path: /var/log/springboot
  level:
    root: WARN
    com.myapp: INFO
# 测试运行
java -jar /opt/springboot/myapp/app.jar --spring.profiles.active=prod

# 测试访问
curl http://127.0.0.1:8080

Systemd服务管理

sudo nano /etc/systemd/system/springboot-myapp.service
[Unit]
Description=Spring Boot Application - MyApp
After=network.target mysql.service

[Service]
User=www-data
Group=www-data
Type=simple

# JVM参数(根据VPS内存调整)
Environment="JAVA_OPTS=-Xms256m -Xmx512m -XX:+UseG1GC"
Environment="SPRING_PROFILES_ACTIVE=prod"

ExecStart=/usr/bin/java $JAVA_OPTS -jar /opt/springboot/myapp/app.jar
ExecStop=/bin/kill -s TERM $MAINPID

# 自动重启
Restart=on-failure
RestartSec=10

# 限制资源
MemoryMax=768M
CPUQuota=80%

# 工作目录
WorkingDirectory=/opt/springboot/myapp

# 日志
StandardOutput=append:/var/log/springboot/myapp-stdout.log
StandardError=append:/var/log/springboot/myapp-stderr.log

[Install]
WantedBy=multi-user.target
# 设置文件权限
sudo chown -R www-data:www-data /opt/springboot/myapp
sudo chown -R www-data:www-data /var/log/springboot

# 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable springboot-myapp
sudo systemctl start springboot-myapp

# 查看状态
sudo systemctl status springboot-myapp

# 查看日志
sudo journalctl -u springboot-myapp -f

JVM内存调优

搬瓦工VPS内存有限,合理配置JVM参数非常重要:

# 512MB内存VPS
JAVA_OPTS="-Xms128m -Xmx256m -XX:+UseSerialGC -XX:MaxMetaspaceSize=128m"

# 1GB内存VPS
JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC -XX:MaxMetaspaceSize=128m"

# 2GB内存VPS
JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxMetaspaceSize=256m"

# GraalVM Native Image(大幅减少内存和启动时间)
# 需要提前编译为原生可执行文件

Nginx反向代理

sudo nano /etc/nginx/conf.d/springboot.conf
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # 静态资源
    location /static/ {
        alias /opt/springboot/myapp/static/;
        expires 30d;
        access_log off;
    }

    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;

        # Spring Boot可能有耗时接口
        proxy_connect_timeout 60s;
        proxy_read_timeout 120s;
    }
}
sudo nginx -t
sudo nginx -s reload

更新部署

# 上传新的JAR包
scp target/myapp-1.0.1.jar root@your-vps-ip:/opt/springboot/myapp/app-new.jar

# 在VPS上替换并重启
cd /opt/springboot/myapp
sudo systemctl stop springboot-myapp
mv app.jar app-backup.jar
mv app-new.jar app.jar
sudo chown www-data:www-data app.jar
sudo systemctl start springboot-myapp

# 验证启动
sudo systemctl status springboot-myapp
curl http://127.0.0.1:8080/actuator/health

常见问题

Tip: 更多教程请查看新手教程
关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工 BandwagonHost 的优惠信息、使用教程和方案对比,方便中文用户选购和使用。

新手必读
搬瓦工优惠码

当前最大折扣优惠码:

NODESEEK2026(优惠 6.77%)

在购买方案时填入优惠码即可自动抵扣。详见 优惠码使用教程