Spring Boot是Java生态最流行的Web框架,内嵌Tomcat服务器,可以打包为独立的JAR文件直接运行。本文介绍在搬瓦工VPS上部署Spring Boot应用的完整流程,包括JDK安装、JAR部署、Systemd服务管理和Nginx反向代理。
Tip: Spring Boot应用内存占用较高(通常300MB+),建议选择1GB以上内存的搬瓦工方案。
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
在本地开发环境构建Spring Boot项目,生成可执行JAR包:
# Maven项目
./mvnw clean package -DskipTests
# Gradle项目
./gradlew bootJar
# 生成的JAR文件位于 target/ 或 build/libs/ 目录
# 创建部署目录
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
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
搬瓦工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(大幅减少内存和启动时间)
# 需要提前编译为原生可执行文件
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
-Xmx 限制最大堆内存lsof -i :8080 查看占用进程Tip: 更多教程请查看新手教程。