1. 环境准备与基础配置
在开始部署SpringBoot应用到Ubuntu系统之前,我们需要做好充分的环境准备工作。作为Java开发者,我强烈建议使用LTS版本的Ubuntu系统(如20.04或22.04),这些版本经过长期测试,稳定性更有保障。
1.1 服务器基础配置
首先确保你的Ubuntu系统已经完成以下基础配置:
- 更新系统软件包:
sudo apt update && sudo apt upgrade -y - 安装必要的工具链:
sudo apt install -y curl wget git unzip - 配置SSH访问(如果尚未设置):
sudo apt install openssh-server
提示:生产环境建议禁用root直接登录,并配置SSH密钥认证,这能显著提升系统安全性。
1.2 用户与权限规划
为Java应用创建专用用户是个好习惯:
bash复制sudo adduser javauser
sudo usermod -aG sudo javauser # 如果需要sudo权限
创建应用部署目录并设置权限:
bash复制sudo mkdir -p /opt/java-app
sudo chown -R javauser:javauser /opt/java-app
2. Java环境安装与优化
2.1 JDK版本选择与安装
SpringBoot应用对JDK版本有特定要求。根据我的经验,目前主流选择有:
- OpenJDK 11(LTS,最稳定)
- OpenJDK 17(最新LTS版本)
安装OpenJDK 17:
bash复制sudo apt install -y openjdk-17-jdk
验证安装:
bash复制java -version
2.2 JVM调优配置
生产环境需要合理配置JVM参数。创建/etc/environment文件添加:
bash复制JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
注意:内存参数应根据服务器实际配置调整,通常建议Xmx不超过物理内存的70%。
3. SpringBoot应用部署实战
3.1 应用打包与传输
使用Maven打包SpringBoot应用:
bash复制mvn clean package -DskipTests
将生成的jar包传输到服务器:
bash复制scp target/your-app.jar javauser@your-server:/opt/java-app/
3.2 应用启动与管理
创建启动脚本/opt/java-app/start.sh:
bash复制#!/bin/bash
APP_NAME="your-app.jar"
JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:+UseG1GC"
nohup java $JAVA_OPTS -jar $APP_NAME > /dev/null 2>&1 &
给脚本执行权限:
bash复制chmod +x /opt/java-app/start.sh
4. 系统服务化配置
4.1 创建Systemd服务
创建/etc/systemd/system/java-app.service:
ini复制[Unit]
Description=Java Application Service
After=network.target
[Service]
User=javauser
WorkingDirectory=/opt/java-app
ExecStart=/usr/bin/java -jar /opt/java-app/your-app.jar
SuccessExitStatus=143
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=java-app
[Install]
WantedBy=multi-user.target
4.2 服务管理命令
启用并启动服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable java-app
sudo systemctl start java-app
查看服务状态:
bash复制sudo systemctl status java-app
5. Nginx反向代理配置
5.1 安装与基础配置
安装Nginx:
bash复制sudo apt install -y nginx
配置反向代理/etc/nginx/sites-available/java-app:
nginx复制server {
listen 80;
server_name your-domain.com;
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_connect_timeout 60s;
proxy_read_timeout 60s;
}
access_log /var/log/nginx/java-app-access.log;
error_log /var/log/nginx/java-app-error.log;
}
启用配置:
bash复制sudo ln -s /etc/nginx/sites-available/java-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
6. 日志管理与监控
6.1 应用日志配置
在SpringBoot的application.properties中添加:
properties复制logging.file.path=/var/log/java-app
logging.file.name=${logging.file.path}/application.log
logging.level.root=INFO
6.2 日志轮转配置
创建/etc/logrotate.d/java-app:
bash复制/var/log/java-app/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 javauser javauser
sharedscripts
postrotate
systemctl restart java-app >/dev/null 2>&1 || true
endscript
}
7. 安全加固措施
7.1 防火墙配置
启用UFW防火墙并配置规则:
bash复制sudo ufw allow 22
sudo ufw allow 80
sudo ufw enable
7.2 应用安全建议
- 禁用SpringBoot Actuator的敏感端点
- 配置HTTPS加密(使用Let's Encrypt)
- 定期更新依赖库版本
8. 性能优化技巧
8.1 JVM调优进阶
根据应用特点调整GC策略:
bash复制JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2"
8.2 连接池优化
配置合适的数据库连接池参数:
properties复制spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.connection-timeout=30000
9. 常见问题排查
9.1 端口冲突问题
检查端口占用:
bash复制sudo netstat -tulnp | grep :8080
9.2 内存不足处理
增加JVM内存:
bash复制JAVA_OPTS="-Xms1g -Xmx2g"
查看内存使用:
bash复制top -p $(pgrep -f java)
10. 自动化部署方案
10.1 使用Shell脚本
创建部署脚本deploy.sh:
bash复制#!/bin/bash
# 构建应用
mvn clean package -DskipTests
# 传输到服务器
scp target/*.jar user@server:/opt/java-app/
# 重启服务
ssh user@server "sudo systemctl restart java-app"
10.2 使用CI/CD工具
Jenkins pipeline示例:
groovy复制pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('Deploy') {
steps {
sh 'scp target/*.jar user@server:/opt/java-app/'
sh 'ssh user@server "sudo systemctl restart java-app"'
}
}
}
}
在实际部署过程中,我发现以下几个经验特别有价值:
- 使用
jstack和jmap工具进行线上问题诊断 - 配置
/etc/security/limits.conf提高文件打开数限制 - 使用
tmux或screen保持SSH会话稳定 - 定期检查
/var/log/syslog中的系统级错误
对于需要更高可用性的场景,可以考虑:
- 使用Docker容器化部署
- 配置负载均衡和多实例部署
- 实现蓝绿部署或金丝雀发布策略
