负载均衡

Cluster mode

PM2内置的负载平衡器可以在所有可用的CPU上扩展已经联网的Node.js应用(http(s)/tcp/udp服务器),不需要修改代码。

使用

使用-i <number-instances>选项来开启集群模式:

pm2 start app.js -i max

max表示PM2会自动检测可用CPU的数量并扩展相同数量的进程。

或者通过生态系统文件(ecosystem.config.js)配置:

module.exports = {
  apps: [{
    script: "app.js",
    instances: "max",
  }]
}

instances选项可以是:

instances也可以是一个负整数。 如果有4个核心,pm2 start -i -1会扩展3个群集(最大整数)。

无状态应用

在群集环境中,你首先要确保你的应用进程没有内部状态。

内部状态通常是存储在进程中的一些本地数据。 例如,它可以是一组websocket的连接或本地session。 可以使用Redis或其他数据库来共享进程间的状态。

创建无状态应用教程

不宕机重载

使用restart命令时,pm2先杀掉进程然后重启进程,所以重启的这段时间是无法使用服务的。

但是使用reload命令,pm2滚动重启所有进程,并会保持至少有一个进程正在运行:

pm2 reload <app_name>

或者:

pm2 reload ecosystem.config.js
pm2 reload ecosystem.config.js --only app

如果reload应用进程超时,将会退回使用restart

优雅开机和关机

为了确保所有请求在重载中都可以被正确处理,你要确保应用进程关闭时已经处理完所有请求,不能留下未响应的请求。

优雅的关机确保在退出应用程序之前处理所有剩余的查询并关闭所有外部连接。

可以查看如何设置正常关机的教程

集群环境变量

环境变量NODE_APP_INSTANCE用于区分不同的集群。

例如,如果你想只在一个集群上运行一个cronjob,可以判断process.env.NODE_APP_INSTANCE === 0是否成立。

该变量可在生态系统文件(ecosystem.config.js)中重命名:

module.exports = {
  apps: [{
    name: "app",
    script: "./app.js",
    instance_var: "INSTANCE_ID",
  }]
}

这对使用node-config包时报告命名冲突是有用的,查看问题

下一步

开发工具