nodejs - 对于在集群模式下运行的应用程序,我应该如何使用nginx和pm2?

时间:2017-05-03 10:59:39

标签: node.js nginx load-balancing pm2 node-cluster

我已经完成了在我的应用程序中使用nginx和pm2的任务。我应该如何使用在集群模式下使用pm2运行的nodejs应用程序的nginx infront?

还了解到pm2本身提供了内置的负载均衡器,为什么我应该使用nginx呢?

3 个答案:

答案 0 :(得分:0)

如果您使用Nginx的唯一原因是加载平衡,那么您可以给它一个未命中。但是我必须警告你,与Nginx相比,pm2的分解更多。

就我个人而言,我建议您坚持使用Nginx,它提供的服务包括提供静态文件,进行重定向,处理SSL证书以及提供开箱即用的错误页面。

在nodejs前使用Nginx的最简单方法是代理传递对nodejs正在使用的端口的请求。但是,您可能希望在执行此操作之前应用更多配置更改。此外,nodejs几乎可以完成Nginx可以执行的所有操作,但并不意味着这样做。

查看以下链接:

  1. https://www.quora.com/Should-I-host-a-node-js-project-without-nginx 2。Load balancing since Node v0.12.2 - cluster, pm2 or nginx

答案 1 :(得分:0)

虽然guruwinder编写的所有内容都是正确的,但问题表明你是一个任务"。要记住的另一点是PM2对于Nginx不提供的其他一些东西也很好。 PM2让你开始并作为一个守护进程重新启动;监控您的控制台记录;快速了解服务器和服务的内容;多个实例来加载平衡和集群处理。换句话说,使用PM2然后负载平衡可以获得更多。我总是使用它并在AWS,Azure和本地Mac和Windows上使用它。有时需要一些技巧才能做到正确(特别是在Windows上),但好处是值得的。

所以你需要Nginx以获得所有能力以及上面提到的更多功能,并且使用PM2运行它将为您提供更多的服务灵活性。但是,运行PM2以及节点(正确)将允许微调和实际了解您的节点应用程序正在做什么。

因此,您可以像往常一样使用Nginx,并在后台使用节点应用程序的节点PM2。至于负载平衡,应该根据你对Nginx的控制量来决定。

希望其中一些有帮助。

答案 2 :(得分:0)

这是一个老问题,但我最近不得不这样做,我觉得更完整的答案可能对像我一样从谷歌登陆的人有所帮助。我假设您的设置较小,使用 nginx 作为多个服务器的负载平衡器,并且您的应用程序根据 PM2 文档无状态。如果它不是无状态的,您可能会遇到集群模式的问题。

<块引用>

还了解到pm2本身提供了内置的负载均衡器,为什么 那我应该用nginx吗?

首先,PM2 和 Nginx 都可以作为负载均衡器运行。人们常说 NodeJS 是“单线程”的,因此一次只能使用一个 CPU 内核——PM2 在集群模式下在一个主进程下运行同一个 NodeJS 应用程序的多个实例,允许您在主机上使用更多内核。 PM2 does this without requiring each instance of the app run on a different port (although it could) or IP (which I'll get to)

您可以在集群模式下使用以下内容初始化 PM2:pm2 start -i NUMBER_OF_CORES(e.g 2) npm --name APP_NAME -- run start

同时,Nginx 还可以对 NodeJS 应用程序进行负载平衡 - 但它会使用 upstream 块来实现。这需要不同的主机和不同的 IP,可能看起来像这样:

 upstream app_servers {
        server 127.0.0.1:3000;
        server 127.0.0.1:3001;
        server 127.0.0.1:3002;
        server 127.0.0.1:3002; 
}

server {
         listen 80 ;
        gzip on;
        root /var/www/html;

        index index.html index.htm;
        server_name FRONTURL; 

        location / {
        try_files $uri /index.html;
        }

        location /api/ {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_pass http://app_servers;
        } 
    }

您可以看到这两个选项之间的区别主要在于 nginx 允许您跨多个 IP、端口和服务器进行负载平衡,而 PM2 是用于共享 CPU 资源的应用程序的快速简单的负载平衡器。 你可以尝试同时使用,通过使用 nginx 在 VM 之间对请求进行负载平衡,然后使用 PM2 来确保每台机器都完全使用其内核,我想。

现在,尽管有这一切,在集群模式下在 PM2 前面使用 nginx 的主要方式是,如果您使用它来提供来自客户端渲染应用程序(例如 react)的静态内容并与 nodejs 通信通过 HTTP 调用后端,您希望在 CPU 内核之间进行负载平衡。在这种情况下,Nginx 将充当 1) 来自前端的静态内容服务器 2) 与以集群模式运行的后端进行通信的反向代理。在这种情况下,您的 nginx 配置可能如下所示:

{
        listen 80 ;
        gzip on;
        root /var/www/html;

        index index.html index.htm;
        server_name FRONTURL; 

        location / {
        try_files $uri /index.html;
        }

        location /api/ {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_pass http://localhost:NODEJS_PORT/;
        }
}

当然,您可以通过调整位置块以类似的方式代理传递服务器端呈现的应用程序;)