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

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

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

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]刪除
最新教學 更多>
  • 什麼時候手動呼叫析構函數是合法的做法?
    什麼時候手動呼叫析構函數是合法的做法?
    何時手動呼叫析構函數是合理的? 手動調用析構函數表明存在缺陷的設計這一概念經常被斷言。然而,這引出了一個問題:這條規則有例外嗎? 反例:需要手動析構函數呼叫的情況確實,在某些情況下有必要這樣做明確調用析構函數:1.受控記憶體釋放:當記憶體分配和釋放獨立於物件建構和銷毀進行管理時,手動析構函式呼叫變得...
    程式設計 發佈於2024-11-17
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-17
  • 為什麼我在 Django 資料庫查詢中收到「InterfaceError (0, \'\')\」?
    為什麼我在 Django 資料庫查詢中收到「InterfaceError (0, \'\')\」?
    在Django 查詢執行中遇到InterfaceError (0, '')Django 使用者可能會遇到持久的「InterfaceError (0 , '')” " 嘗試資料庫操作時出錯,特別是在伺服器重新啟動後。遊標,顧名思義,是與資料庫的持久連接,在多個...
    程式設計 發佈於2024-11-17
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-11-17
  • 使用 Go Module 部署 Go Cloud Functions 時如何解決「Build failed: go: parsing /models/go.mod: open /models/go.mod: no such file or directory\」錯誤?
    使用 Go Module 部署 Go Cloud Functions 時如何解決「Build failed: go: parsing /models/go.mod: open /models/go.mod: no such file or directory\」錯誤?
    使用Go 模組部署Google Cloud Function 錯誤嘗試使用Go 模組在Go 1.11 中部署Google Cloud Function 時,開發者可能會遇到錯誤,「建置失敗:go:解析/models/go.mod:開啟/models/go.mod:沒有這樣的檔案或目錄。」Go模組結構...
    程式設計 發佈於2024-11-17
  • 為什麼我的 Golang `exec.Command` 回傳「退出狀態 1」?
    為什麼我的 Golang `exec.Command` 回傳「退出狀態 1」?
    如何找出Golang的exec.Command中出現「Exit Status 1」錯誤的原因在Golang中執行exec.Command方法時,收到「退出狀態1」錯誤可能會非常模糊。缺乏特定資訊會阻礙有效的調試。 要檢索更詳細的信息,請利用 Command 物件的 Stderr 屬性。這是透過以下方...
    程式設計 發佈於2024-11-17
  • 如何使用「setState」更新狀態中的巢狀物件?
    如何使用「setState」更新狀態中的巢狀物件?
    使用setState 更新state.item[1] 在這種情況下,您正在嘗試更新物件內的物件使用setState 在在您的狀態中。若要正確更新狀態,您需要複製整個狀態對象,修改副本,然後將狀態設定為更新後的副本。 以下是如何更新 state.item[1] 使用setState:// 1. Mak...
    程式設計 發佈於2024-11-17
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-17
  • 將 PHP 連接到資料庫:MySQL 初學者
    將 PHP 連接到資料庫:MySQL 初學者
    在PHP 中連接到MySQL 資料庫至關重要,步驟如下:安裝MySQL 擴充功能使用mysqli_connect() 函數建立連接,參數包括主機、使用者名稱、密碼和資料庫名稱使用mysqli_connect_error() 函數檢查連接是否成功實戰案例:取得所有用戶,透過查詢資料庫並使用mysqli...
    程式設計 發佈於2024-11-17
  • 為什麼 CSS `visibility:hidden` 無法達到懸停效果?
    為什麼 CSS `visibility:hidden` 無法達到懸停效果?
    揭開謎團:為什麼CSS 可見性在懸停時失敗CSS 可見性提供了操作元素可見性的便捷方法,但有時它會偶然發現意想不到的障礙。考慮這樣一個場景,您定義了一個「擾流器」類別來使文字最初不可見,並在滑鼠懸停時顯示它。儘管您有期望,文字仍然頑固地保持在隱藏狀態,無視您的懸停努力。 深入探討原因這種令人困惑的行...
    程式設計 發佈於2024-11-17
  • 何時在 JavaScript 中使用 parseInt() 和 Number() 進行字串到數字的轉換?
    何時在 JavaScript 中使用 parseInt() 和 Number() 進行字串到數字的轉換?
    使用parseInt()和Number()將字串轉換為數字在JavaScript中將字串轉換為數字時,兩個常用的函數是parseInt () 和數字()。雖然它們都具有相同的數值轉換目的,但它們的方法和行為有所不同。 parseInt()parseInt() 執行更具體的任務,稱為解析。它嘗試從字串...
    程式設計 發佈於2024-11-17
  • 項目 避免不必要地使用檢查異常
    項目 避免不必要地使用檢查異常
    檢查異常是 Java 中的一個強大工具,因為它們迫使程式設計師處理異常情況,從而提高程式碼可靠性。然而,過度使用可能會導致 API 難以使用。為了證明檢查異常是合理的,情況必須是真正的異常並且程式設計師能夠採取有用的操作。否則,未經檢查的異常可能更合適。 Java 8 為檢查異常的使用帶來了額外的...
    程式設計 發佈於2024-11-17
  • 為什麼我的 PDO 更新查詢無法修改 MySQL 中的特定行?
    為什麼我的 PDO 更新查詢無法修改 MySQL 中的特定行?
    使用PDO 進行MySQL 更新查詢當嘗試使用PDO 和MySQL 更新資料庫行時,您可能會遇到這樣的情況:您的程式碼執行失敗。本指南探討了此錯誤的可能原因並提供了解決方案。 錯誤:不正確的 UPDATE 語法您遇到的錯誤源自於不正確的 UPDATE 語法。具體來說,您的查詢正在嘗試用提供的值替換 ...
    程式設計 發佈於2024-11-17
  • 資料庫遷移對於 Golang 服務,為什麼重要?
    資料庫遷移對於 Golang 服務,為什麼重要?
    DB Migration, why it matters? Have you ever faced the situations when you deploy new update on production with updated database schemas, but ...
    程式設計 發佈於2024-11-17
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-17

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

Copyright© 2022 湘ICP备2022001581号-3