gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:10:52 25 4
gpt4 key购买 nike

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

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

最佳答案

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

Also learned that pm2 itself provides built-in load balancer, whyshould 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com