文章目录
- [现代 Web 全栈打包与生产部署架构指南](#现代 Web 全栈打包与生产部署架构指南)
-
- 一、核心角色分工(通俗比喻)
- 二、前后端打包方式
-
- [1. 前端打包(代码压制)](#1. 前端打包(代码压制))
- [2. 后端主流产物](#2. 后端主流产物)
- [三、后端必须打包进 Docker 镜像吗?(可选性说明)](#三、后端必须打包进 Docker 镜像吗?(可选性说明))
-
- [方案 A:不进 Docker(直接在宿主机裸跑 / PM2 守护)](#方案 A:不进 Docker(直接在宿主机裸跑 / PM2 守护))
- [方案 B:打包进 Docker 镜像(企业级生产主流)](#方案 B:打包进 Docker 镜像(企业级生产主流))
- 四、生产环境典型协同落地架构
现代 Web 全栈打包与生产部署架构指南
一、核心角色分工(通俗比喻)
- Nginx(前台大堂经理 / 安全防爆门) :
- 守住外网入口(默认的
80和443端口)。 - 负责域名绑定、挂载 HTTPS 证书(加解密性能极高)、拦截高并发恶意请求。
- 根据访问路径分流:网页请求直接秒发前端文件,数据接口请求悄悄转发给后端。
- 守住外网入口(默认的
- 前端产物(展厅海报与货架) :
- 打包出来的纯静态网页文件,不消耗服务器计算性能,直接由 Nginx 秒发给用户浏览器。
- 后端服务(后厨大厨) :
- 隐藏在服务器内部端口(如
3000),专心跑业务逻辑与数据库读写,不直面公网冲击。
- 隐藏在服务器内部端口(如
二、前后端打包方式
前后端必须分开独立打包。前端改样式无需重启后端接口;后端改接口逻辑无需重新发布静态网页。
1. 前端打包(代码压制)
- 主流工具:Vite(极快,新项目标配)、Webpack(成熟稳定)。
- 操作命令 :
npm run build - 产物 :根目录下生成
dist/静态文件夹(包含index.html、压缩混淆后的.js、.css及图片)。 - 为何代码像"天书" :
- 混淆与压缩(Minify):变量名缩为单字母,去除所有空格换行,防源码泄露且体积减少 70%~90%。
- 降级转译:将 TypeScript / ES6+ 语法转为通用 JavaScript,适配所有浏览器。
- 分包优化(Tree-shaking):自动剔除未引用的无用代码。
2. 后端主流产物
- Node.js (Express / NestJS):编译后的 JavaScript 代码 + 生产依赖环境。
- Java (Spring Boot) :通过 Maven/Gradle 打成一个独立的
.jar包。 - Python (FastAPI / Django) :代码目录 + 精简的
requirements.txt。 - Go 语言:直接交叉编译生成单一的二进制可执行文件。
三、后端必须打包进 Docker 镜像吗?(可选性说明)
结论:不是必须,Docker 属于"强烈推荐的工程规范",不是强制绑定的技术枷锁。
方案 A:不进 Docker(直接在宿主机裸跑 / PM2 守护)
-
适用场景:个人开发、简单 Demo、团队规模小且服务器环境相对固定的场景。
-
做法 :
-
服务器安装对应的语言环境(如 Node.js、JDK、Python)。
-
把后端文件传到服务器,使用 PM2 (Node 环境推荐)或 Systemd 进行后台进程守护与崩溃自启:
bashpm2 start server.js --name my-api
-
-
缺点:服务器重装或换机器时需要重新配环境,容易出现"我电脑上能跑,服务器跑不起来"的环境冲突。
方案 B:打包进 Docker 镜像(企业级生产主流)
-
适用场景:团队协作、标准化交付、多环境迁移、CI/CD 自动化流水线。
-
做法 :
-
编写
Dockerfile,将代码、系统底层、依赖版本统统封进一个黑盒镜像。 -
服务器只需安装 Docker,一行命令直接起停:
bashdocker run -d -p 3000:3000 --name my-api my-image:v1
-
-
核心优势:环境高度隔离,完全消除服务器底层版本差异,换任何服务器都能秒级部署。
四、生产环境典型协同落地架构
text
用户浏览器
│ (访问域名: abc.com 或发起请求)
▼
[ Nginx 网关 ] : 监听 80 / 443 端口 (配置 SSL 证书)
│
├── ① 访问静态网页 ( / ) ──────────► 直接读取宿主机中的 /dist 目录 (纯静态秒开)
│
└── ② 访问业务接口 ( /api/* ) ──────► 转发到内部端口 127.0.0.1:3000
│
▼
[ 后端服务 (Node/Java/Python) ]
(可由 Docker 容器或 PM2 守护运行)
Nginx 核心分流配置示例
text
server {
listen 80;
server_name example.com;
# 1. 静态前端页面托管
location / {
root /usr/share/nginx/html/dist; # 前端 build 产物目录
index index.html;
try_files $uri$uri/ /index.html; # 解决前端路由刷新 404 问题
}
# 2. 后端数据接口代理
location /api/ {
proxy_pass [http://127.0.0.1:3000/](http://127.0.0.1:3000/); # 转发给后端服务真实运行端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}