我给了一个任务,在我的应用程序中使用 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/