无法使用 PM2 创建节点脚本集群
Unable to create node script cluster with 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 集群模式下它不工作并且应用程序不加载。
我认为问题在于您正在尝试 运行 使用 PM2 编写打字稿代码。我自己从未尝试过,但显然 PM2 有一个 TS Plugin。如果这不起作用,您可以随时自己转译代码,然后 运行 然后通过 PM2
我认为您必须以不同方式调用主脚本文件。不久前,我试图获取一个进程文件 运行。花了很多时间后,它以某种方式对我有用。试试这个配置:
{
"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
.
的产品模式
未测试。祝你好运。
我正在尝试使用 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 集群模式下它不工作并且应用程序不加载。
我认为问题在于您正在尝试 运行 使用 PM2 编写打字稿代码。我自己从未尝试过,但显然 PM2 有一个 TS Plugin。如果这不起作用,您可以随时自己转译代码,然后 运行 然后通过 PM2
我认为您必须以不同方式调用主脚本文件。不久前,我试图获取一个进程文件 运行。花了很多时间后,它以某种方式对我有用。试试这个配置:
{
"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
.
未测试。祝你好运。