本文目录导读:
- 核心原则
- 方法一:前后端分离(Vue/React + Node.js/Java/Go)
- 方法二:单仓库全栈应用(Next.js / Nuxt.js)
- 方法三:Monorepo(Nx / Turborepo / Lerna)
- 核心工具推荐
- 避坑指南(常见问题)
- 最佳实践(自动化部署流程示例)
- 总结建议
全栈项目的打包部署根据技术栈不同而有所差异,但核心流程都遵循前端构建 → 后端打包 → 环境配置 → 启动服务的步骤。
下面我将针对最常见的几种全栈架构(前后端分离、Next.js/SSR、单仓库Monorepo),给出标准化的部署方法。
核心原则
- 前端:使用构建工具(Vite/Webpack)将代码编译为静态 HTML/JS/CSS 文件。
- 后端:使用编译器/打包器(TypeScript Compiler, Webpack, Maven/Gradle)产出可执行代码(Node.js脚本、Java Jar包、Go二进制)。
- 静态资源:前端产物通常由 Nginx 托管,或由后端框架(如 Express 的
serve-static)托管。 - 环境变量:构建时变量(如API地址,
VITE_API_URL)和运行时变量(数据库密码)。
前后端分离(Vue/React + Node.js/Java/Go)
这是最常见的架构,前端和后端独立打包,连接方式通常是 HTTP API。
前端打包
# 以 Vite/React 为例 cd client npm install npm run build # 产出 dist/ 或 build/ 文件夹
后端打包
- Node.js (Express/NestJS)
# 通常会编译 TypeScript cd server npm install npm run build # 产出 dist/ 文件夹 # 或者直接部署源码,使用 pm2 启动
- Java (Spring Boot)
mvn clean package -DskipTests # 产出 target/*.jar 文件
- Go
go build -o ./bin/server # 产出单个二进制文件
部署到服务器(Nginx + 反向代理)
目录结构示例:
/var/www/project/
├── client/ # 前端静态文件
│ └── dist/
│ ├── index.html
│ └── assets/
└── server/ # 后端服务
├── package.json
└── index.js (或 jar 包)
Nginx配置(关键):
server {
listen 80;
server_name your-domain.com;
# 1. 前端静态文件
location / {
root /var/www/project/client/dist;
index index.html;
try_files $uri $uri/ /index.html; # 处理前端路由
}
# 2. 后端 API 反向代理
location /api/ {
proxy_pass http://localhost:3000; # 后端正运行在3000端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_bypass $http_upgrade;
}
}
优势:前后端独立部署,可以分别伸缩,Nginx 处理静态文件效率极高。
单仓库全栈应用(Next.js / Nuxt.js)
SSR 框架自带前后端整合,打包部署相对集中。
标准构建
# Next.js npm install npm run build # 产出 .next/ 文件夹 npm run start # 启动服务,通常监听 3000 端口 # Nuxt.js npm install npm run build node .output/server/index.mjs
部署方式
- 服务端部署:直接运行
npm run start,使用 PM2 守护。pm2 start npm --name my-app -- start
- Serverless 部署(推荐):使用 Vercel(Next.js 官方)、Netlify 或 Cloudflare Pages,直接将仓库连接到平台即可,无需手动配置。
Nginx 配置(如果需要)
Next.js 本身就是一个 Node.js 服务器,Nginx 只做反向代理或负载均衡,不需要托管静态文件。
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:3000;
# ... (同上文的代理头设置)
}
}
Monorepo(Nx / Turborepo / Lerna)
如果一个仓库包含多个应用(如 admin, mobile, web, server)。
打包命令
# 以 Nx 为例 npx nx run-many --target=build --all # 以 pnpm workspace 为例 pnpm --filter @project/admin build pnpm --filter @project/server build
部署策略
- 独立部署:将
packages/admin/dist部署到静态托管(如 CDN),将packages/server部署到服务器。 - 整体部署:使用 Docker,将所有产物放入一个镜像中,Nginx + Node.js 进程共存。
核心工具推荐
| 场景 | 工具 | 用途 |
|---|---|---|
| 进程守护 | PM2 | 保持 Node.js 应用在后台运行,自动重启。 |
| 反向代理 | Nginx | 处理静态文件、负载均衡、SSL(HTTPS)终结。 |
| 容器化 | Docker | 统一运行环境,保证“构建一次,到处运行”。 |
| CI/CD | GitHub Actions / GitLab CI | 自动化打包、测试、上传服务器。 |
| 配置管理 | dotenv / Docker Compose | 管理数据库密码、API Key 等敏感变量。 |
避坑指南(常见问题)
- 前端路由 404:Nginx 必须加上
try_files配置(如上面的示例),否则刷新非首页路径时会报 404。 - API 跨域:部署后不推荐使用 CORS,应使用 Nginx 反向代理(
proxy_pass),让前后端在同一个域名下。 - 环境变量:构建前端时,
VITE_API_URL必须设置为生产环境的域名(如https://your-domain.com/api)或相对路径/api。 - 端口占用:确保后端端口(3000/8080)未被占用,或使用 PM2 管理端口。
- 数据库连接池:生产环境不要使用 root 账户,限制 IP 白名单。
最佳实践(自动化部署流程示例)
使用 GitHub Actions + Docker + 阿里云/腾讯云:
- 推送代码到 GitHub
main分支。 - CI 自动触发:
- 安装依赖。
- 运行
npm run build。 - 运行测试。
- 构建 Docker 镜像。
- CD 自动触发:
- 将镜像推送到 Docker Hub / 阿里云容器镜像服务。
- SSH 登录服务器,拉取新镜像。
- 停止旧容器,启动新容器(
docker-compose up -d)。
docker-compose.yml 示例:
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./client/dist:/usr/share/nginx/html
depends_on:
- server
server:
build: ./server
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
总结建议
- 小型项目 / 个人项目:使用 Vercel(前端+极简后端)或 Railway/Fly.io(全栈一键部署)。
- 公司项目 / 正式环境:使用 Docker + Nginx + PM2,配合 CI/CD 流水线。
- SSR 项目:优先考虑平台原生部署(Vercel/Netlify),可大幅简化运维。
如果你能告诉我你的具体技术栈(Vue3 + Spring Boot / React + Node.js / Next.js + PostgreSQL),我可以给你一个更精确的、带具体命令的部署模板。