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

6,704 阅读9分钟

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登陆页面,确认软件是否正常运行。

Welcome to Nginx Page

为了让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 来测试。

Overview Page for Nginx Project

为了使默认的端口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

Started a Server Page

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

Testing Last Path

结论

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

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

Ngnix是一个伟大的网络应用程序交付工具,在ADC和网络服务器层都提供了性能和可扩展性。