运行nodejs服务器的多个实例以进行扩展

时间:2017-09-25 22:26:14

标签: node.js

我在端口8080上运行nodejs服务器,因此我的服务器一次只能处理一个请求。 我可以看到,如果我一次发送多个请求,新请求就会排队并一个接一个地执行。

我想要找到的是,我如何运行此过程的多个实例/线程。例如像python服务器的gunicorn。是否有类似的东西,而不是在每个实例的多个端口上运行nodejs服务器。

我已将nginx置于节点进程的前面。这是足够的推荐方法。

worker_processes auto;
worker_rlimit_nofile 1100;
events {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

pid  /var/run/nginx.pid; 
http {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;

    server {
        listen 80;
        server_name localhost;
        access_log /dev/null;
        error_log /dev/null;

        location / {
            proxy_pass http://localhost:8080;
        }
    }
}

3 个答案:

答案 0 :(得分:9)

首先,请确保您的node.js进程仅使用异步I / O. 如果它不是计算密集型并使用异步I / O,它应该能够有许多不同的请求“在飞行中“在同一时间。如果你的代码设计得当,node.js的设计就特别好了。如果您向我们展示了其中一个请求的关键所在,我们可以更具体地建议您的服务器代码是否设计得恰到好处以获得最佳吞吐量。

其次,仪器和度量,度量,度量。了解现有node.js服务器中的瓶颈位置以及导致延迟或排序的原因。有时,在开始添加更多群集或服务器之前,有很多方法可以显着地修复/改善瓶颈。

第三,使用node.js cluster module这将创建一个主节点.js进程,可自动平衡多个子进程。您通常希望为服务器计算机中的每个实际CPU创建一个集群子级,因为这样可以最大限度地利用CPU。

第四,如果您需要扩展到多个实际服务器计算机,那么您可以使用负载均衡器或反向代理(如nginx)来共享多个主机之间的负载。如果您在服务器上有一个四核CPU,你可以在每台服务器计算机上运行一个带有四个node.js进程的集群,然后使用nginx在你拥有的几个服务器盒之间进行平衡。

请注意,添加多个由nginx负载平衡的主机是此处的最后一个选项,而不是第一个选项。

答案 1 :(得分:3)

就像@poke说的那样,你可以在前面使用反向代理和/或负载均衡器。

但是如果你想要一个软件运行多个节点实例,平衡和其他东西,你应该检查pm2

http://pm2.keymetrics.io/

答案 2 :(得分:0)

这里只需在@sheplu上添加一点,pm2模块将使用内部的节点集群模块。但是即使那样,pm2还是一个很好的选择,因为它提供了除节点集群以外的其他各种抽象。

此处的更多信息:https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/