我正在使用 Bolt-js、node.js 和 slack api 制作一个 slack 应用程序。
我已经使用 PM2 设置了 Jenkins CI/CD 管道,以将 node.js 部署到 AWS EC2,但我在 pm2 重新加载步骤中遇到了一些问题。
EC2 实例中有两个核心,因此当我在 PM2 集群模式下运行它时,会出现两次运行。
以下是我的
ecosystem.config.js
:
module.exports = {
apps: [{
name: 'project-name',
cwd: './project-path',
script: 'npm',
args: 'start',
instances: 0,
exec_mode: 'cluster_mode'
}]
当我运行
pm2 start ecosystem.config.js
命令时,它运行良好 - 没有 port already in use
错误。
但是当我用 pm2 reload <appname>
重新加载 pm2 时,显示以下错误:
Error: listen EADDRINUSE: address already in use :::3000
at Server.setupListenHandle [as _listen2] (node:net:1740:16)
at listenInCluster (node:net:1788:12)
at Server.listen (node:net:1876:7)
at project-path/node_modules/@slack/bolt/dist/receivers/HTTPReceiver.js:177:25
at new Promise (<anonymous>)
at HTTPReceiver.start (project-path/node_modules/@slack/bolt/dist/receivers/HTTPReceiver.js:143:16)
at App.start (project-path/node_modules/@slack/bolt/dist/App.js:241:30)
at project-path/app.js:320:13
at Object.<anonymous> (project-path/app.js:322:3)
at Module._compile (node:internal/modules/cjs/loader:1256:14) {
code: 'EADDRINUSE',
errno: -98,
syscall: 'listen',
address: '::',
port: 3000
它说我的3000端口已经被使用,并且自己重新加载了3次。
当集群从集群 0 切换到集群 1 时,多次重新加载成功 - 它完成其工作并在多次重新加载后成功部署更新的代码,如下所示:
[nodemon] app crashed - waiting for file changes before starting...
2023-09-13T15:40:12: PM2 log: Stopping app:project-name id:_old_0
2023-09-13T15:40:12: PM2 log: App name:project-name id:_old_0 disconnected
2023-09-13T15:40:12: PM2 log: App [project-name:_old_0] exited with code [0] via signal [SIGINT]
2023-09-13T15:40:12: PM2 log: pid=13051 msg=process killed
2023-09-13T15:40:12: PM2 log: App [project-name:1] starting in -cluster mode-
2023-09-13T15:40:12: PM2 log: App [project-name:1] online
但是,当集群从集群 1 切换到集群 0 时,它只是卡住了应用程序崩溃的消息,如下所示:
[nodemon] app crashed - waiting for file changes before starting...
并且新集群没有启动。
[nodemon] app crashed - waiting for file changes before starting...
2023-09-13T15:32:41: PM2 log: Stopping app:project-name id:_old_1
2023-09-13T15:32:41: PM2 log: App name:project-name id:_old_1 disconnected
2023-09-13T15:32:41: PM2 log: App [project-name :_old_1] exited with code [0] via signal [SIGINT]
2023-09-13T15:32:41: PM2 log: pid=12638 msg=process killed
为什么会出现这种情况?
有可能解决这个问题吗?
很久以前就解决了.. 起始脚本错误。
而不是
script: 'npm',
args: 'start',
,
script: 'app.js',
效果很好。