」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > NGINX for Node.js 應用程式:什麼、為什麼以及如何使用它

NGINX for Node.js 應用程式:什麼、為什麼以及如何使用它

發佈於2024-11-04
瀏覽:231

NGINX for Node.js Applications: What, Why, and How to Use It

在扩展和优化 Node.js 应用程序时,NGINX 在处理高流量、高效服务静态文件以及充当负载均衡器方面发挥着至关重要的作用。 NGINX 是一种高性能 Web 服务器,还可以充当反向代理,使其能够跨多个服务器分发请求。在本文中,我们将介绍 NGINX 是什么、为什么应该将其与 Node.js 一起使用,以及如何为各种任务配置 NGINX,包括反向代理、负载平衡和提供静态内容。

什么是 NGINX?

NGINX(发音为“Engine X”)是一款功能强大的 Web 服务器和反向代理,旨在以高性能处理大量并发连接。 NGINX 最初是作为 Web 服务器创建的,其多功能性已将其扩展到负载平衡、反向代理和提供静态文件。

为什么将 NGINX 与 Node.js 一起使用?

  • 高效负载均衡:NGINX可以在多个Node.js实例之间分配流量,从而增强可扩展性。
  • 反向代理:充当客户端和后端 Node.js 服务器之间的中间服务器,有助于隐藏应用程序架构并平衡请求。
  • 静态内容处理:NGINX 可以提供静态文件,例如图像、CSS 和 JavaScript,从而将 Node.js 从这项任务中解放出来并提高性能。
  • SSL终止:NGINX可以处理SSL(TLS)加密,减轻Node.js的负担并提高安全性。

使用 Node.js 设置 NGINX

要为 Node.js 配置 NGINX,请按照以下步骤操作:

第 1 步:安装 NGINX

首先,您需要在服务器上安装NGINX。根据您的操作系统使用以下命令:

对于 Ubuntu/Debian:

sudo apt update
sudo apt install nginx

对于 CentOS/RHEL:

sudo yum install nginx

安装完成后,可以使用以下命令启动NGINX:

sudo systemctl start nginx

您可以通过在浏览器中访问服务器的 IP 地址来验证 NGINX 是否正在运行。如果 NGINX 正常工作,您将看到默认的 NGINX 欢迎页面。

步骤 2:将 NGINX 配置为 Node.js 的反向代理

要启用 NGINX 作为反向代理,允许其将客户端请求转发到 Node.js 应用程序,我们需要相应地配置 NGINX。

这是在 localhost:3000 上运行的 Node.js 应用程序的 NGINX 配置示例。

  1. 导航到 NGINX 配置目录:
   cd /etc/nginx/sites-available/
  1. 为您的 Node.js 应用程序创建一个新的 NGINX 配置文件:
   sudo nano nodeapp.conf
  1. 添加以下配置:
server {
    listen 80;
    server_name your_domain_or_IP;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
  1. 通过创建指向启用站点的目录的符号链接来启用配置:
   sudo ln -s /etc/nginx/sites-available/nodeapp.conf /etc/nginx/sites-enabled/
  1. 测试 NGINX 配置是否存在语法错误:
   sudo nginx -t
  1. 如果一切正常,重新启动 NGINX:
   sudo systemctl restart nginx

此设置会将端口 80 上的所有传入流量路由到在端口 3000 上运行的 Node.js 应用程序。

NGINX 作为 Node.js 的负载均衡器

当您的 Node.js 应用程序增长时,单个实例可能不足以处理流量。 NGINX 可以配置为负载均衡器,在多个 Node.js 实例之间分配流量。

以下是配置 NGINX 进行负载平衡的方法:

  1. 创建或编辑 NGINX 配置文件 (nodeapp.conf):
   sudo nano /etc/nginx/sites-available/nodeapp.conf
  1. 添加以下配置以启用负载均衡:
upstream node_backend {
    server localhost:3000;
    server localhost:3001;
    server localhost:3002;
}

server {
    listen 80;
    server_name your_domain_or_IP;

    location / {
        proxy_pass http://node_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
  1. 保存文件,测试配置,然后重新启动NGINX:
sudo nginx -t
sudo systemctl restart nginx

解释

  • upstream 块定义了多个 Node.js 服务器(localhost:3000、localhost:3001 和 localhost:3002),NGINX 将平衡这些服务器之间的传入流量。
  • NGINX默认使用轮询算法,轮流向每台服务器发送请求。

此设置将负载均匀分布在多个 Node.js 实例之间,从而提高可扩展性和容错能力。

使用 NGINX 提供静态内容

提供图像、CSS 和 JavaScript 等静态文件可能会给 Node.js 应用程序带来负担。 NGINX 可以减轻这一责任,通过直接提供静态资产来提高性能。

  1. 为静态文件创建一个目录(例如/var/www/html/static/):
   sudo mkdir -p /var/www/html/static
  1. 将静态文件(CSS、图像、JS)移动到此目录中。

  2. 更新 NGINX 配置 (nodeapp.conf) 以提供静态文件:

server {
    listen 80;
    server_name your_domain_or_IP;

    location /static/ {
        root /var/www/html;
    }

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
  1. 测试配置并重启NGINX:
sudo nginx -t
sudo systemctl restart nginx

解释

  • 静态文件的请求(例如,your_domain_or_IP/static/style.css)将直接由 NGINX 从 /var/www/html/static/ 目录提供服务,从而减少 Node.js 服务器上的负载。

使用 NGINX 终止 SSL

客户端和服务器之间的安全通信至关重要,SSL(安全套接字层)提供了这种加密。 NGINX 可以处理 SSL 终止,这意味着它在将 HTTPS 请求传递到 Node.js 应用程序之前处理它们的加密和解密。

以下是如何使用 NGINX 配置 SSL:

  1. 获取SSL证书。您可以从 Let’s Encrypt 获取免费的 SSL 证书或使用任何其他证书颁发机构。

  2. 修改 NGINX 配置以启用 SSL:

server {
    listen 443 ssl;
    server_name your_domain_or_IP;

    ssl_certificate /etc/ssl/certs/your_domain.crt;
    ssl_certificate_key /etc/ssl/private/your_domain.key;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

server {
    listen 80;
    server_name your_domain_or_IP;

    # Redirect all HTTP requests to HTTPS
    return 301 https://$host$request_uri;
}
  1. 测试并重启NGINX:
sudo nginx -t
sudo systemctl restart nginx

解释

  • listen 443 ssl 指令确保 NGINX 侦听 HTTPS 流量。
  • ssl_certificate 和 ssl_certificate_key 指定 SSL 证书和私钥的路径。
  • 从 HTTP 到 HTTPS 的重定向可确保所有流量都使用 SSL。

结论

NGINX 是一个强大的工具,用于提高 Node.js 应用程序的性能、可扩展性和安全性。从负载平衡到提供静态文件和处理 SSL 终止,NGINX 从 Node.js 卸载了许多任务,使您的应用程序能够专注于它最擅长的事情:处理业务逻辑。通过本文提供的配置,您可以设置 NGINX 来提高 Node.js 应用程序的效率和可靠性。

版本聲明 本文轉載於:https://dev.to/imsushant12/nginx-for-nodejs-applications-what-why-and-how-to-use-it-1gbn?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-04-08
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-04-08
  • 如何使用“ JSON”軟件包解析JSON陣列?
    如何使用“ JSON”軟件包解析JSON陣列?
    parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    程式設計 發佈於2025-04-08
  • 如何使用node-mysql在單個查詢中執行多個SQL語句?
    如何使用node-mysql在單個查詢中執行多個SQL語句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    程式設計 發佈於2025-04-08
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    postgresql:為每個唯一標識符在postgresql中提取最後一行,您可能需要遇到與數據集合中每個不同標識的信息相關的信息。考慮以下數據:[ 1 2014-02-01 kjkj 在數據集中的每個唯一ID中檢索最後一行的信息,您可以在操作員上使用Postgres的有效效率: id dat...
    程式設計 發佈於2025-04-08
  • 找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    如何在mySQL中使用mySql 檢索最大計數,您可能會遇到一個問題,您可能會在嘗試使用以下命令:理解錯誤正確找到由名稱列分組的值的最大計數,請使用以下修改後的查詢: 計數(*)為c 來自EMP1 按名稱組 c desc訂購 限制1 查詢說明 select語句提取名稱列和每個名稱...
    程式設計 發佈於2025-04-08
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mySQL組使用mySQL組進行查詢結果,在關係數據庫中使用MySQL組,轉移數據的數據是指重新排列的行和列的重排以增強數據可視化。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的轉換為基於列。 Let's consider the following ...
    程式設計 發佈於2025-04-08
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-04-08
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 $("#map").css({ margin...
    程式設計 發佈於2025-04-08
  • 如何使用PHP從XML文件中有效地檢索屬性值?
    如何使用PHP從XML文件中有效地檢索屬性值?
    從php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    程式設計 發佈於2025-04-08
  • 如何配置Pytesseract以使用數字輸出的單位數字識別?
    如何配置Pytesseract以使用數字輸出的單位數字識別?
    Pytesseract OCR具有單位數字識別和僅數字約束 在pytesseract的上下文中,在配置tesseract以識別單位數字和限制單個數字和限制輸出對數字可能會提出質疑。 To address this issue, we delve into the specifics of Te...
    程式設計 發佈於2025-04-08
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-04-08
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-04-08
  • 如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    使用http request 上傳文件上傳到http server,同時也提交其他參數,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    程式設計 發佈於2025-04-08
  • 如何有效地選擇熊貓數據框中的列?
    如何有效地選擇熊貓數據框中的列?
    在處理數據操作任務時,在Pandas DataFrames 中選擇列時,選擇特定列的必要條件是必要的。在Pandas中,選擇列的各種選項。 選項1:使用列名 如果已知列索引,請使用ILOC函數選擇它們。請注意,python索引基於零。 df1 = df.iloc [:,0:2]#使用索引0和1 ...
    程式設計 發佈於2025-04-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3