代码部署入门:从本地到服务器
代码写完了,怎么部署到服务器上?
今天分享几种常用的部署方式,从简单到规范。
方式一:手动上传
最原始的方式,用scp或sftp上传。
scp上传:
# 上传单个文件
scp app.jar root@服务器IP:/opt/app/
# 上传整个目录
scp -r dist/ root@服务器IP:/var/www/
然后SSH上去启动:
ssh root@服务器IP
cd /opt/app
java -jar app.jar
简单粗暴,适合个人项目。
方式二:rsync同步
比scp更智能,只传输变化的文件:
rsync -avz –delete dist/ root@服务器IP:/var/www/mysite/
参数说明:
- -a 归档模式,保留权限等
- -v 显示详情
- -z 压缩传输
- –delete 删除目标端多余的文件
比scp快,适合文件多的项目。
方式三:简单部署脚本
把部署步骤写成脚本:
#!/bin/bash
# deploy.sh
SERVER="root@服务器IP"
APP_PATH="/opt/app"
JAR_NAME="myapp.jar"
echo "1. 打包…"
mvn clean package -DskipTests
echo "2. 上传…"
scp target/$JAR_NAME $SERVER:$APP_PATH/
echo "3. 重启服务…"
ssh $SERVER << 'EOF'
cd /opt/app
pid=$(pgrep -f myapp.jar)
if [ -n "$pid" ]; then
kill $pid
sleep 3
fi
nohup java -jar myapp.jar > app.log 2>&1 &
echo "启动完成"
EOF
echo "部署完成!"
以后部署只需要:
./deploy.sh
方式四:使用systemd管理
把应用注册成系统服务,方便管理。
创建服务文件:
sudo vim /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target
[Service]
Type=simple
User=app
WorkingDirectory=/opt/app
ExecStart=/usr/bin/java -jar /opt/app/myapp.jar
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
启用服务:
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
管理命令:
systemctl start myapp # 启动
systemctl stop myapp # 停止
systemctl restart myapp # 重启
systemctl status myapp # 查看状态
journalctl -u myapp -f # 查看日志
方式五:Docker部署
用Docker打包,环境一致性更好。
Dockerfile:
FROM openjdk:17-slim
WORKDIR /app
COPY target/myapp.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
构建和运行:
# 本地构建镜像
docker build -t myapp:v1 .
# 保存镜像
docker save myapp:v1 | gzip > myapp.tar.gz
# 上传到服务器
scp myapp.tar.gz root@服务器IP:/opt/
# 服务器上加载运行
ssh root@服务器IP
docker load < myapp.tar.gz
docker run -d -p 8080:8080 –name myapp myapp:v1
前端项目部署
前端打包后是静态文件,上传到Nginx目录就行。
打包:
npm run build
上传:
rsync -avz –delete dist/ root@服务器IP:/var/www/mysite/
Nginx配置:
server {
listen 80;
server_name example.com;
root /var/www/mysite;
location / {
try_files $uri $uri/ /index.html;
}
}
部署脚本进阶版
加上备份和回滚功能:
#!/bin/bash
# deploy.sh
SERVER="root@服务器IP"
APP_PATH="/opt/app"
BACKUP_PATH="/opt/backup"
JAR_NAME="myapp.jar"
DATE=$(date +%Y%m%d_%H%M%S)
echo "1. 打包…"
mvn clean package -DskipTests
echo "2. 备份旧版本…"
ssh $SERVER "cp $APP_PATH/$JAR_NAME $BACKUP_PATH/${JAR_NAME}_$DATE"
echo "3. 上传新版本…"
scp target/$JAR_NAME $SERVER:$APP_PATH/
echo "4. 重启服务…"
ssh $SERVER "systemctl restart myapp"
echo "5. 健康检查…"
sleep 10
if curl -s http://服务器IP:8080/health | grep -q "UP"; then
echo "部署成功!"
else
echo "部署失败,正在回滚…"
ssh $SERVER "cp $BACKUP_PATH/${JAR_NAME}_$DATE $APP_PATH/$JAR_NAME"
ssh $SERVER "systemctl restart myapp"
fi
常见问题
Q:部署后启动失败?
Q:服务启动很慢?
参考前面的SpringBoot启动优化文章。
Q:怎么做到零停机部署?
需要负载均衡+滚动更新,后面可以单独讲。
远程部署技巧
我管理多个环境(开发、测试、生产),用星空组网把它们连起来,部署脚本里直接用虚拟IP:
# 部署到测试环境
scp target/myapp.jar root@10.26.1.10:/opt/app/
# 部署到生产环境
scp target/myapp.jar root@10.26.1.20:/opt/app/
不用配VPN,在哪都能部署,很方便。
部署方式选择
| 个人项目 | scp + 脚本 |
| 小团队 | rsync + systemd |
| 正规项目 | Docker + CI/CD |
| 大型项目 | Kubernetes |
小结
部署的核心步骤:
从简单开始,慢慢规范化。
有问题评论区交流~
网硕互联帮助中心





评论前必须登录!
注册