我已经给出了在我的应用程序中使用 nginx 和 pm2 的任务。我应该如何在集群模式下使用 pm2 运行的 nodejs 应用程序前面使用 nginx?
还了解到pm2本身提供了内置的负载均衡器,那我为什么要使用nginx呢?
我已经给出了在我的应用程序中使用 nginx 和 pm2 的任务。我应该如何在集群模式下使用 pm2 运行的 nodejs 应用程序前面使用 nginx?
还了解到pm2本身提供了内置的负载均衡器,那我为什么要使用nginx呢?
这是一个老问题,但我最近不得不这样做,我觉得一个更完整的答案可能对像我一样从谷歌登陆的任何人都有帮助。我假设您的设置较小,不使用 nginx 作为多台服务器的负载均衡器,并且您的应用程序根据 PM2 文档是无状态的。如果它不是无状态的,您可能会遇到集群模式的问题。
还了解到pm2本身提供了内置的负载均衡器,那我为什么要使用nginx呢?
首先,PM2 和 Nginx 都可以作为负载均衡器运行。人们常说 NodeJS 是“单线程”的,因此一次只能使用一个 CPU 内核 -集群模式下的 PM2 在一个主进程下运行同一个 NodeJS 应用程序的多个实例,让您可以在主机上使用更多内核. PM2 无需应用程序的每个实例都运行在不同的端口(尽管可以)或 IP(我会谈到)上就可以做到这一点。
您可以使用以下方式在集群模式下初始化 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 来平衡虚拟机之间的请求,然后使用 PM2 来确保每台机器都完全使用它的核心。
现在,尽管如此,在集群模式下在 PM2 前面使用 nginx 的主要方式是,如果您使用它从客户端呈现的应用程序(例如反应)提供静态内容并通过 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/;
}
}
而且,当然,您可以通过调整位置块以类似的方式代理传递服务器端呈现的应用程序;)
如果您使用 Nginx 的唯一原因是负载平衡,那么您可以忽略它。但我必须警告你,与 Nginx 相比,pm2 的故障更多。
就个人而言,我建议您坚持使用 Nginx,它提供了诸如提供静态文件、进行重定向、处理 SSL 证书和提供开箱即用的错误页面之类的功能。
在 nodejs 前面使用 Nginx 的最简单方法是将请求代理传递到 nodejs 正在使用的端口。但您可能希望在执行此操作之前应用更多配置更改。此外,nodejs 几乎可以做 Nginx 可以做的所有事情,但它并不意味着这样做。
查看以下链接:
虽然 guruwinder 编写的所有内容都是正确的,但问题表明您“被赋予了一项任务”。要记住的另一点是 PM2 也适用于 Nginx 不提供的其他一些东西。PM2 让您作为守护进程启动和重启;监控您的控制台日志记录;快速了解您的服务器和服务背后发生的事情;多个实例来负载平衡和集群处理。换句话说,使用 PM2 比负载平衡有更多的好处。我一直在使用它,并且已经在 AWS、Azure 以及本地 Mac 和 Windows 上使用过它。有时需要一些技巧才能做到正确(尤其是在 Windows 上),但这样做的好处是值得的。
所以你需要 Nginx 来获得上面提到的所有功能,并且使用 PM2 运行它会给你的服务提供更大的灵活性。但是,使用节点(正确)运行 PM2 将允许微调和实际了解您的节点应用程序在后台执行的操作。
因此,像往常一样使用 Nginx,并在后台使用 PM2 和 Node 作为节点应用程序。至于负载平衡,应该根据您对 Nginx 的控制量来决定。
希望有些帮助。