How to cluster Node.js app in multiple machines

前端 未结 2 1716
旧巷少年郎
旧巷少年郎 2021-01-31 06:07

I am using Express js and Node-cluster for taking the advantage of clustering I am also using PM2 for process and memory management. For a single machine, it is working fine, bu

相关标签:
2条回答
  • 2021-01-31 06:25

    Horizontal scaling for node can be done in multiple ways :

    1. npm install http-proxy

      var proxyServer = require('http-proxy');
      var port = parseInt(process.argv[2]);
      var servers = [
        {
          host: "localhost",
          port: 8081
        },
        {
          host: "localhost",
          port: 8080
        }
      ];
      
      proxyServer.createServer(function (req, res, proxy) {
        var target = servers.shift();
      
        proxy.proxyRequest(req, res, target);
        servers.push(target);
      }).listen(port); 
      
    2. nginx

    for more detail please check the below URL Horizontal scaling for node js

    0 讨论(0)
  • 2021-01-31 06:39

    Node-cluster is good for taking advantage of multi core processors, but when it comes to horizontal scaling(adding more machines), you'll need to use load balancers or reverse proxy. For reverse proxy you can use any web server like Apache or nginx. If you want to rely on node and npm, there is a module by nodejitsu: http-proxy. Here is an example for http proxy for 3 machines running your node app.

    1. create a new node project.
    2. Install http-proxy module.

    New version:

    npm install --save http-proxy

    If you prefer older version:

    npm install --save http-proxy@0.8

    1. Create a new js file (server.js or anything you like).

    For version 1.x.x (New)

    server.js

    var http = require('http'),
    httpProxy = require('http-proxy');
    
    var addresses = [
      {
        host: "localhost",
        port: 8081
      },
      {
        host: "localhost",
        port: 8082
      },
      {
        host: "localhost",
        port: 8083
      }
    ];
    
    //Create a set of proxy servers
    var proxyServers = addresses.map(function (target) {
      return new httpProxy.createProxyServer({
        target: target
      });
    });
    
    var server = http.createServer(function (req, res) {
      var proxy = proxyServers.shift();
    
      proxy.web(req, res);
    
      proxyServers.push(proxy);
    });
    
    server.listen(8080);
    

    for version 0.x.x (Old)

    server.js

    var proxyServer = require('http-proxy');
    
    var servers = [
      {
        host: "localhost",
        port: 8081
      },
      {
        host: "localhost",
        port: 8082
      },
      {
        host: "localhost",
        port: 8083
      }
    ];
    
    proxyServer.createServer(function (req, res, proxy) {
      var target = servers.shift();
    
      proxy.proxyRequest(req, res, target);
      servers.push(target);
    }).listen(8080);
    
    1. Now run this file.
    2. Request made to localhost:8080 will be routed to 8081, 8082 or 8083
    3. You can change the localhosts to IP addresses of your machines(and port numbers).

    Clients making request to 8080 port are unaware of existence of servers at 8081, 8082 and 8083. They make requests to 8080 as if it is the only server and get response from it.

    Now, one of the machines in your cluster will work as node balancer and application is hosted on other three machines. IP address of load balancer can be used as public IP.

    0 讨论(0)
提交回复
热议问题