Невозможно создать кластер скрипта узла с PM2

Я пытаюсь создать кластер сценария узла с PM2, но получаю ошибки, и он не работает

Сценарий основного узла в машинописном тексте

import express from 'express';
import mongoose from 'mongoose';

const app = express();

app.get('/', (req, res) => {
    const tickets = {};
    res.send(tickets);
});

const setup = async () => {
    console.clear();

    try {
        await mongoose.connect('mongodb://127.0.0.1:27017/tickets', {
            useNewUrlParser: true, 
            useUnifiedTopology: true,
            useCreateIndex: true
        });
    } catch(err) {
        console.log(err);
    } 

    app.listen(5001, () => {
        console.log('listing app on 5001');
    });
}

setup();

Скрипт запуска NPM

ts-node-dev --poll index.ts

Мой сценарий запуска PM2 process.json

{
    "apps" : [
        {
            "name"       : "main-server",
            "script"     : "npm start",
            "autorestart": true,
            "instances"  : 4,
            "exec_mode"  : "cluster"            
        }
    ]
}

и получаю ошибку

SyntaxError: Invalid or unexpected token
3|main-ser |     at wrapSafe (internal/modules/cjs/loader.js:1047:16)
3|main-ser |     at Module._compile (internal/modules/cjs/loader.js:1097:27)
3|main-ser |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1153:10)
3|main-ser |     at Module.load (internal/modules/cjs/loader.js:977:32)
3|main-ser |     at Function.Module._load (internal/modules/cjs/loader.js:877:14)
3|main-ser |     at /usr/local/lib/node_modules/pm2/lib/ProcessContainer.js:303:25
3|main-ser |     at wrapper (/usr/local/lib/node_modules/pm2/node_modules/async/internal/once.js:12:16)
3|main-ser |     at next (/usr/local/lib/node_modules/pm2/node_modules/async/waterfall.js:96:20)
3|main-ser |     at /usr/local/lib/node_modules/pm2/node_modules/async/internal/onlyOnce.js:12:16
3|main-ser |     at WriteStream.<anonymous> (/usr/local/lib/node_modules/pm2/lib/Utility.js:186:13)

Когда я запускаю прямую команду с одним экземпляром "ts-node-dev --poll index.ts", он отлично работает с одним экземпляром. но в режиме кластера PM2 он не работает, и приложение не загружается.


person PHP Connect    schedule 20.05.2020    source источник
comment
Как выглядит ваша команда для запуска с pm2?   -  person kmgt    schedule 25.05.2020
comment
pm2 start process.json [соответствующая команда process.json уже добавлена]   -  person PHP Connect    schedule 26.05.2020


Ответы (2)


Думаю, надо по-другому называть основной файл скрипта. Раньше я пытался запустить файл процесса. После того, как я потратил много времени, у меня это как-то сработало. Попробуйте с этой конфигурацией:

{
    "apps" : [
        {
            "name": "main-server",
            "script": "./index.ts",
            "node_args": [
                "ts-node-dev",
                "--poll"
            ],
            "autorestart": true,
            "instances": 4,
            "exec_interpreter": "node",
            "exec_mode": "cluster",
            "env": {
                "NODE_ENV": "development"
            },
            "env_production": {
                "NODE_ENV": "production"
            }
        }
    ]
}
  • script вызывает файл, а не команду npm
  • Аргументы приведены в node_args
  • exec_interpreter - это node или весь путь, например /usr/bin/nodejs
  • не уверен, но читайте где-нибудь, чтобы определить env важно.

Запустите его в режиме разработки с pm2 start process.json и в режиме прод с pm2 start process.json --env production.

Не испытано. Удачи.

person kmgt    schedule 26.05.2020
comment
Да, это работает. я изменил exec_interpreter на ts-код напрямую - person PHP Connect; 26.05.2020

Я думаю, проблема в том, что вы пытаетесь запустить машинописный код с PM2. Я никогда не пробовал это сам, но, очевидно, есть подключаемый модуль TS для PM2. Если это не сработает, вы всегда можете самостоятельно перенести код и запустить его позже через PM2.

person truefalse10    schedule 25.05.2020