繁体   English   中英

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

[英]nodejs - How should i use nginx along with pm2 for my application running in cluster mode?

我已经给出了在我的应用程序中使用 nginx 和 pm2 的任务。 我应该如何在以集群模式使用 pm2 运行的 nodejs 应用程序前面使用 nginx?

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

如果您使用 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. 负载均衡自 Node v0.12.2 - cluster、pm2 或 nginx

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

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

首先,PM2 和 Nginx 都可以作为负载均衡器运行。 人们常说 NodeJS 是“单线程”的,所以一次只能使用一个 CPU 核——集群模式下的PM2一个主进程运行同一个 NodeJS 应用程序的多个实例,让你可以在主机上使用更多的核. PM2 不需要应用程序的每个实例运行在不同的端口(尽管它可以)或 IP(我将介绍)上执行此操作

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

同时,Nginx 还可以对 NodeJS 应用程序进行负载平衡——但它会使用上游块来实现。 这需要不同的主机和不同的 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 来跨虚拟机负载平衡请求,然后使用 PM2 来确保每台机器都完全使用其内核。

现在,尽管如此,在集群模式下在 PM2 前面使用 nginx 的主要方式是,如果您使用它来提供来自客户端呈现的应用程序(例如,react)的静态内容并通过 HTTP 与 nodejs 后端通信您希望跨 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/;
        }
}

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

虽然 guruwinder 写的所有内容都是正确的,但问题表明您“被赋予了任务”。 要记住的另一点是 PM2 也适用于 Nginx 不提供的其他一些东西。 PM2 让你哀叹作为守护进程启动和重启; 监控您的控制台日志记录; 快速了解您的服务器和服务背后发生的事情; 多个实例进行负载平衡和集群处理。 换句话说,与负载平衡相比,使用 PM2 可以获得更多收益。 我一直在使用它,并且已经在 AWS、Azure 以及本地 Mac 和 Windows 上使用过它。 有时需要一些技巧才能正确(尤其是在 Windows 上),但好处是值得的。

所以你需要 Nginx 来获得上面提到的所有功能和更多功能,并且使用 PM2 运行它会给你更多的服务灵活性。 然而,运行 PM2 以及节点(正确)将允许微调和实际了解您的节点应用程序在后台执行的操作。

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

希望有些帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM