如何在 Ubuntu 22.04 上使用 Nginx 部署 NestJS API 应用程序教程

在本教程中,我们将解释如何在 Ubuntu 22.04 服务器上使用 Nginx 托管 NestJS 应用程序。

NestJS 是一个流行的框架,用于构建高效且可扩展的 Node.js 服务器端应用程序。NestJS 是一个渐进式的 Node.js 框架,专为构建高效且可扩展的服务器端应用程序而设计。它利用 TypeScript,这是 JavaScript 的一个静态类型超集,提供了一个强类型的环境,从而提高开发人员的生产力和代码可维护性。

NestJS 是围绕模块化架构和依赖注入的概念构建的,这些概念的灵感来自 Angular,使其熟悉使用过 Angular 的开发人员。NestJS 的核心优势之一是它的灵活性。它是平台无关的,这意味着它可用于构建各种类型的应用程序,从微服务到 GraphQL API 和 RESTful 应用程序。该框架被设计为通用的,允许开发人员使用任何外部库和工具,例如 Express 或 Fastify,作为底层的 HTTP 服务器。

在本教程中,我们将逐步介绍如何使用 Nginx 作为反向代理在 Ubuntu VPS 上部署 NestJS 应用程序。

准备工作

服务器准备

必要前提:

  • 一个充满求知欲的大脑。
  • 一台 Linux 服务器(推荐腾讯云、阿里云或雨云等)。

我将以 雨云 为例,带大家创建一台自己的云服务器,以便学习本篇文章的内容。

注册链接: https://rainyun.ivwv.site

创建雨云服务器

以下步骤仅供参考,请根据实际需求选择配置。

  • 点击 云产品云服务器立即购买
  • 选择距离你较近的区域,以保证低延迟。

  • 按照自己需求选择配置,选择Ubuntu 22.04 版本,按照自己需求是否预装Docker。
  • 最后按照提示进行购买。
  • 购买后等待机器部署完毕,点击刚刚创建好的服务器,进入管理面板,找到远程连接相关信息。

  • 我们使用 PowerShell 进行 SSH 远程连接到服务器,Win+R 打开运行窗口,输入 powershell 后点击确定。

  • 输入 ssh root@你的服务器IP 例如 ssh root@154.9.227.239 回车后,首次需要输入 yes,再次回车后即可登录服务器。

  • 到此为止,我们的云服务器就远程连接上了。

使用 Nginx 在 Ubuntu 上托管 NestJS 应用程序

第一步:更新系统

首先,更新你的系统软件包,以确保一切都是最新的:

sudo apt update && sudo apt upgrade -y

第二步:安装 Node.js 和 npm

有关最新版本,请访问 Node.js 官方文档页面。

# 安装 nvm (Node Version Manager)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash

# 下载并安装 Node.js (你可能需要重启终端)
nvm install 20

验证安装:

# 验证环境中是否为正确的 Node.js 版本
node -v # 应该打印 `v20.17.0`

# 验证环境中是否为正确的 npm 版本
npm -v # 应该打印 `10.8.2`

第三步:部署 NestJS 应用程序

有两种部署方式。首先克隆你的 Git 存储库或在服务器上创建一个 NestJS 应用程序。我们已经介绍了这两种方式。

克隆 Git 存储库

接下来,你需要将你的 NestJS 应用程序传输到你的 VPS。如果你的项目托管在 GitHub 上,你可以直接克隆它:

git clone https://github.com/yourusername/your-nestjs-app.git

导航到你的项目目录:

cd your-nestjs-app

安装依赖项并构建应用程序。在你的项目目录中,安装必要的依赖项:

npm install

构建你的 NestJS 应用程序:

npm run build

创建 NestJS 应用程序

让我们继续安装。

NestJS CLI 是一个命令行界面,可帮助你快速设置新项目并执行各种开发任务。

使用 npm 全局安装 CLI:

npm install -g @nestjs/cli

创建一个新的 NestJS 项目。安装 CLI 后,你可以通过运行以下命令创建一个新的 NestJS 项目:

nest new my-nestjs-app

my-nestjs-app 替换为你想要的的项目名称。

CLI 将提示你选择要使用的包管理器(npm 或 yarn)。选择你喜欢的选项,CLI 将自动安装必要的依赖项。

导航到项目目录。创建项目后,导航到项目目录:

cd my-nestjs-app

浏览项目结构

你的新 NestJS 应用程序将具有以下基本结构:

  • src/: 包含主要的应用程序代码。
  • app.controller.ts: 包含一个简单的控制器来处理 HTTP 请求。
  • app.module.ts: 应用程序的根模块。
  • app.service.ts: 一个可以注入到控制器的基本服务。
  • main.ts: 应用程序的入口点。
  • test/: 包含应用程序的测试文件。
  • node_modules/: 包含所有已安装的依赖项。
  • nest-cli.json: NestJS CLI 的配置文件。
  • package.json: 包含项目元数据和脚本。

要构建用于生产的应用程序,请使用:

npm run build

这会将 TypeScript 文件编译为 dist/ 目录中的 JavaScript 文件。

第四步:设置 PM2 来管理你的应用程序

PM2 是一个用于 Node.js 应用程序的进程管理器,可帮助你的应用程序保持运行,并在崩溃时自动重启。

全局安装 PM2:

sudo npm install -g pm2

使用 PM2 启动你的 NestJS 应用程序:

注意: dist/main.js 文件必须存在于项目目录中。在你通过执行 npm run build 命令构建项目后,你将获得它。

pm2 start dist/main.js --name your-nestjs-app

为了确保你的应用程序在服务器重启后重新启动,请使用:

pm2 startup
pm2 save

检查状态

pm2 status

输出:

┌────┬────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name              │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├────┼────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0  │ your-nestjs-app    │ default     │ 0.0.1   │ fork    │ 2521     │ 0s     │ 0    │ online    │ 0%       │ 17.8mb   │ root     │ disabled │
└────┴────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

第五步:配置防火墙

如果你已启用 UFW 防火墙,请按照以下步骤操作。我们需要在防火墙中添加 HTTP 和 HTTPS 端口。执行以下命令集:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload

第六步:安装和配置 Nginx

安装 Nginx:

sudo apt install nginx -y

接下来,将 Nginx 配置为反向代理,以将请求转发到你的 NestJS 应用程序。

为你的应用程序创建一个新的配置文件:

sudo nano /etc/nginx/sites-available/your-nestjs-app

添加以下配置:

server {
    listen 80;
    server_name yourdomain.com; # 替换为你的域名或 IP

    location / {
        proxy_pass http://localhost:3000; # 你的 NestJS 应用程序端口
        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;
    }
}

通过创建到 sites-enabled 的符号链接来启用配置:

sudo ln -s /etc/nginx/sites-available/your-nestjs-app /etc/nginx/sites-enabled/

测试 Nginx 配置是否有语法错误:

sudo nginx -t

如果测试成功,请重启 Nginx 以应用更改:

sudo systemctl restart nginx

第七步:使用 SSL 保护你的应用程序

对于生产环境,强烈建议使用 SSL 来保护你的应用程序。你可以使用 Let’s Encrypt 获取免费的 SSL 证书。

安装 Certbot,Let’s Encrypt 客户端:

sudo apt install certbot python3-certbot-nginx -y

获取并安装 SSL 证书:

sudo certbot --nginx -d yourdomain.com

按照提示完成安装。Certbot 将自动配置 Nginx 以使用 SSL 证书。

第八步:访问你的应用程序

你的 NestJS 应用程序现在应该可以通过你的域名或 IP 地址访问。如果你使用 SSL 保护了你的应用程序,请通过 https://yourdomain.com 访问它。

结论

你已经成功地了解了如何在 Ubuntu 服务器上使用 Nginx 托管 NestJS 应用程序。借助 PM2 管理你的应用程序,即使在服务器重启后,它也应该保持平稳运行。对于生产环境,请确保定期更新你的服务器和依赖项。

雨云 - 新一代云服务提供商: https://rainyun.ivwv.site
我的博客:https://blog.ivwv.site