node.js - nodejs - 我应该如何将 nginx 与 pm2 一起用于我在集群模式下运行的应用程序?

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

我给了一个任务,在我的应用程序中使用 nginx 和 pm2。我应该如何在集群模式下使用 pm2 运行的 nodejs 应用程序前面使用 nginx?

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

最佳答案

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

Also learned that pm2 itself provides built-in load balancer, why should i use nginx then?

首先,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 block 来实现。这需要不同的主机和不同的 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/;
        }
}

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

关于node.js - nodejs - 我应该如何将 nginx 与 pm2 一起用于我在集群模式下运行的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43758128/

相关文章:

javascript - 如何查找网站中使用的 Javascript 库版本?

javascript - 等到 for-loop 中的所有函数调用结束执行 - Javascript

javascript - 如何更改 Electron 中的路径,以便将文件保存到未打包在 app.asar 文件中的不同目录中?

mysql - JBOSS 与多个数据库的连接(sql 集群)

php - 需要跨 2 个负载平衡服务器上传单个文件

node.js 数字签名不起作用

javascript - 带有 Nginx 和 Docker 的 Webpack 开发服务器 : polling info on the wrong address

javascript - 本地和生产环境中 Node 的行为

authentication - 使用 auth_request 模块和外部身份验证 API 的 Nginx 反向代理 - 错误 404

api - Amazon API - 如何创建自定义负载均衡器?