Node.js是几乎所有类型的基于微服务的开发和交付的重要工具。它也是用JavaScript创建服务器应用程序的领先工具,并提供网络服务器和应用服务器的功能。
但是,Node.js有一些缺点和漏洞,可能导致基于Node的应用程序内的性能不理想,甚至崩溃。例如,基于Node.js的网络应用程序很容易出现代码执行缓慢,甚至由于IO绑定操作或流量快速增长而崩溃。它们有时也会在提供静态内容(如图像和JavaScript文件)和跨多个服务器的负载平衡方面遇到困难。
幸运的是,你可以缓存静态内容,在多个应用服务器之间进行代理和负载平衡,并使用Nginx管理客户端之间的端口争夺。这使得Nginx成为提高Node.js性能的优秀工具。
在本教程中,我们将向你展示如何使用Nginx运行一个服务器。我们将通过建立一个简单的Node.js应用程序来介绍Nginx的安装和配置。
要跟上进度,你应该具备以下条件
- 对网络、网络服务器和网络浏览器的通信方式有一定了解
- 对JavaScript、Node.js和异步编程有基本了解
- 在你的本地机器上安装Node.js
- 在你的本地设备上安装Vim文本编辑器
为了演示Nginx在实践中是如何工作的,我们将建立一个简单的Node.js应用程序,它将运行在3000端口,这是Node应用程序运行的一个常见端口。同样的技术应该适用于你本地机器上的任何其他端口。
什么是服务器和网络服务器?
服务器是一台与其他计算机进行通信的计算机,为它们提供这些计算机所要求的信息。这些计算机,也称为客户端,通过局域网(LAN)或广域网(WAN)连接到服务器。一个服务器在多个地点内通过网络发送和收集信息。
网络上的服务器,被称为网络服务器,通过超文本传输协议(HTTP),接收来自客户端通过互联网的请求,如浏览器,并返回HTTP响应,可以是HTML网页,也可以是JSON格式的API调用。
网络服务器是任何使用HTTP作为其客户端-服务器协议与其他计算机通信的数据交换的基础。作为计算机的网络服务器涉及硬件和软件,是网络开发中的一个基本组成部分。软件方面构成了理解URL和控制网络用户如何访问托管文件的部分。
什么是Nginx?
根据文档,Nginx(发音为 "引擎X")是一个HTTP和反向代理服务器,一个邮件代理服务器,以及一个通用的TCP/UDP代理服务器,最初由Igor Sysoev编写。
NginX被用于各种任务,有助于提高Node.js的性能。主要功能包括。
- 反向代理服务器- 随着你的应用程序的流量增加,提高性能的最佳方法是在Node.js服务器前使用NginX作为反向代理服务器,在服务器之间进行负载平衡。这是NginX在Node.js应用程序中的核心用例
- 无状态负载平衡- 这提高了性能,同时减少了后端服务的负载,通过发送客户端请求,由任何可以访问所请求文件的服务器来完成。
- 缓存静态内容- 在Node.js应用程序中提供静态内容,并使用NginX作为反向代理服务器,使应用程序的性能提高一倍,最高可达到每秒1600个请求。
- 实施SSL/TLS和HTTP/2- 鉴于最近在Node.js应用程序中使用SSL/TLS来保证用户交互的安全,NginX也支持HTTP/2连接。
- 性能跟踪- 你可以使用NginX的实时仪表盘提供的统计数据,实时掌握Node.js应用程序的整体性能。
- 可扩展性- 根据你提供的资产,你可以利用NginX中全功能的HTTP、TCP和UDP负载平衡来扩展你的Node.js应用程序。
Nginx目前支持七种脚本语言。Go、Node.js、Perl、PHP、Python、Ruby和Java Servlet Containers(最后一种是实验性模块)。它使你可以在同一台服务器上运行用不同语言编写的应用程序。
安装Nginx
我们将使用基于Debian的操作系统的默认软件包管理器来安装Nginx,它被称为apt。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,与我们的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的默认配置,使其指向另一个端口。我们将使用端口127.0.0.1:8080 。将目录改为/etc/nginx/sites-available/ ,并按如下方式编辑默认文件。
...
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是一个伟大的网络应用程序交付工具,在ADC和网络服务器层都提供了性能和可扩展性。