【问题标题】:How to specify a port number for pm2如何为 pm2 指定端口号
【发布时间】:2015-10-08 17:46:38
【问题描述】:

我正在尝试使用 pm2 来管理 node.js 集群

pm2 start . -i 3

我目前正在 heroku 上运行应用程序并使用带有上述命令的 Procfile,但我不知道如何配置 pm2 以使用现有的 PORT env var。类似pm2 start . -p $PORT

我错过了什么?

【问题讨论】:

    标签: node.js heroku pm2


    【解决方案1】:

    您可以使用环境变量。 例如:

    1. NODE_PORT=3002 pm2 start -i 0 app.js

    2. 在应用中读取值:

    console.log(process.env.NODE_PORT);

    或者,如果您正在构建快速应用程序:

    1. PORT=3002 pm2 start -i 0 ./bin/www

    2. 在启动应用程序时自动快速加载 PORT。

    【讨论】:

    • 谢谢@stdob。我不需要在代码中访问环境变量。我需要配置 pm2 在指定端口上启动节点实例。
    • @lukewendling 你的意思是:“在指定端口上启动节点实例”?
    • 您能帮我解决如何在端口 80 中运行吗。这就是我想要做的。 $ PORT=80 pm2 start ./bin/www --name sample --env production -i -1
    • @Anoop.P.A 抱歉,您的评论有点晚了。希望你想通了。如果没有,在 linux/unix 机器上的本地环境中运行时,低于 1024 的端口需要 sudo。所以你会想做 PORT-80 sudo pm2 start ...
    • 你可以使用:pm2 start /path/of/app.js -i 4 -- --port=1336
    【解决方案2】:

    你需要使用 -- 告诉 pm2 停止解析他的选项并将剩下的交给程序,然后当你生成直接二进制文件时,你需要告诉 pm2 你不想使用 nodejs,所以:

    pm2 start rethinkdb --interpreter none -- --port 8082

    你知道你需要-- --port 8082

    【讨论】:

    • 请将您启动 pm2 实例的整行发送给我。
    • 这很好用pm2 start dev -- --port 3100。只要确保在--port 之前有额外的--。我曾经不时地对环境变量感到困惑,这为我解决了这个问题。
    • 不,它不起作用,只有 'NODE_PORT=3002 pm2 start Ecosystem.config.js --no-daemon' 打印 process.env.NODE_PORT。在您的解决方案中,env 或 argv 中不存在端口
    • 我的简单版本生态系统.config.js: module.exports = { apps : [{ name: 'name', script: './bin/www', node_args: '-r esm', cwd: './server' }] }
    【解决方案3】:

    告诉您的服务器应用程序在哪个端口上运行的一种简单方法是通过 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
    

    【讨论】:

    • 如果您定义了一个端口(例如上面列出的 4300),然后拥有该进程的 2 个实例,这是否意味着您会收到“正在使用的端口”错误? PM2 集群模式有办法解决这个问题吗?
    • 这是一种端口转发,对吧?那么,这是否意味着它将应用程序容器化以避免端口冲突?如果您查看pstree,这些流程是直接列出的,还是包含在某种 PM2 流程中?以及它如何知道哪些环境变量是端口。我的意思是,这次参数称为“PORT”,但也可以称为“FOO_BAR”。它还会检测和负载均衡吗?
    • 我不确定这是否真的是端口转发,但在后台 PM2 使用 NodeJS 集群模块在子进程之间共享一个端口。 PM2 开箱即可完成所需的配置,因此您无需为该功能编写任何代码。
    猜你喜欢
    • 2014-08-03
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2012-04-16
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多