使用PM2实现零停机部署遇端口冲突问题求助
问题分析与解决方案
端口冲突是否正常?
不正常。PM2的集群模式(exec_mode: "cluster")基于Node.js原生cluster模块实现,主进程会负责监听端口并将请求转发给子进程,子进程无需单独处理端口监听逻辑,因此不会出现端口冲突。你遇到的问题是配置错误导致PM2的集群机制未生效。
核心问题:PM2配置错误
你的ecosystem.config.js中用script: "yarn"和args: "start:stag"让PM2启动了yarn进程,而非直接启动Node.js应用进程。这种情况下:
- PM2无法直接管理Express应用的子进程,而是管理yarn进程
- yarn启动的两个Express实例会各自独立监听3000端口,必然导致冲突
修正配置实现集群模式
将配置改为直接指向Express应用的入口文件,让PM2直接管理Node进程:
module.exports = { apps : [{ name : "enterprise", script : "./app.js", // 替换为你的Express实际入口文件路径(比如bin/www) instances: 2, exec_mode: "cluster", error_file: "./error-log", cwd: "project/packages/backend", // 用env字段配置环境变量,替代yarn脚本的环境参数 env_stag: { NODE_ENV: "staging", // 其他 staging 环境需要的变量 } }] }
启动命令:
pm2 start ecosystem.config.js --env stag
实现零停机部署
配置正确后,使用PM2的reload命令实现零停机部署:
pm2 reload enterprise
reload会逐个重启集群实例,确保在更新过程中始终有可用实例处理请求,实现零停机。
额外说明
- 无需修改Express应用的端口监听代码,保持
app.listen(3000)即可,PM2的集群模式会自动处理端口共享 - 如果你的
start:stag脚本包含其他启动参数(比如加载特定配置),可以将参数添加到PM2配置的args字段中,例如:args: "--config stag.config.js"
内容的提问来源于stack exchange,提问作者Shuls
相关产品推荐
相关产品推荐

