【问题标题】:Running multiple instances of nodejs server for scaling运行多个 nodejs 服务器实例以进行扩展
【发布时间】:2020-09-30 00:48:48
【问题描述】:

我在 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;
        }
    }
}

【问题讨论】:

  • 通常,您只需在前面使用反向代理/负载均衡器,然后在后面多次为您的应用程序提供服务。
  • @poke 我已经将 nginx 放在节点进程的前面,就足够了。我还没有测试它

标签: node.js


【解决方案1】:

首先,确保您的 node.js 进程仅使用异步 I/O。 如果它不是计算密集型并且使用异步 I/O,它应该能够有许多不同的请求“在飞行中”。如果你的代码设计得当,node.js 的设计在这方面尤其擅长。如果您向我们展示了它对这些请求之一所做的事情的关键,我们可以更具体地建议您的服务器代码是否经过适当设计以实现最佳吞吐量。

第二,仪器和测量,测量,测量。了解您现有的 node.js 服务器中的瓶颈在哪里,以及是什么导致了您看到的延迟或排序。有时,在您开始添加更多集群或服务器之前,有一些方法可以显着解决/改善您的瓶颈。

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

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

请注意,这里添加多个由 nginx 进行负载均衡的主机是最后一个选项,而不是第一个选项。

【讨论】:

  • 在我看来,您在这里所说的最重要的事情就是使用集群模块,因为没有它,Node.js 将永远只使用一个 CPU 内核。
  • @jfriend00 感谢您的详细回答。我的服务器是异步的。我正在使用child_process.exec 调用外部脚本,这也是异步的。我认为集群模块是一个很好的做法,我会尝试一下。
  • 如果你正在异步运行子进程,你应该能够同时处理一堆正在运行的请求,除非你正在运行子进程的事情是强制序列化。
  • 如果您已经在使用子进程进行大量处理,请注意集群模块。您真的不想最终拥有比 CPU 更多的进程,因为这只会导致操作系统的额外上下文切换。
  • @Craig - 好吧,我认为最重要的是确保您只使用异步 I/O,因为一个同步 I/O 调用可能会阻塞单个 node.js Javascript线。但是在那之后,在了解了瓶颈在哪里之后,您确实经常希望涉及多个 CPU。有可扩展性案例,瓶颈是每个请求都在咨询的数据库,而您真正需要做的是找到一种方法来加快数据库访问速度(缓存、性能调整、更好的主机、更快的磁盘等......)而不是立即跳转到聚类。
【解决方案2】:

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

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

http://pm2.keymetrics.io/

【讨论】:

【解决方案3】:

这里需要在@sheplu 上添加一点,pm2 模块在后台使用节点集群模块。但即便如此,pm2 也是一个非常好的选择,因为它提供了除节点集群之外的各种其他抽象。

更多信息在这里:https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    相关资源
    最近更新 更多