✉ 第18节:部署与监控 - Docker 部署、PM2 进程管理、健康检查
📌 引言
👋 大家好,我是老曹。在现代 Web 开发中,应用程序的部署和监控是确保其稳定性和性能的关键环节。随着容器化技术(如Docker)和进程管理工具(如 PM2)的普及,开发者可以更高效地部署和管理他们的应用。
在本节课中,我们将学习如何使用 Docker 将 Koa 应用容器化,使用 PM2 管理 Node.js 进程,并实现健康检查以确保服务的可用性。通过理论讲解和代码示例,你将掌握从开发到生产环境的完整部署流程。
🎯 学习目标
-
掌握 Docker 容器化部署的基本流程
- 编写
Dockerfile和docker-***pose.yml文件。 - 构建和运行 Docker 容器。
- 编写
-
熟悉 PM2 进程管理器的功能与用法
- 使用 PM2 启动和管理 Koa 应用。
- 配置 PM2 的集群模式以提升性能。
-
实现健康检查端点
- 编写健康检查接口,用于监控服务状态。
- 配合负载均衡器或监控工具使用健康检查。
-
配置环境变量与日志管理
- 使用环境变量管理敏感信息和配置。
- 配置日志输出以便于问题排查。
-
了解部署与监控的最佳实践
- 掌握如何优化部署流程。
- 学会使用监控工具跟踪应用性能。
✨ 核心知识点讲解
🔹 1. Docker 容器化部署
📝 Docker 的优势
- 一致性:无论在哪种环境中运行,容器化的应用都能保持一致的行为。
- 隔离性:每个容器独立运行,避免依赖冲突。
- 可移植性:轻松将应用从开发环境迁移到生产环境。
📝 编写 Dockerfile
以下是为 Koa 应用编写的 Dockerfile 示例:
# 基础镜像
FROM node:16-alpine
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install --production
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["npm", "start"]
📝 构建与运行容器
✅1. 构建镜像:
docker build -t koa-app .
✅2. 运行容器:
docker run -p 3000:3000 koa-app
📝 使用 Docker ***pose
对于多容器应用,可以使用 docker-***pose.yml 简化管理:
version: '3'
services:
app:
image: koa-app
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
运行命令:
docker-***pose up --build
🔹 2. PM2 进程管理器
📝 PM2 的功能
- 进程守护:确保应用在崩溃后自动重启。
- 负载均衡:支持多核 CPU 的集群模式。
- 日志管理:集中管理应用日志,便于排查问题。
📝 安装与基本用法
✅1. 安装 PM2:
npm install -g pm2
✅2. 启动应用:
pm2 start app.js
✅3. 查看运行状态:
pm2 list
📝 配置文件示例
创建 ecosystem.config.js 文件:
module.exports = {
apps: [{
name: 'koa-app',
script: './app.js',
instances: 'max', // 使用所有 CPU 核心
exec_mode: 'cluster', // 集群模式
env: {
NODE_ENV: 'development'
},
env_production: {
NODE_ENV: 'production'
}
}]
};
启动命令:
pm2 start ecosystem.config.js --env production
📝 日志管理
PM2 自动生成日志文件,默认路径为:
- 错误日志:
~/.pm2/logs/<app-name>-error.log - 输出日志:
~/.pm2/logs/<app-name>-out.log
🔹 3. 实现健康检查端点
📝 健康检查的作用
健康检查接口用于监控服务的运行状态,通常被负载均衡器或监控工具调用,确保服务的高可用性。
📝 代码实现
以下是一个简单的健康检查接口示例:
const Router = require('@koa/router');
const router = new Router();
router.get('/health', async (ctx) => {
ctx.status = 200;
ctx.body = {
status: 'OK',
timestamp: new Date().toISOString(),
uptime: process.uptime()
};
});
module.exports = router;
📝 集成到 Koa 应用
在主文件中注册健康检查路由:
const Koa = require('koa');
const healthRouter = require('./routes/health');
const app = new Koa();
app.use(healthRouter.routes());
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
访问健康检查接口:http://localhost:3000/health
🔹 4. 环境变量与配置管理
📝 为什么要使用环境变量?
- 安全性:避免将敏感信息(如数据库密码)硬编码到代码中。
- 灵活性:根据环境动态调整配置,例如开发环境和生产环境的不同设置。
📝 加载环境变量
可以使用 dotenv 包加载 .env 文件中的变量:
# .env 文件
NODE_ENV=production
PORT=3000
DB_URL=mongodb://localhost:27017/mydb
在代码中加载:
require('dotenv').config();
const port = process.env.PORT || 3000;
const dbUrl = process.env.DB_URL;
console.log(`Running in ${process.env.NODE_ENV} mode`);
console.log(`Database URL: ${dbUrl}`);
🔹 5. 部署与监控的最佳实践
📝 优化部署流程
- 自动化构建:使用 CI/CD 工具(如 Jenkins 或 GitHub Actions)自动化构建和部署流程。
- 蓝绿部署:通过蓝绿部署策略减少停机时间。
- 版本控制:为每个版本打上标签,方便回滚。
📝 日志与监控
- 日志收集:使用 ELK(Elasticsearch, Logstash, Kibana)堆栈集中管理日志。
- 性能监控:集成 Prometheus 和 Grafana 监控应用性能指标。
📝 总结
🎉 到这里,我们已经完整地学习了如何使用 Docker、PM2 和健康检查来部署和监控 Koa 应用。以下是本节课的重点内容回顾:
- 使用 Docker 容器化部署 Koa 应用,包括编写
Dockerfile和docker-***pose.yml文件。 - 使用 PM2 管理 Node.js 进程,支持集群模式和日志管理。
- 实现健康检查接口,确保服务的高可用性。
- 使用环境变量管理配置,提升安全性和灵活性。
- 掌握部署与监控的最佳实践,优化生产环境的运维流程。
🍉希望这些知识能够帮助你在未来的项目中更高效地部署和监控你的应用!如果还有任何疑问,欢迎随时提问!
📚 参考资料
- Docker 官方文档
- PM2 官方文档
- Prometheus 官方文档
- Grafana 官方文档