”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > NGINX for Node.js 应用程序:什么、为什么以及如何使用它

NGINX for Node.js 应用程序:什么、为什么以及如何使用它

发布于2024-11-04
浏览:281

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]删除
最新教程 更多>
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    编程 发布于2025-05-25
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-05-25
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-05-25
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-05-25
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-05-25
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-05-25
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    编程 发布于2025-05-25
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-05-25
  • Java开发者如何保护数据库凭证免受反编译?
    Java开发者如何保护数据库凭证免受反编译?
    在java 在单独的配置文件保护数据库凭证的最有效方法中存储凭据是将它们存储在单独的配置文件中。该文件可以在运行时加载,从而使登录数据从编译的二进制文件中远离。使用prevereness class import java.util.prefs.preferences; 公共类示例{ 首选项...
    编程 发布于2025-05-25
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-05-25
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-05-25
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-05-25
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-05-25
  • Python不会对超范围子串切片报错的原因
    Python不会对超范围子串切片报错的原因
    在python中用索引切片范围:二重性和空序列索引单个元素不同,该元素会引起错误,切片在序列的边界之外没有。这种行为源于索引和切片之间的基本差异。索引一个序列,例如“示例” [3],返回一个项目。但是,切片序列(例如“示例” [3:4])返回项目的子序列。索引不存在的元素时,例如“示例” [9] ...
    编程 发布于2025-05-25
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-05-25

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3