在使用 PM2 进行 Node.js 应用的部署时,我们经常需要设置一些环境变量来配置应用的一些参数。但是当我们需要用 PM2 启动一个应用集群时,如何让所有的应用都能够共享同一个环境变量呢?这是本文要讲解的问题。
什么是 PM2 集群
PM2 集群是一种将多个应用一起管理的方法,它使用了 Node.js 内置的 cluster 模块,使得多个应用能够在同一个进程中运行,从而提高了性能和可靠性。PM2 集群主要有两种启动方式:cluster 模式和fork 模式。
在 cluster 模式下,PM2 主进程会派生多个子进程来运行应用,在这种情况下,所有子进程都可以共享同一个内存空间,因此也能够共享同一个环境变量。
而在 fork 模式下,每个应用都会启动一个新的进程来运行,这种情况下就需要我们手动设置环境变量了。
集群中如何共享环境变量
在 PM2 集群中共享环境变量主要有两种方法:一种是使用进程间通信的方式,将环境变量传递给所有子进程;另一种是通过 PM2 的 ecosystem 配置文件来设置环境变量。
使用进程间通信传递环境变量
在 PM2 集群中,我们可以使用进程间通信的方式,在主进程启动子进程后将环境变量传递给子进程。这种方式适用于 cluster 模式。
// javascriptcn.com 代码示例 const cluster = require('cluster'); const numCPUs = require('os').cpus().length; const env = { SECRET_KEY: 'MY_SECRET_KEY' }; if (cluster.isMaster) { for (let i = 0; i < numCPUs; i++) { let worker = cluster.fork(); // 让子进程能够访问环境变量 worker.send({ type: 'env', data: env }); } } else { // 获取主进程传递的环境变量 process.on('message', message => { if (message.type === 'env') { process.env = Object.assign({}, process.env, message.data); } }); // 运行应用 require('./app.js'); }
在这个例子中,我们首先定义了一个环境变量 SECRET_KEY
,然后在主进程中通过 cluster.fork()
方法创建多个子进程,接着将环境变量通过 worker.send()
方法传递给每个子进程。在每个子进程中,我们通过监听 process.on('message')
事件来获取主进程传递的环境变量,并将它们赋值给子进程的 process.env
对象。最后,我们通过 require('./app.js')
来运行我们的应用。
使用 ecosystem 配置文件设置环境变量
另一种设置 PM2 集群中环境变量的方法是通过 PM2 的 ecosystem 配置文件来进行。这种方式适用于 cluster 模式和 fork 模式。
// javascriptcn.com 代码示例 { "name": "app", "script": "app.js", "instances": "max", "exec_mode": "cluster", "env": { "SECRET_KEY": "MY_SECRET_KEY" } }
在这个例子中,我们在 env
对象中设置了环境变量 SECRET_KEY
的值为 MY_SECRET_KEY
。在 PM2 启动应用时,我们只需要在命令行中指定这个配置文件即可:
$ pm2 start ecosystem.config.js
之后,所有的应用都会共享这个环境变量了。
总结
本文介绍了 PM2 集群中如何共享环境变量的两种方法,分别是使用进程间通信传递环境变量和使用 ecosystem 配置文件设置环境变量。通过使用这些技巧,我们能够更加方便地配置和管理我们的应用,并提高应用的性能和可靠性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652a21fc7d4982a6ebc7d426