Java Spring Boot 项目部署到 Linux 服务器
Java 项目上线最容易乱在配置文件和启动方式:把环境变量、日志和进程管理先固定下来,后面维护会轻很多。
一、准备 JDK
sudo apt update
sudo apt install -y openjdk-17-jdk nginx
java -version
如果项目使用 Java 21,就安装对应 JDK,版本不要靠猜。
二、本地或 CI 打包
Maven 项目:
mvn clean package -DskipTests
Gradle 项目:
./gradlew clean bootJar
生成的 jar 一般在 target/ 或 build/libs/ 下。上传到服务器:
scp target/app.jar deploy@example.com:/opt/elik-java/app.jar
三、外置配置
线上配置建议放在 `/opt/elik-java/application-prod.yml`。
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/blog?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: blog_user
password: change-me
logging:
file:
name: /var/log/elik-java/app.log
数据库密码不要写进 Git。更推荐通过环境变量注入。
四、创建 systemd 服务
[Unit]
Description=elik Spring Boot service
After=network.target
[Service]
User=elikapp
WorkingDirectory=/opt/elik-java
Environment="SPRING_PROFILES_ACTIVE=prod"
ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar /opt/elik-java/app.jar --spring.config.additional-location=/opt/elik-java/application-prod.yml
Restart=always
RestartSec=5
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now elik-java
sudo systemctl status elik-java
五、Nginx 代理
server {
listen 80;
server_name java-api.example.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;
}
}
六、健康检查
如果引入 Actuator,可以开放健康检查:
management:
endpoints:
web:
exposure:
include: health,info
检查命令:
curl http://127.0.0.1:8080/actuator/health
journalctl -u elik-java -f
七、更新发布流程
- 停止服务或上传新 jar 到临时文件
- 备份当前 jar
- 替换 jar
- 重启服务
- 检查日志和健康接口
cp app.jar backups/app-$(date +%Y%m%d%H%M).jar
mv app-new.jar app.jar
sudo systemctl restart elik-java
Java 部署的核心不是 `java -jar`,而是让配置、进程、日志、代理和回滚形成固定流程。