如何使用 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
安装成功后,终端上应该输出以下消息,确认 Nginx 已安装:
Thanks for using nginx!
Please find the official documentation for nginx here:
* https://nginx.org/en/docs/
在配置 Nginx 之前,让我们快速设置并构建我们的 Node.js 应用程序。
创建 Node.js 应用程序
对于这个简单的 Node.js 应用程序,我们将使用 Node.js 提供的 HTTP 模块构建一个 Node.js 服务器。首先在终端上创建一个文件夹并初始化项目:
mkdir 'nginX server project'
cd 'nginX server project'
npm init -y
上述代码将创建文件夹nginX server project
并将目录切换到该文件夹。然后,我们使用 npm 初始化一个 Node.js 应用程序,并使用-y
标志将所有问题的默认答案设置为“是”。
下一步是创建server.js
包含我们应用程序源代码的文件,并使用您选择的任何 IDE 或文本编辑器打开它:
touch server.js
vim server.js
#or
code .
现在是时候构建并启动服务器了。让我们定义两个额外的子域名,作为测试应用程序是否功能齐全的手段:
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");
});
我们创建了一个带有 Node.js HTTP 模块的服务器,并使用require
上述代码中的函数导入了该模块。在服务器中,我们将根据当前路由渲染两个不同的响应。这两个路由分别是/overview
和/api
。
在子域名上/overview
,我们将渲染纯文本,而在 上,/api
我们将渲染 JSON 对象。带有地址的默认域名127.0.0.1:3000
,加上我们创建的两个路由,将帮助我们进一步了解 Nginx 的工作原理。
让我们配置 Nginx 来从终端测试运行我们的服务器。
配置 Nginx
在我们之前介绍的安装过程结束时,Ubuntu 20.04 启动了 Nginx。服务器应该已经启动并运行了。
打开浏览器并导航到服务器的 IP 地址,您可以在其中访问默认的 Nginx 登录页面以确认软件是否正常运行。
为了让 Nginx 从我们的 Node.js 应用程序监听端口 3000,我们将目录更改为/etc/nginx/sites-available
,在其中我们将创建一个服务器块以包含指向端口 3000 的正确指令的配置:
cd /etc/nginx/sites-available
sudo cp default myserver
将目录更改为后/etc/nginx/sites-available
,第二条命令将默认 Nginx 配置的内容复制并粘贴到名为 的新文件中myserver
。
接下来,打开文件并将适当的指令添加到端口 3000:
sudo vim /etc/nginx/sites-available/myserver
粘贴以下配置块,与默认配置块类似,但针对端口 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;
}
}
保存更改并退出文件。请注意,我们location
在上面配置文件中又创建了三个 s ,与 Node.js 应用程序中的预定义路径匹配。
下一步,让我们通过创建从该文件到sites-enabled
目录的链接来启用上述文件,Nginx 在启动期间从该目录读取:
sudo ln -s /etc/nginx/sites-available/myserver /etc/nginx/sites-enabled/
服务器块现已启用并配置为根据listen
端口和当前端口指令返回对请求的响应。
现在是时候启动我们的Node.js应用程序和Nginx服务来实现最近的更改了。但首先,让我们检查Nginx的状态以确认配置正常工作:
sudo nginx -t
运行上述命令后的输出将如下所示:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
以上输出确认我们的配置成功。接下来,停止并重新启动 Nginx 以使更改生效。Nginx 在安装时默认启动。
sudo systemctl restart nginx
如果 Nginx 由于某种原因没有自动启动,则启动它的命令是:
sudo systemctl start nginx
打开一个新的终端,并将目录更改为 Node.js 应用程序。现在使用以下命令启动您的应用程序:
node server.js
打开浏览器并访问 Node.js 应用程序。Nginx 当前应该提供配置文件中定义的应用程序端口。您可以通过导航到以下位置进行测试localhost/overview
:
为了使默认端口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;
...
}
...
现在我们可以在浏览器上导航到该地址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就像 Web 应用的 DVR,可以记录您网站上发生的所有事件。您无需猜测问题发生的原因,而是可以汇总并报告有问题的网络请求,从而快速了解根本原因。
LogRocket 会为您的应用提供工具,记录基准性能时间,例如页面加载时间、首字节加载时间、慢速网络请求,以及 Redux、NgRx 和 Vuex 的操作/状态。立即免费开始监控。
鏂囩珷鏉ユ簮锛�https://dev.to/logrocket/how-to-run-a-node-js-server-with-nginx-588