ichuan.net

自信打不死的心态活到老

在 pm2 的 cluster mode 中使用 80 端口的变通方法

pm2 是一个 nodejs 进程管理器,和 forever 类似,但是相比有以下优点:

  1. 内置负载均衡,充分利用多核
  2. 不间断刷新代码
  3. 内置内存和 CPU 监控

最近做的项目中发现一台 expressjs 开发的 API 服务器其它资源都占满,但 CPU 却有大部分闲置。项目使用 forever 部署,于是想切换到 pm2 利用其余 CPU 资源。

切换过去重新启动后,发现总是报错,后来查询发现这是 pm2 的一个局限:其负载均衡是基于 nodejs 的 cluster 模块开发,不支持应用绑定 0 到 1024 间的端口。而我的 API 服务以前是 forever 绑定到 80 端口,由于 forever 使用 fork 方式,所以没有问题。

有两种解决方法,一种是继续使用 pm2,但是使用 fork 模式,这样就和 forever 一样了,但缺失了其那几大优势;另一种是我想到的变通方法:

  1. 修改程序,让其监听在非特权端口,比如 56789:

    //app.set('port', 80);
    app.set('port', 56789);
    
  2. 用 pm2 启动

  3. 用 iptables 把 80 端口的流量导向 56789 端口

    sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 56789
    

完了后访问下 80 端口,可以看到正确的页面了。问题解决。

Comments