Как указать номер порта для pm2

Я пытаюсь использовать pm2 для управления кластером node.js.

pm2 start . -i 3

В настоящее время я запускаю приложение на heroku и использую Procfile с приведенной выше командой, но я не могу понять, как настроить pm2 для использования существующей переменной окружения PORT. Что-то вроде pm2 start . -p $PORT

Что мне не хватает?


person Luke W    schedule 19.07.2015    source источник


Ответы (3)


Вы можете использовать переменную среды. Например:

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

  2. Чтение значения в приложении:

console.log(process.env.NODE_PORT);

Или, если вы создаете экспресс-приложение:

  1. ПОРТ=3002 pm2 start -i 0 ./bin/www

  2. Экспресс-загрузка PORT автоматически при запуске приложения.

person stdob--    schedule 19.07.2015
comment
Спасибо @stdob. Мне не нужен доступ к env var в коде. Мне нужно настроить pm2 для запуска экземпляров узла на указанных портах. - person Luke W; 20.07.2015
comment
@lukewendling Что вы имеете в виду: запускать экземпляры узла на указанном порту? - person stdob--; 20.07.2015
comment
Не могли бы вы помочь мне с запуском порта 80 .. Это то, что я пытаюсь сделать. $ PORT=80 pm2 start ./bin/www --name sample --env production -i -1 - person Anoop.P.A; 03.01.2016
comment
@ Anoop.PA Извините, что немного запоздал с вашим комментарием. Надеюсь, вы поняли это. Если нет, то при работе в локальной среде на компьютере с Linux/Unix для портов ниже 1024 требуется sudo. Итак, вы хотели бы сделать PORT-80 sudo pm2 start ... - person Geuis; 10.03.2016
comment
Вы можете использовать: pm2 start /path/of/app.js -i 4 --port=1336 - person Omar_0x80; 26.10.2016
comment
Я получаю ошибку ниже: $ PORT=3002 pm2 start -I 0 main.js error: unknown option `-I' - person Krishna; 04.03.2021
comment
@Krishna Это была ошибка с использованием заглавных букв. Исправлено)) - person stdob--; 04.03.2021
comment
@stdob--, я настроил порт через ecosystem.json, но приложение по-прежнему недоступно. Не могли бы вы взглянуть: stackoverflow.com/questions/68109551 - person Mike B.; 24.06.2021

Вам нужно использовать --, чтобы сообщить pm2, чтобы он прекратил синтаксический анализ своих параметров и отдал остальное программе, затем, когда вы создаете прямой двоичный файл, вам нужно сказать pm2, что вы не хотите использовать nodejs, поэтому:

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

Видишь ли, тебе нужно -- --port 8082

person Semir Hodzic    schedule 12.04.2019
comment
Пожалуйста, пришлите мне всю строку, где вы запускаете свой экземпляр pm2. - person Semir Hodzic; 05.07.2019
comment
Это прекрасно работает pm2 start dev -- --port 3100. Просто убедитесь, что у вас есть дополнительные -- перед --port. Раньше я время от времени путался с переменными env, это исправляет это для меня. - person sr9yar; 29.10.2019
comment
нет, это не работает, есть только «NODE_PORT=3002 pm2 start экосистема.config.js --no-daemon» печатает process.env.NODE_PORT. В вашем решении порт не существует в env или argv - person Den Kerny; 19.12.2019
comment
моя простая версия экосистема.config.js: module.exports = { apps : [{ name: 'name', script: './bin/www', node_args: '-r esm', cwd: './server' } ] } - person Den Kerny; 19.12.2019

Простой способ сообщить вашему серверному приложению, на каком порту работать, — через 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 для сервера 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
person Torsten Barthel    schedule 29.10.2020