资讯动态

Midway 应用生产部署:使用 PM2 实现进程守护、负载均衡与 Docker 容器化启动

发布时间:2026/10/9 5:02:26 来源:尧图企业网站定制
后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载本文聚焦 Midway 框架在生产环境中最常用的进程管理方案 PM2。围绕部署流程、常用命令、Cluster 多实例启动、Docker 容器内的pm2-runtime用法展开并结合仓库内的启动器源码与示例工程讲解bootstrap.js入口背后的信号处理与优雅退出机制。读完本文你可以独立完成 Midway 应用的 PM2 部署、多进程扩容和容器化运行。为什么 Midway 部署推荐使用 PM2PM2。PM2 可以简化 Node 应用管理的很多繁琐任务典型能力包括性能监控通过pm2 monit或 Web 面板查看 CPU、内存占用自动重启进程崩溃后自动拉起保证服务可用性负载均衡以 Cluster 模式启动多实例利用内置负载均衡器分发请求日志管理统一收集 stdout/stderr 输出并滚动落盘。由于 Midway 官方文档将 PM2 作为线上部署的推荐方案中文文档 / 英文 3.0 版本文档本文将以此为主线完整展开。安装 PM2一般将 PM2 安装到全局便于在任何项目目录下直接使用$ npm install pm2 -g # 命令行安装 pm2安装后可通过pm2 -v验证版本。如果服务器环境不允许全局安装也可以安装到项目本地并通过npx pm2调用但全局安装更符合常规运维习惯。常用命令启动、查看、停止与删除PM2 的核心操作命令如下$ pm2 start # 启动一个服务 $ pm2 list # 列出当前的服务 $ pm2 stop # 停止某个服务 $ pm2 restart # 重启某个服务 $ pm2 delete # 删除某个服务 $ pm2 logs # 查看服务的输出日志执行pm2 list后服务会以表格形式展示包含进程 id、应用名、模式fork/cluster、状态、重启次数、CPU 与内存占用等字段。PM2 会为每个服务分配一个数组形式的 id可以直接用 id 快速操作$ pm2 stop 1 # 停止编号为 1 的服务 $ pm2 delete 1 # 删除编号为 1 的服务用 --name 为应用命名纯数字 id 在多应用环境下不直观PM2 支持通过--name参数为应用指定名称$ pm2 start ./bootstrap.js --name test_app之后就可以用应用名来操作启停语义更清晰$ pm2 stop test_app $ pm2 restart test_app启动 Midway 应用从构建到 PM2 托管第一步先构建再部署Midway 项目由 TypeScript 编写部署前必须先执行编译。项目根目录的package.json中通常预置了build脚本例如仓库内的 koa-esm-app 示例 使用tsc -p tsconfig.json构建benchmark中的 midway-request-scope 示例 使用tsc构建。标准流程为$ npm install # 安装依赖 $ npm run build # 编译 TypeScript产出 dist 目录 $ npm prune --production # 可选移除开发依赖缩小发布包:::info 部署前需要执行编译npm run build否则dist目录不存在线上启动会失败。 :::构建完成后项目结构大致如下dist是 Midway 构建产物目录bootstrap.js是部署启动文件my_midway_app ├── src ├── dist # Midway 构建产物目录 ├── node_modules # Node.js 依赖包目录 ├── bootstrap.js # 部署启动文件 ├── package.json └── tsconfig.json第二步理解 bootstrap.js 入口Midway 应用需要一个入口文件bootstrap.js。仓库内 koa-esm-app 示例入口 使用 ESM 写法import { Bootstrap } from midwayjs/bootstrap; await Bootstrap.run();传统 CommonJS 写法见 部署与启动文档const { Bootstrap } require(midwayjs/bootstrap); Bootstrap.run();入口代码虽然简单但不可缺少——后续的链路追踪、进程信号处理等场景都依赖这个文件。注意入口文件本身不包含 HTTP 监听端口配置端口由midwayjs/koa、midwayjs/web等具体框架的配置决定。第三步npm run start 与 PM2 命令的对应关系Midway 应用一般使用npm run start做线上部署。仓库内 koa-esm-app 示例 的start脚本即为start: cross-env NODE_ENVproduction node ./bootstrap.js也就是说npm run start对应的原始命令是$ NODE_ENVproduction node bootstrap.js将其托管给 PM2 时对应的命令为$ NODE_ENVproduction pm2 start ./bootstrap.js --name midway_app -i 4其中--name指定应用名这里是midway_app-i指定启动的实例数进程数-i 4表示启动 4 个实例PM2 会以cluster 模式启动由内置负载均衡器分发请求。-i max则按 CPU 核心数自动决定实例数。之所以显式设置NODE_ENVproduction是因为服务器环境通常以生产模式运行许多库在该环境下启用缓存、优化报错处理Midway 也依赖该环境变量区分配置config.prod.ts等。更完整的部署流程说明可参考 启动和部署文档。Cluster 模式的源码佐证PM2 的-i多实例本质是利用 Node.js 的 cluster 能力。从 Midway 的启动器源码 packages/bootstrap/src/bootstrap.ts 可以看到bootstrap 也提供了对应的多进程支撑当环境变量MIDWAY_FORK_MODEcluster时创建ChildProcessEventBus子进程事件总线当MIDWAY_FORK_MODEthread时创建ThreadEventBus线程事件总线用于在多进程/多线程场景下保持内部事件的同步若配合MIDWAY_STICKY_MODEtrue还会为 socket.io 应用启用粘性会话支持packages/bootstrap/src/bootstrap.ts#L70-L79。这说明 Midway 的入口代码可以天然适配 PM2 cluster 模式下的多进程运行。运维操作日志、重启与状态查看应用启动后日常运维围绕几条命令展开$ pm2 list # 查看所有服务状态与资源占用 $ pm2 logs midway_app # 实时查看指定应用的输出日志 $ pm2 restart midway_app # 重启应用平滑拉起新进程 $ pm2 stop midway_app # 停止应用 $ pm2 delete midway_app # 从 PM2 管理中删除应用pm2 logs会聚合 stdout/stderr结合 Midway 自身的日志体系默认输出到项目的logs目录生产环境建议配置到不受项目更新影响的固定目录如home/admin/logs便于日志采集工具抓取可以实现完整的线上排障链路。优雅退出PM2 stop 背后的信号机制执行pm2 stop或pm2 restart时PM2 会向进程发送终止信号Midway 的 bootstrap 对此做了专门处理。查看 启动器源码Bootstrap.run()会注册SIGINT、SIGQUIT、SIGTERM与exit事件监听收到信号后调用stop()经由destroyGlobalApplicationContext依次销毁依赖注入容器与应用上下文完成资源释放后以退出码 0 结束进程异常路径则记录错误并以退出码 1 结束。这意味着使用 PM2 管理 Midway 应用时停止/重启不会强杀进程而是触发框架层面的优雅关闭流程。Docker 容器内的启动pm2-runtime在 Docker 容器中后台启动的代码daemon 化的进程都会被容器运行时退出达不到预期效果——这也是很多用户在容器里直接pm2 start却启动即退的根因。PM2 为此提供了专门的容器化命令pm2-runtime它以前台模式运行保证进程与容器生命周期一致。请将启动命令修改为$ NODE_ENVproduction pm2-runtime start ./bootstrap.js --name midway_app -i 4在编写 Dockerfile 时可直接将pm2-runtime写入 CMD 或 entrypoint。仓库的 部署与启动文档 同样强调当使用 pm2 部署时请将命令修改为pm2-runtime start。例如FROM node:18 WORKDIR /app COPY . . RUN npm install RUN npm run build EXPOSE 7001 CMD [npx, pm2-runtime, start, ./bootstrap.js, --name, midway_app, -i, 4]关于 PM2 容器部署的更多细节如日志转发、前台运行的行为差异请参考 PM2 官方对 Container Support 的说明其核心原则是容器内的进程管理工具必须以前台非守护方式运行pm2-runtime正是为此设计。小结将 Midway 应用交给 PM2 托管完整链路可以概括为npm run build编译出dist产物准备bootstrap.js入口依赖midwayjs/bootstrap项目默认自带普通服务器使用NODE_ENVproduction pm2 start ./bootstrap.js --name midway_app -i 4启动Docker 容器内改用pm2-runtime start保持前台运行日常通过pm2 list / logs / restart / stop / delete运维利用--name命名、按 id 快速操作。Midway 的启动器为 PM2 等外部进程管理工具提供了完善的配合入口简单、支持 Cluster 多实例、具备信号监听与优雅退出能力。无论是单机多核扩容、还是容器化部署这套组合都是生产环境里成熟且可复用的方案。相关源码与示例可继续在仓库内查阅启动器实现、ESM 示例工程、部署文档。赞分享后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载相关推荐Midway 应用 PM2 生产部署指南从安装、进程管理到 Docker 容器化Midway 应用 PM2 生产部署指南从安装、进程管理到 Docker 容器化 PM2 是带内置负载均衡器的 Node.js 应用生产级进程管理器Midw后端微服务云原生Absinthe生产环境部署Docker容器化与负载均衡配置Absinthe生产环境部署Docker容器化与负载均衡配置 想要将你的GraphQL API部署到生产环境Absinthe作为Elixir生态中最强大的G后端PM2 进程管理器实战指南守护进程、集群负载均衡、日志管理与开机自启PM2 进程管理器实战指南守护进程、集群负载均衡、日志管理与开机自启 PM2 是面向 Node.js / Bun 应用的生产级进程管理器内置负载均衡器本指运维CLI可观测性上一篇3步掌握Playwright MCP突破浏览器自动化的持久化瓶颈下一篇Unity卡牌游戏UI开发终极指南5步打造专业级交互体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑