Node.js 实战八:服务部署方案对比与实践
你开发好了接口,准备上线,然后开始犹豫:
“直接 node app.js 启就行了吗?”
“要不要用 PM2?听说 Docker 更稳?”
“Serverless 是不是就不用管服务器了?”
部署是从“能运行”到“能长久运行”的关键步骤,
本篇带你系统梳理:
Node.js 项目的三种主流部署方案: PM2、Docker、Serverless 的实战选型、优劣分析与落地方式。
一、PM2:经典守护进程管理器(最上手的生产方案)
特点:
-
保证服务挂了自动重启
-
支持多进程集群模式
-
日志管理 + 状态监控
-
配置简单,快速落地
安装与使用:
npm install pm2 -g
pm2 start src/app.js --name my-api
pm2 save
pm2 startup # 设置系统开机自启
可搭配 ecosystem.config.js:
module.exports = {apps: [{name: 'api',script: './src/app.js',instances: 2,exec_mode: 'cluster',env: {NODE_ENV: 'production',PORT: 3000}}]
};
二、Docker:标准化容器部署(跨平台一致性首选)
特点:
-
“打包你的运行环境”:Node 版本、依赖、系统一次封装
-
易于迁移、CI 集成、团队协作
-
方便搭配 Nginx、数据库、Redis 等服务统一管理
示例 Dockerfile:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
CMD ["node", "src/app.js"]
构建镜像并运行:
docker build -t my-api .
docker run -d -p 3000:3000 my-api
三、Serverless:部署都不用部署(低运维模式)
特点:
-
只写函数,不管服务器(函数即服务)
-
资源自动伸缩、按量计费
-
适合轻量 API、小工具、Webhook、定时任务等场景
常见平台:
平台 | 特点 |
---|---|
Vercel / Netlify | 简洁部署、CI 友好,适合全栈 + API 项目 |
AWS Lambda | 配合 API Gateway,配置自由度高 |
腾讯云 / 阿里云函数计算 | 本地 SDK 支持、日志可视化 |
示例(Vercel):
-
在项目中创建 api/hello.js
-
module.exports = (req, res) => { res.send("Hi!"); }
-
一键部署 vercel
四、选型建议表格(按场景)
场景 | 推荐方式 | 理由 |
---|---|---|
快速上线中小项目 | PM2 | 简单、部署快 |
多服务协同 / 跨机部署 | Docker | 环境一致、易维护 |
低访问量 / 定时触发 / 静态 API | Serverless | 省事省钱、运维低 |
团队持续集成 + 云平台部署 | Docker / Serverless | 与 CI/CD 配合好 |
五、组合拳方案推荐
-
Docker + PM2:容器内运行 PM2,多进程调度 + 稳定容器发布
-
Serverless + 本地调试模拟器:开发体验不打折
-
Nginx + PM2 集群 + Redis:构建传统高可用后端体系
六、部署中常见问题
问题 | 建议处理 |
---|---|
服务挂掉没日志 | 用 PM2 / Docker + volume 持久化日志 |
跨域问题 | 配置好 Nginx / Gateway 代理规则 |
内存泄漏 | 定时重启 PM2 实例 / 监控 Heap |
端口冲突 | 每服务独立配置 PORT 或使用容器网络 |
热更新 | 使用 nodemon(开发)或 watch 模式自动 reload |
总结
“写完就上线”只是开始,
你还要考虑的是:
-
它会不会挂?挂了能不能自动拉起来?
-
升级快不快?版本能不能回滚?
-
团队成员能不能一键部署,统一环境?
真正的上线,不只是让用户“能访问”,而是让你“敢迭代”。