簡體   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