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