资讯动态

SpringBoot应用在Ubuntu上的生产环境部署指南

发布时间:2026/9/14 21:37:23 来源:尧图企业网站定制
1. 项目概述作为一名长期奋战在一线的Java开发者我深知将SpringBoot应用部署到生产环境的重要性。Ubuntu作为最流行的Linux发行版之一凭借其稳定性和丰富的软件生态成为企业级Java应用部署的首选平台。本文将分享我在实际项目中总结的SpringBoot应用部署全流程涵盖从环境准备到服务管理的每个关键环节。2. 环境准备与配置2.1 服务器基础环境推荐使用Ubuntu 20.04 LTS或22.04 LTS版本这两个版本都提供长期支持且稳定性经过验证。在开始部署前确保完成系统更新sudo apt update sudo apt upgrade -y安装必要工具sudo apt install -y curl wget unzip net-tools注意生产环境建议禁用root直接登录配置SSH密钥认证。可通过sudo nano /etc/ssh/sshd_config修改PermitRootLogin为no。2.2 Java环境安装2.2.1 JDK版本选择当前主流选择有OpenJDK 17LTS版本推荐新项目使用OpenJDK 11另一个LTS版本存量项目常用Amazon CorrettoAWS优化版本安装OpenJDK 17sudo apt install -y openjdk-17-jdk验证安装java -version2.2.2 环境变量配置虽然Ubuntu会自动配置Java路径但显式设置更可靠echo export JAVA_HOME/usr/lib/jvm/java-17-openjdk-amd64 ~/.bashrc echo export PATH$JAVA_HOME/bin:$PATH ~/.bashrc source ~/.bashrc3. 应用部署实战3.1 应用打包与传输推荐使用SpringBoot Maven插件打包mvn clean package -DskipTests生成的jar文件通常位于target目录下。传输到服务器的几种方式SCP命令适合小文件scp target/your-app.jar userserver:/var/www/java-app/SFTP客户端如FileZilla代码仓库直接拉取需配置部署密钥3.2 运行应用基础启动命令java -jar /var/www/java-app/your-app.jar生产环境推荐添加JVM参数java -Xms512m -Xmx1024m -XX:UseG1GC -jar your-app.jar常见问题遇到no main manifest attribute错误检查pom.xml是否配置了spring-boot-maven-plugin。3.3 数据库配置MySQL示例安装MySQL 8.0sudo apt install -y mysql-server安全初始化sudo mysql_secure_installation创建应用数据库CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER app_userlocalhost IDENTIFIED BY StrongPassword123!; GRANT ALL PRIVILEGES ON app_db.* TO app_userlocalhost; FLUSH PRIVILEGES;在application.properties中配置spring.datasource.urljdbc:mysql://localhost:3306/app_db spring.datasource.usernameapp_user spring.datasource.passwordStrongPassword123! spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver4. 生产级优化配置4.1 系统服务管理创建systemd服务文件/etc/systemd/system/java-app.service[Unit] DescriptionJava Application Service Aftersyslog.target network.target [Service] Userappuser Groupappgroup WorkingDirectory/var/www/java-app ExecStart/usr/bin/java -Xms512m -Xmx1024m -jar /var/www/java-app/your-app.jar SuccessExitStatus143 Restartalways RestartSec10 StandardOutputsyslog StandardErrorsyslog SyslogIdentifierjava-app [Install] WantedBymulti-user.target关键参数说明User/Group建议使用非root用户运行Restartalways确保应用崩溃后自动重启StandardOutput将日志输出到系统日志启用服务sudo systemctl daemon-reload sudo systemctl enable java-app sudo systemctl start java-app4.2 Nginx反向代理配置安装Nginxsudo apt install -y nginx配置/etc/nginx/sites-available/your-domain.comserver { 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; # WebSocket支持 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires 30d; add_header Cache-Control public, no-transform; } }启用配置sudo ln -s /etc/nginx/sites-available/your-domain.com /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx4.3 日志管理方案4.3.1 Logback配置示例logback-spring.xml配置configuration property nameLOG_PATH value/var/log/java-app / property nameLOG_FILE value${LOG_PATH}/application.log / appender nameFILE classch.qos.logback.core.rolling.RollingFileAppender file${LOG_FILE}/file encoder pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/pattern /encoder rollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy fileNamePattern${LOG_PATH}/application.%d{yyyy-MM-dd}.%i.log.gz/fileNamePattern maxFileSize100MB/maxFileSize maxHistory30/maxHistory totalSizeCap2GB/totalSizeCap /rollingPolicy /appender root levelINFO appender-ref refFILE / /root /configuration4.3.2 日志轮转配置创建logrotate配置/etc/logrotate.d/java-app/var/log/java-app/*.log { daily missingok rotate 30 compress delaycompress notifempty create 0640 appuser appgroup sharedscripts postrotate systemctl kill -s HUP java-app.service /dev/null 21 || true endscript }5. 高级部署技巧5.1 多环境配置管理使用Spring Profile管理不同环境配置创建配置文件application-dev.properties application-prod.properties启动时指定profilejava -jar your-app.jar --spring.profiles.activeprod5.2 健康检查与监控启用Actuator端点management.endpoints.web.exposure.includehealth,info,metrics management.endpoint.health.show-detailsalways配置Prometheus监控dependency groupIdio.micrometer/groupId artifactIdmicrometer-registry-prometheus/artifactId /dependency5.3 安全加固措施禁用敏感端点management.endpoints.web.exposure.excludeenv,beans添加Basic认证spring.security.user.nameadmin spring.security.user.passwordsecurepass配置HTTPSsudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d your-domain.com6. 常见问题排查6.1 内存问题排查查看JVM内存使用jstat -gc pid 1000 5生成堆转储jmap -dump:formatb,fileheap.hprof pid6.2 启动失败排查查看最近日志journalctl -u java-app --no-pager -n 1006.3 性能优化建议JVM参数优化示例-XX:UseG1GC -Xms2g -Xmx2g -XX:MaxGCPauseMillis200 -XX:ParallelGCThreads4 -XX:ConcGCThreads2连接池配置HikariCP示例spring.datasource.hikari.maximum-pool-size20 spring.datasource.hikari.connection-timeout30000 spring.datasource.hikari.idle-timeout600000在实际部署过程中我发现最容易出问题的环节是文件权限配置。建议专门为应用创建用户组并确保所有相关目录如日志目录、上传目录都有正确的权限设置。另外对于需要长时间运行的服务使用tmux或screen可以防止SSH断开导致服务终止但这只是临时方案最终还是要配置为系统服务。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价