如何使用 Nginx 运行 Node.js 服务器

2025-06-09

如何使用 Nginx 运行 Node.js 服务器

作者:Ikeh Akinyemi ✏️

Node.js 是几乎所有基于微服务的开发和交付的重要工具。它也是用 JavaScript 创建服务器应用程序的领先工具,同时提供 Web 服务器和应用服务器的功能。

然而,Node.js 也存在一些缺陷和漏洞,可能导致基于 Node 的应用程序性能不佳甚至崩溃。例如,基于 Node.js 的 Web 应用程序容易因 IO 密集型操作或流量快速增长而导致代码执行缓慢甚至崩溃。此外,它们有时在提供静态内容(例如图像和 JavaScript 文件)以及在多台服务器之间进行负载平衡时也存在困难。

幸运的是,您可以使用Nginx缓存静态内容、在多个应用服务器之间进行代理和负载平衡,并管理客户端之间的端口争用。这使得 Nginx 成为提升 Node.js 性能的绝佳工具。

在本教程中,我们将向您展示如何使用 Nginx 运行服务器。我们将通过构建一个简单的 Node.js 应用程序来介绍 Nginx 的安装和配置。

为了继续,您应该具备:

  • 了解网络、网络服务器和网络浏览器如何通信
  • JavaScript、Node.js 和异步编程的基础知识
  • 安装在本地机器上的 Node.js
  • 本地设备上安装的 Vim 文本编辑器

为了演示 Nginx 的实际工作原理,我们将构建一个简单的 Node.js 应用程序,该应用程序将在 3000 端口上运行,这是 Node 应用程序的常用端口。相同的技术也适用于本地计算机上可用的任何其他端口。

什么是服务器和 Web 服务器?

服务器是一台与其他计算机通信,并向其他计算机提供其请求信息的计算机。这些计算机也称为客户端,通过局域网 (LAN) 或广域网 (WAN) 连接到服务器。服务器通过网络在多个位置发送和收集信息。

网络上的服务器称为 Web 服务器,它通过超文本传输​​协议 (HTTP) 接收来自互联网(例如浏览器)的客户端请求,并返回 HTTP 响应(可以是 HTML 网页或 JSON 格式,如同 API 调用一样)。

Web 服务器是任何使用 HTTP 作为客户端-服务器协议与其他计算机进行通信的数据交换的基础。Web 服务器作为一台计算机,包含硬件和软件,是 Web 开发的基本组成部分。软件部分负责理解 URL 并控制 Web 用户如何访问托管文件。

什么是 Nginx?

根据文档,Nginx(发音为“engine X”)是一个 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器,最初由 Igor Sysoev 编写。

Nginx 可用于执行各种有助于提升 Node.js 性能的任务。主要功能包括:

  • 反向代理服务器——随着应用流量的增加,提升性能的最佳方法是使用 Nginx 作为 Node.js 服务器前端的反向代理服务器,在服务器之间实现流量负载均衡。这是 Nginx 在 Node.js 应用程序中的核心用例。
  • 无状态负载平衡——通过将客户端请求发送给任何有权访问请求文件的服务器,可以提高性能,同时减少后端服务的负载
  • 缓存静态内容——在 Node.js 应用程序中提供静态内容并使用 Nginx 作为反向代理服务器,可将应用程序性能提高一倍,达到每秒最多 1,600 个请求
  • 实现 SSL/TLS 和 HTTP/2 — 鉴于最近从使用 SSL/TLS 来保护 Node.js 应用程序中的用户交互,Nginx 也支持 HTTP/2 连接
  • 性能跟踪——您可以使用 Nginx 实时仪表板上提供的统计信息,实时监控 Node.js 应用程序的整体性能
  • 可扩展性——根据您所服务的资产,您可以利用 Nginx 中功能齐全的 HTTP、TCP 和 UDP 负载平衡来扩展您的 Node.js 应用程序

Nginx 目前支持七种脚本语言:Go、Node.js、Perl、PHP、Python、Ruby 和 Java Servlet 容器(最后一个模块尚在实验阶段)。它允许您在同一台服务器上运行用不同语言编写的应用程序。

安装 Nginx

我们将使用基于 Debian 的操作系统的默认软件包管理器(称为apt)来安装 Nginx。Nginx 也适用于几乎所有操作系统的默认存储库。

在安装 Nginx 之前,请确保您已经安装了Ubuntu 操作系统的先决条件

在本教程的后面,我们将根据项目的独特需求配置 Nginx,然后准备实现它。现在让我们使用 apt 安装 Nginx。



sudo apt update
sudo apt install nginx


Enter fullscreen mode Exit fullscreen mode

安装成功后,终端上应该输出以下消息,确认 Nginx 已安装:



Thanks for using nginx!

Please find the official documentation for nginx here:
* https://nginx.org/en/docs/


Enter fullscreen mode Exit fullscreen mode

在配置 Nginx 之前,让我们快速设置并构建我们的 Node.js 应用程序。

创建 Node.js 应用程序

对于这个简单的 Node.js 应用程序,我们将使用 Node.js 提供的 HTTP 模块构建一个 Node.js 服务器。首先在终端上创建一个文件夹并初始化项目:



mkdir 'nginX server project'
cd 'nginX server project'
npm init -y


Enter fullscreen mode Exit fullscreen mode

上述代码将创建文件夹nginX server project并将目录切换到该文件夹​​。然后,我们使用 npm 初始化一个 Node.js 应用程序,并使用-y标志将所有问题的默认答案设置为“是”。

下一步是创建server.js包含我们应用程序源代码的文件,并使用您选择的任何 IDE 或文本编辑器打开它:



touch server.js
vim server.js
#or 
code .


Enter fullscreen mode Exit fullscreen mode

现在是时候构建并启动服务器了。让我们定义两个额外的子域名,作为测试应用程序是否功能齐全的手段:



const http = require("http");

const server = http.createServer((req, res) => {
  const urlPath = req.url;
  if (urlPath === "/overview") {
    res.end('Welcome to the "overview page" of the nginX project');
  } else if (urlPath === "/api") {
    res.writeHead(200, { "Content-Type": "application/json" });
    res.end(
      JSON.stringify({
        product_id: "xyz12u3",
        product_name: "NginX injector",
      })
    );
  } else {
    res.end("Successfully started a server");
  }
});

server.listen(3000, "localhost", () => {
  console.log("Listening for request");
});


Enter fullscreen mode Exit fullscreen mode

我们创建了一个带有 Node.js HTTP 模块的服务器,并使用require上述代码中的函数导入了该模块。在服务器中,我们将根据当前路由渲染两个不同的响应。这两个路由分别是/overview/api

在子域名上/overview,我们将渲染纯文本,而在 上,/api我们将渲染 JSON 对象。带有地址的默认域名127.0.0.1:3000,加上我们创建的两个路由,将帮助我们进一步了解 Nginx 的工作原理。

让我们配置 Nginx 来从终端测试运行我们的服务器。

配置 Nginx

在我们之前介绍的安装过程结束时,Ubuntu 20.04 启动了 Nginx。服务器应该已经启动并运行了。

打开浏览器并导航到服务器的 IP 地址,您可以在其中访问默认的 Nginx 登录页面以确认软件是否正常运行。欢迎来到 Nginx 页面

为了让 Nginx 从我们的 Node.js 应用程序监听端口 3000,我们将目录更改为/etc/nginx/sites-available,在其中我们将创建一个服务器块以包含指向端口 3000 的正确指令的配置:



cd /etc/nginx/sites-available
sudo cp default myserver 


Enter fullscreen mode Exit fullscreen mode

将目录更改为后/etc/nginx/sites-available,第二条命令将默认 Nginx 配置的内容复制并粘贴到名为 的新文件中myserver

接下来,打开文件并将适当的指令添加到端口 3000:



sudo vim /etc/nginx/sites-available/myserver


Enter fullscreen mode Exit fullscreen mode

粘贴以下配置块,与默认配置块类似,但针对端口 3000 进行了更新:



#The Nginx server instance
server {
    listen 0.0.0.0:80;
    server_name localhost;

    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://127.0.0.1:3000/;
      proxy_redirect off;
    }

    location /overview {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://127.0.0.1:3000/overview;
      proxy_redirect off;
    }

    location /api {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://127.0.0.1:3000/api;
      proxy_redirect off;
    }
 }


Enter fullscreen mode Exit fullscreen mode

保存更改并退出文件。请注意,我们location在上面配置文件中又创建了三个 s ,与 Node.js 应用程序中的预定义路径匹配。

下一步,让我们通过创建从该文件到sites-enabled目录的链接来启用上述文件,Nginx 在启动期间从该目录读取:



sudo ln -s /etc/nginx/sites-available/myserver /etc/nginx/sites-enabled/


Enter fullscreen mode Exit fullscreen mode

服务器块现已启用并配置为根据listen端口和当前端口指令返回对请求的响应。

现在是时候启动我们的Node.js应用程序和Nginx服务来实现最近的更改了。但首先,让我们检查Nginx的状态以确认配置正常工作:



sudo nginx -t 


Enter fullscreen mode Exit fullscreen mode

运行上述命令后的输出将如下所示:



nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful


Enter fullscreen mode Exit fullscreen mode

以上输出确认我们的配置成功。接下来,停止并重新启动 Nginx 以使更改生效。Nginx 在安装时默认启动。



sudo systemctl restart nginx


Enter fullscreen mode Exit fullscreen mode

如果 Nginx 由于某种原因没有自动启动,则启动它的命令是:



sudo systemctl start nginx


Enter fullscreen mode Exit fullscreen mode

打开一个新的终端,并将目录更改为 Node.js 应用程序。现在使用以下命令启动您的应用程序:



node server.js


Enter fullscreen mode Exit fullscreen mode

打开浏览器并访问 Node.js 应用程序。Nginx 当前应该提供配置文件中定义的应用程序端口。您可以通过导航到以下位置进行测试localhost/overviewNginx 项目概览页面

为了使默认端口127.0.0.1适用于我们的 Node.js 应用程序,我们需要编辑 Nginx 的默认配置以指向另一个端口。我们将使用 port 127.0.0.1:8080。将目录更改为/etc/nginx/sites-available/并编辑 default 文件,如下所示:



...
  server {
      listen 8080 default_server;
      listen [::]:8080 default_server;
      ...
  }
...


Enter fullscreen mode Exit fullscreen mode

现在我们可以在浏览器上导航到该地址127.0.0.1并访问我们的应用程序的主端口:3000启动服务器页面

为了进一步测试我们定义的所有其他路径是否有效,让我们尝试最后一条路径/api测试最后一条路径

结论

在本教程中,我们学习了如何将 Nginx 设置为后端应用程序的 Node.js 服务器。

我们使用 Node.js 和 Nginx 构建了一个简单的 Node.js 应用程序。然后,我们将 Nginx 配置为监听 3000 端口,并在浏览器上提供我们在 Node.js 应用程序中预定义的内容。

Ngnix 是用于 Web 应用程序交付的绝佳工具,可在 ADC 和 Web 服务器层提供性能和可扩展性。


仅 200 个✔️ 监控生产环境中失败和缓慢的网络请求

部署基于 Node 的 Web 应用或网站很容易,但确保 Node 实例持续为应用提供资源才是关键。如果您需要确保对后端或第三方服务的请求成功,不妨尝试一下 LogRocket

LogRocket 网络请求监控

LogRocket就像 Web 应用的 DVR,可以记录您网站上发生的所有事件。您无需猜测问题发生的原因,而是可以汇总并报告有问题的网络请求,从而快速了解根本原因。

LogRocket 会为您的应用提供工具,记录基准性能时间,例如页面加载时间、首字节加载时间、慢速网络请求,以及 Redux、NgRx 和 Vuex 的操作/状态。立即免费开始监控。

鏂囩珷鏉ユ簮锛�https://dev.to/logrocket/how-to-run-a-node-js-server-with-nginx-588
PREV
理解 TypeScript 生成器
NEXT
使用 VanillaJS 从头开始​​构建类似 React 的状态管理系统。