全栈项目云部署实战指南:从环境搭建到服务发布

一、云服务器选型与准备
1.1 服务器选型原则
选择云服务器需综合考虑稳定性、性能和成本。建议选择提供弹性扩展能力的计算实例,根据项目负载选择合适配置(通常2核4G起步)。对于高可用场景,建议选择多可用区部署方案。

1.2 服务器获取与初始化
通过主流云控制台创建实例时,建议:

  • 选择CentOS 8或Ubuntu 20.04 LTS系统
  • 配置安全组规则开放必要端口(22/80/443/3306等)
  • 创建具有sudo权限的专用部署用户

二、基础环境搭建
2.1 Java运行环境配置

  1. # 安装OpenJDK 11(推荐LTS版本)
  2. sudo yum install -y java-11-openjdk-devel
  3. # 配置JAVA_HOME环境变量
  4. echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk' >> ~/.bashrc
  5. echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
  6. source ~/.bashrc
  7. # 验证安装
  8. java -version
  9. javac -version

2.2 MySQL数据库部署

  1. # 安装MySQL 8.0社区版
  2. sudo yum install -y mysql-community-server
  3. # 启动服务并设置开机自启
  4. sudo systemctl enable --now mysqld
  5. # 安全初始化
  6. sudo mysql_secure_installation
  7. # 创建应用数据库(示例)
  8. mysql -u root -p <<EOF
  9. CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  10. CREATE USER 'app_user'@'%' IDENTIFIED BY 'SecurePass123!';
  11. GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';
  12. FLUSH PRIVILEGES;
  13. EOF

2.3 Web服务器配置

  1. # 安装Nginx稳定版
  2. sudo yum install -y nginx
  3. # 配置反向代理(示例配置)
  4. cat > /etc/nginx/conf.d/app.conf <<EOF
  5. server {
  6. listen 80;
  7. server_name your-domain.com;
  8. location / {
  9. root /var/www/html;
  10. try_files \$uri \$uri/ /index.html;
  11. }
  12. location /api {
  13. proxy_pass http://localhost:8080;
  14. proxy_set_header Host \$host;
  15. proxy_set_header X-Real-IP \$remote_addr;
  16. }
  17. }
  18. EOF
  19. # 测试配置并启动
  20. sudo nginx -t
  21. sudo systemctl enable --now nginx

2.4 Node.js环境搭建

  1. # 使用nvm管理多版本Node.js
  2. curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
  3. source ~/.bashrc
  4. # 安装LTS版本
  5. nvm install --lts
  6. # 验证安装
  7. node -v
  8. npm -v

三、项目构建与打包
3.1 后端项目构建
对于Maven项目:

  1. <!-- pom.xml 关键配置示例 -->
  2. <build>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-maven-plugin</artifactId>
  7. <configuration>
  8. <executable>true</executable>
  9. </configuration>
  10. </plugin>
  11. </plugins>
  12. </build>

构建命令:

  1. mvn clean package -DskipTests
  2. # 生成的可执行jar包位于target目录

3.2 前端项目构建
Vue/React项目配置示例:

  1. // vue.config.js 示例
  2. module.exports = {
  3. publicPath: process.env.NODE_ENV === 'production' ? '/static/' : '/',
  4. productionSourceMap: false,
  5. configureWebpack: {
  6. output: {
  7. filename: 'js/[name].[contenthash:8].js',
  8. chunkFilename: 'js/[name].[contenthash:8].js'
  9. }
  10. }
  11. }

构建命令:

  1. npm install
  2. npm run build
  3. # 生成的静态资源位于dist目录

四、自动化部署方案
4.1 文件传输方案
推荐使用rsync替代scp实现增量同步:

  1. # 安装rsync
  2. sudo yum install -y rsync
  3. # 后端部署示例
  4. rsync -avz --progress target/app.jar user@server:/opt/app/
  5. # 前端部署示例
  6. rsync -avz --delete dist/ user@server:/var/www/html/

4.2 服务管理脚本
创建部署脚本deploy.sh

  1. #!/bin/bash
  2. APP_NAME="app-service"
  3. JAR_PATH="/opt/app/app.jar"
  4. LOG_PATH="/var/log/$APP_NAME.log"
  5. case "$1" in
  6. start)
  7. nohup java -jar $JAR_PATH >> $LOG_PATH 2>&1 &
  8. echo "$APP_NAME started"
  9. ;;
  10. stop)
  11. pkill -f $JAR_PATH
  12. echo "$APP_NAME stopped"
  13. ;;
  14. restart)
  15. $0 stop
  16. sleep 3
  17. $0 start
  18. ;;
  19. status)
  20. if pgrep -f $JAR_PATH > /dev/null; then
  21. echo "$APP_NAME is running"
  22. else
  23. echo "$APP_NAME is stopped"
  24. fi
  25. ;;
  26. *)
  27. echo "Usage: $0 {start|stop|restart|status}"
  28. exit 1
  29. esac

五、高级部署技巧
5.1 零停机部署
采用蓝绿部署策略:

  1. 准备两个相同环境的服务器组(蓝组/绿组)
  2. 通过负载均衡器切换流量
  3. 使用Nginx的upstream模块实现平滑切换

5.2 容器化部署方案
Docker部署示例:

  1. # 后端Dockerfile
  2. FROM openjdk:11-jre-slim
  3. VOLUME /tmp
  4. ARG JAR_FILE=target/*.jar
  5. COPY ${JAR_FILE} app.jar
  6. ENTRYPOINT ["java","-jar","/app.jar"]
  7. # 构建镜像
  8. docker build -t app-backend .
  9. # 运行容器
  10. docker run -d -p 8080:8080 --name backend app-backend

5.3 监控告警配置
建议集成以下监控方案:

  • 基础监控:CPU/内存/磁盘使用率
  • 应用监控:JVM堆内存/GC次数/接口响应时间
  • 日志监控:错误日志实时告警

六、常见问题解决方案
6.1 端口冲突处理

  1. # 检查端口占用
  2. ss -tulnp | grep :8080
  3. # 终止占用进程
  4. kill -9 <PID>

6.2 文件权限问题

  1. # 修改目录所有者
  2. sudo chown -R user:user /opt/app
  3. # 设置正确权限
  4. sudo chmod -R 755 /opt/app

6.3 数据库连接失败
检查项:

  • 防火墙是否放行3306端口
  • MySQL是否绑定0.0.0.0
  • 用户权限是否配置正确

总结:通过标准化部署流程和自动化工具链的建立,可以显著提升项目交付效率和质量。建议将部署脚本纳入版本控制,配合CI/CD流水线实现全自动化部署。对于生产环境,建议采用容器编排平台(如Kubernetes)实现更高级的部署策略和弹性伸缩能力。