【发布时间】:2015-10-08 17:46:38
【问题描述】:
我正在尝试使用 pm2 来管理 node.js 集群
pm2 start . -i 3
我目前正在 heroku 上运行应用程序并使用带有上述命令的 Procfile,但我不知道如何配置 pm2 以使用现有的 PORT env var。类似pm2 start . -p $PORT
我错过了什么?
【问题讨论】:
我正在尝试使用 pm2 来管理 node.js 集群
pm2 start . -i 3
我目前正在 heroku 上运行应用程序并使用带有上述命令的 Procfile,但我不知道如何配置 pm2 以使用现有的 PORT env var。类似pm2 start . -p $PORT
我错过了什么?
【问题讨论】:
您可以使用环境变量。 例如:
NODE_PORT=3002 pm2 start -i 0 app.js
在应用中读取值:
console.log(process.env.NODE_PORT);
或者,如果您正在构建快速应用程序:
PORT=3002 pm2 start -i 0 ./bin/www
在启动应用程序时自动快速加载 PORT。
【讨论】:
你需要使用 -- 告诉 pm2 停止解析他的选项并将剩下的交给程序,然后当你生成直接二进制文件时,你需要告诉 pm2 你不想使用 nodejs,所以:
pm2 start rethinkdb --interpreter none -- --port 8082
你知道你需要-- --port 8082
【讨论】:
pm2 start dev -- --port 3100。只要确保在--port 之前有额外的--。我曾经不时地对环境变量感到困惑,这为我解决了这个问题。
告诉您的服务器应用程序在哪个端口上运行的一种简单方法是通过 PM2
生态系统配置文件
结合在您的服务器应用程序中正确配置使用 $PORT 环境变量。这意味着您的服务器读取 $PORT 环境变量以在指定端口上启动服务器或微服务。
您可以为文件选择不同的格式。我个人使用 CommonJS 模块格式(其他选项包括 JSON 和 YAML)。
在 ecosystem.config.js 中,您可以为要通过 PM2 启动的每个服务器实例指定一个条目对象。
关键是您还可以为不同的进程指定环境变量,这样您就可以为所有进程设置 $PORT。以下是三个不同进程的示例配置。
module.exports = {
apps : [
{
name : "Main API server",
script : "./backend/dist/main.js",
instances : "2",
exec_mode : "cluster",
env: {
NODE_ENV: "production",
PORT: 4300
}
},
{
name : "Worker server 1",
script : "./backend-worker/dist/main.js",
instances : "1",
exec_mode : "fork",
env: {
NODE_ENV: "production",
PORT: 4000,
},
},
{
name : "Worker server 2",
script : "./backend-worker/dist/main.js",
instances : "1",
exec_mode : "fork",
env: {
NODE_ENV: "production",
PORT: 4001,
}
},
]
}
注意:此配置使用 PM2 作为负载均衡器,用于在两个核心上作为集群运行的第一个进程。其他(工作)进程分别在指定端口上的进程上运行。
使用环境 $PORT var 用于 NodeJS 服务器的服务器启动代码示例如下:
// ...
const port = (process.env.PORT) ? process.env.PORT : 4300
console.log('$PORT: ', port)
const server = await app.listen(port, '0.0.0.0')
// ...
一切就绪后,只需调用以下命令即可启动服务器:
pm2 start ecosystem.config.js
【讨论】:
pstree,这些流程是直接列出的,还是包含在某种 PM2 流程中?以及它如何知道哪些环境变量是端口。我的意思是,这次参数称为“PORT”,但也可以称为“FOO_BAR”。它还会检测和负载均衡吗?