如何在 Ubuntu VPS 上使用 Nginx 部署 NestJS 应用程序
介绍
现代 Web 应用程序依赖于稳定且安全的后端。因此,必须创建可扩展、安全且架构复杂的后端应用程序,以便由小型和/或大型开发团队管理。
现代开发人员更喜欢在前端和后端使用 JavaScript。 Express.js 是大多数开发人员使用的优秀 JavaScript 后端框架。然而,其最小的架构使其不适合大型团队的可扩展性和可维护性。这就是 Nest.js 发挥作用的地方。 Nest.js 具有内置架构,这使得它非常适合可扩展性和部署。此外,它对 TypeScript 的原生支持使其比普通 JavaScript 更高效。
在本教程中,您将学习如何使用 Nginx Web 服务器在 VPS 上部署 NestJS 应用程序。您将了解如何将您的应用程序放在网络上并确保所需的安全性。
先决条件
在继续学习本教程之前,您必须满足以下要求:
- Ubuntu 20.04+ VPS 或物理 Ubuntu 机器。 (在本教程中,我们将在 VPS 上使用 Ubuntu 22.04)
- Node.js 和 npm(或yarn)包管理器。您可以参考这篇关于如何在 Ubuntu 上安装 Node.js 的 DO 教程 | DigitalOcean 在您的计算机上安装最新的 Node.js 和 npm 版本。_
- Nginx 网络服务器。使用这篇关于如何在 Ubuntu 上安装 Nginx 的优秀 DO 指南 | DigitalOcean 在您的 Ubuntu 系统上安装 Nginx。
第 1 步 - 准备和部署 NestJS 应用程序
在本部分中,您将安装 NestJS CLI 并创建一个基本的 NestJS 应用程序,您将在后面的部分中学习使用 Nginx 进行部署。
全局安装 NestJS CLI
要在 Ubuntu 计算机中安装 NestJS CLI,请打开终端并输入以下命令。
npm i -g @nestjs/cli
这将在您的计算机上安装 NestJS 命令行界面。接下来,您将学习创建一个新的 NestJS 项目。
创建一个新的 NestJS 项目
现在,NestJS 提供了两种启动新项目的方法。您可以选择最适合您的方法。
使用 NestJS CLI
要使用 CLI 创建 NestJS 项目,请输入以下命令。
nest new <project-name>
? Which package manager would you ❤️ to use? (Use arrow keys)
❯ npm
yarn
pnpm
完成后您将得到如下输出。
CREATE node_app/.eslintrc.js (663 bytes)
CREATE node_app/.prettierrc (51 bytes)
CREATE node_app/README.md (3340 bytes)
CREATE node_app/nest-cli.json (171 bytes)
CREATE node_app/package.json (1947 bytes)
CREATE node_app/tsconfig.build.json (97 bytes)
CREATE node_app/tsconfig.json (546 bytes)
CREATE node_app/src/app.controller.ts (274 bytes)
CREATE node_app/src/app.module.ts (249 bytes)
CREATE node_app/src/app.service.ts (142 bytes)
CREATE node_app/src/main.ts (208 bytes)
CREATE node_app/src/app.controller.spec.ts (617 bytes)
CREATE node_app/test/jest-e2e.json (183 bytes)
CREATE node_app/test/app.e2e-spec.ts (630 bytes)
这将在当前工作目录中创建一个新项目。您也可以提供不同目录的绝对路径,而不是
。
克隆入门模板
NestJS 提供了另一种启动新项目的方法。它是一个用作样板模板的 git 存储库。您可以克隆该存储库并使用以下命令启动项目。
git clone https://github.com/nestjs/typescript-starter.git <project-directory >
克隆完成后,您需要cd
到项目目录,然后运行npm install
以安装package.json
中的依赖项
cd <project-directory>
npm install
项目准备就绪后,您可以使用以下命令启动应用程序服务器:
npm run start
这将在 http://localhost:3000 上运行应用程序。现在,您已经有了一个可以在本地主机上运行的基本 NestJS 应用程序。
测试应用程序
开发应用程序后,您可以对其运行测试以检查应用程序是否按预期运行。 NestJS 提供默认的 Jest 测试,它可以在您的应用程序上运行测试。您可以使用以下命令开始测试:
npm run test
这将测试您的应用程序并返回类似于以下内容的结果:
> node_app@0.0.1 test
> jest
PASS src/app.controller.spec.ts
AppController
root
✓ should return "Hello World!" (24 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 2.895 s
Ran all test suites.
在下一节中,您将了解如何使用 Nginx 作为反向代理在 Web 服务器上部署此 NestJS 应用程序。
第 2 步 - 设置 Nginx 来为 NestJS 应用程序提供服务
现在,我们可以继续设置网络服务器来托管此 NestJS 应用程序。我们将使用反向代理方法。在这种方法中,我们将在本地主机的某个端口上运行我们的应用程序,然后使用 Nginx 服务器将对 VPS 公共 IP 地址或域的任何请求代理到本地主机上的应用程序。使用反向代理服务器是一种行业惯例,因为它通过在传入请求和后端应用程序本身之间建立屏障来增强 Web 服务器的安全性。此外,反向代理可以更好地管理服务器上的负载,特别是在使用服务器托管多个 Web 应用程序时。
我们将从安装 pm2
包管理器开始,它将在运行时管理应用程序。
安装 pm2 进程管理器
您可以使用以下命令安装 pm2
进程管理器。
npm install -g pm2
这将在您的计算机上全局安装 pm2。
为 NestJS 应用程序创建 Nginx 配置
现在,配置 Nginx 来运行该应用程序。确保您已在防火墙中允许 Nginx 应用程序使用 HTTP 和 HTTPS,如先决条件教程中所述。如果您使用的是 ufw
防火墙,则可以按照以下命令进行操作。
ufw enable
ufw allow ‘Nginx Full‘
现在,您将为我们的 NestJS 应用程序创建一个配置块。建议为新应用程序创建新的配置块,而不是编辑默认配置。要创建块,请在终端中键入以下代码。
sudo nano /etc/nginx/sites-available/your_domain
在这里,我们使用 your_domain 作为应用程序,但您将其更改为您的应用程序的名称。然后,在编辑器中输入以下代码:
server {
server_name your_domain www.your_domain;
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;
}
}
现在,您将创建一个符号链接,它告诉 Nginx 在站点可用文件夹中查找可用的 Web 应用程序:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
另外,您需要禁用默认符号链接,否则 nginx 会将所有请求重定向到默认站点。使用以下命令取消链接。
sudo unlink /etc/nginx/sites-enabled/default
现在,使用以下命令重新启动 Nginx 服务。
sudo systemctl restart nginx
使用 Nginx 部署 NestJS 应用程序
现在,您将设置 pm2 包管理器来处理 NestJS 应用程序的执行。将工作目录更改为 Nestjs 应用程序目录并键入以下命令。
pm2 start npm --name "your_domain" – start
您可以运行以下命令将 pm2 配置为在服务器重新启动时运行。
pm2 startup
在 pm2 上完成应用程序设置后,继续并使用以下内容保存 pm2 进程列表:
pm2 save
现在,我们已经将 Web 应用程序设置为在启动时运行,并将 Nginx 配置为反向代理到在本地主机上运行的应用程序。
测试 Web 应用程序
您可以通过键入以下命令从控制台测试 Web 应用程序。
curl http://localhost
由于我们已经在服务器 IP 地址本身上设置了反向代理,因此对您的服务器、域的公共 IP 地址的任何请求或来自服务器的本地主机请求都将重定向到 NestsJS 应用程序 your_domain
。
Hello World!
在下一节中,您将学习如何将 SSL 添加到您的应用程序,这将允许您使用 HTTPS 协议来处理您的请求。
第 3 步 - 使用 Let's Encrypt 添加 SSL(可选)
到目前为止,您已经学习了如何使用 Nginx 服务器部署功能齐全的 NestJS 应用程序。但是,此部署使用 HTTP 协议,由于存在漏洞,因此不建议在生产中使用该协议。因此,您希望迁移到 HTTPS 协议,它是 HTTP 的加密版本。 HTTPS 使用证书颁发机构提供的 SSL/TLS 证书。这些证书特定于网站并加密客户端和服务器之间的通信。
在本节中,您将学习如何为您的网站添加 Let's Encrypt SSL/TLS 证书。
注意::要继续执行此部分,您需要拥有域的 A 证书。在此示例中,我们使用了 your_domain,但您应该仅在将域添加到网站后添加 SSL 证书。
安装 Let’s Encrypt 的 Certbot CLI
Let’s Encrypt 提供了一个 CLI 来为消费者管理和自动化 SSL 证书。您可以使用以下命令安装该工具:
sudo apt install certbot python3-certbot-nginx
这将在您的 Ubuntu VPS 上安装 certbot 客户端。
为您的域获取 SSL/TLS 证书
现在,您可以使用以下命令获取您的域的 SSL 证书
sudo certbot --nginx -d <your_domain> -d <www.your_domain>
您需要将 your_domain
替换为您的域的实际名称。如果这是您第一次在 VPS 上运行 certbot,系统会要求您输入电子邮件并同意用户条款。提供必要的信息并继续。
注意: 仅当您拥有合法域名并且已将您的域名与 NestJS 应用程序关联时,这才有效。
安装证书后,您将能够将所有请求重定向到 HTTPS。建议您重定向所有请求,以确保网站的完整性。
信息: certbot安装的证书的有效期为90天。但是,certbot 会自行自动更新这些证书,因此您无需经常检查其有效性。
结论
在本教程中,您学习了如何使用 Nginx Web 服务器在 Ubuntu VPS 上的生产环境中部署 NestJS 应用程序。您还学习了如何使用 Nginx 为您的应用程序设置 NestJS 项目和反向代理。最后,您学习了如何为服务器域添加 SSL/TLS 证书,以确保客户端和服务器之间通信的完整性。
您可以通过创建复杂的 NestJS 应用程序来扩展这些知识,包括但不限于数据库集成、输入验证器等。
作者选择 OWASP 基金会接收捐赠,作为 Write for DOnations 计划的一部分。