引言:为何VPS是Java应用的理想之选
在虚拟专用服务器(VPS)上部署Java应用是追求对运行环境完全掌控的开发者的黄金标准。与共享主机不同,VPS提供专用资源(CPU、内存、磁盘),允许您配置Java虚拟机(JVM)、安装任意库文件,并为项目特定需求配置服务器。
本文将涵盖完整的部署流程:从准备VPS和安装JDK,到使用systemd在生产模式下运行应用。所有步骤均附有适用于Linux(Ubuntu 22.04 LTS)的代码示例和命令。
1. 准备VPS并安装所需软件
1.1. 连接服务器
购买VPS后,您将获得IP地址和root密码。通过SSH连接:
ssh root@your_server_IP建议立即创建一个非特权用户用于日常操作:
adduser deployerusermod -aG sudo deployer1.2. 安装Java(JDK 17 LTS)
OpenJDK 17最适合现代Java应用。执行:
sudo apt updatesudo apt install openjdk-17-jdk -y验证安装:
java -version# 输出: openjdk version "17.0.10" 2024-01-16 LTS1.3. 安装Git和Maven/Gradle
从仓库构建项目:
sudo apt install git maven -y# 或使用 Gradle:# sudo apt install gradle -y2. 构建并准备应用
2.1. 克隆仓库
假设您的Spring Boot应用位于GitHub上:
cd /optsudo git clone https://github.com/your_account/my-java-app.gitcd my-java-app2.2. 构建JAR文件
使用Maven:
mvn clean package -DskipTests执行后,target/目录下将生成my-app-0.0.1-SNAPSHOT.jar文件。验证其可运行性:
java -jar target/my-app-0.0.1-SNAPSHOT.jar --server.port=8080检查运行状态:在浏览器中打开http://your_IP:8080。
2.3. 优化生产环境JAR
在application.properties中添加生产参数:
server.port=8080spring.datasource.url=jdbc:postgresql://localhost:5432/mydbspring.datasource.username=app_userspring.datasource.password=secure_passwordspring.jpa.hibernate.ddl-auto=validate切勿在代码中存储真实密码——应使用环境变量或Vault。
3. 配置数据库与环境
3.1. 安装PostgreSQL
sudo apt install postgresql postgresql-contrib -ysudo systemctl start postgresqlsudo systemctl enable postgresql创建数据库和用户:
sudo -u postgres psqlCREATE DATABASE mydb;CREATE USER app_user WITH PASSWORD 'secure_password';GRANT ALL PRIVILEGES ON DATABASE mydb TO app_user;\\q3.2. 配置环境变量
创建文件/etc/environment.d/java-app.conf:
DB_URL=jdbc:postgresql://localhost:5432/mydbDB_USER=app_userDB_PASSWORD=secure_passwordJAVA_OPTS="-Xms256m -Xmx512m"重新加载环境:
source /etc/environment.d/java-app.conf4. 将应用作为systemd服务运行
4.1. 创建单元文件
创建文件/etc/systemd/system/java-app.service:
[Unit]Description=Java Spring Boot ApplicationAfter=network.target postgresql.service
[Service]User=deployerWorkingDirectory=/opt/my-java-appExecStart=/usr/bin/java $JAVA_OPTS -jar /opt/my-java-app/target/my-app-0.0.1-SNAPSHOT.jarSuccessExitStatus=143Restart=alwaysRest