什么是 PM2
PM2 (Process Manager 2) 是一个流行的 Node.js 进程管理器。它能够管理和监控你的 Node.js 应用程序,提供了日志记录,负载均衡,进程守护和自动重启等功能。
需要配置多个实例的场景
在某些情况下,你的应用程序需要同时运行多个实例。比如,对于高流量的 Web 应用程序或者需要不间断运行的任务,多个实例能够提高应用程序的性能和可靠性。
在 PM2 中通过 --instances
选项配置多个实例。
pm2 start app.js --instances 4
上面的命令将会启动 4 个实例。PM2 会以轮询方式来分配请求到运行的实例中。
指定端口
默认情况下,PM2 在每个实例之间使用相同的端口。如果你想为每个实例设置不同的端口,可以在应用程序代码中指定不同的端口,以及在 PM2 的命令中使用 --env
选项。
在你的应用程序中,你可以使用 process.env.PORT
来读取指定的端口。在 PM2 的命令中,你可以通过设置不同的环境变量来指定不同的端口。
// javascriptcn.com 代码示例 const http = require('http'); const port = process.env.PORT || 3000; http.createServer((req, res) => { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello, World!'); }).listen(port, () => { console.log(`Server is running on ${port}`); });
在 PM2 的命令中,你可以通过 --env
选项来指定不同的环境变量。
pm2 start app.js --instances 4 --env 'PORT=3001' pm2 start app.js --instances 4 --env 'PORT=3002' pm2 start app.js --instances 4 --env 'PORT=3003' pm2 start app.js --instances 4 --env 'PORT=3004'
上面的命令将会启动 4 个实例,并分别运行在端口 3001,3002,3003 和 3004 上。
配置负载均衡
除了默认的轮询方式,PM2 还提供了多种负载均衡策略,包括:
- round-robin:默认的轮询方式。
- least-connection:连接数最少的进程优先接收请求。
- source:根据客户端 IP 地址将请求分配到不同的进程。
- pm2:根据进程指定的数量自动分配请求。
你可以通过 --env
选项的 PM2_GRACEFUL_LISTEN_TIMEOUT
环境变量来设置自动分配请求的策略。
在应用程序代码中,你可以使用 process.env.PM2_INSTANCE_INDEX
和 process.env.PM2_INSTANCE_TOTAL
来读取实例的索引和总数。
// javascriptcn.com 代码示例 const http = require('http'); const port = process.env.PORT || 3000; http.createServer((req, res) => { const index = process.env.PM2_INSTANCE_INDEX; const total = process.env.PM2_INSTANCE_TOTAL; res.writeHead(200, {'Content-Type': 'text/plain'}); res.end(`Hello, World! (${index + 1}/${total})`); }).listen(port, () => { console.log(`Server is running on ${port}`); });
在 PM2 的命令中,你可以通过 --env
选项来设置自动分配请求的策略。
pm2 start app.js --instances 4 --env 'PM2_GRACEFUL_LISTEN_TIMEOUT=1000' --env 'PM2_PROCESS_TYPE=web' --env 'PM2_LOAD_BALANCE=pm2'
上面的命令将会启动 4 个实例,使用自动分配请求的策略。
总结
在高流量的应用场景下,使用多个实例能够提高应用程序的性能和可靠性。在 PM2 中,你可以通过 --instances
选项来配置多个实例,并通过 --env
选项来指定不同的端口和负载均衡策略。这将会让你的应用程序更加健壮和可靠。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653ea17c7d4982a6eb80fe28