如何使用 Nginx 在 Ubuntu 20.04 上运行多个 Node.JS 应用程序

简介

虽然在 Ubuntu 终端中启动 Node.js 应用程序很容易,但每个初学者都会问:如何同时启动多个应用程序?如何在关闭终端时保持程序运行?或者,如何将应用程序连接到域名?

在本教程中,我们将使用几种不同的工具:

  1. 要启动应用程序,您需要安装 NodeJS JavaScript 运行时环境。
  2. 要将应用程序投入生产并在后台运行(作为服务),您将使用 PM2。
  3. 要将应用程序联网并附加到域名,需要安装和配置 Nginx。
  4. 要确保应用程序的安全(HTTPS)并申请 Let's Encrypt 安全证书,需要使用 Certbot。

先决条件

完成本教程需要两样东西:

  • 运行 Ubuntu 20.04 的服务器。您应该以具有 sudo 权限的非 root 用户身份登录。
  • 如果您想将应用程序连接到域名,您需要购买一个域名并拥有 DNS 访问权限。在 DNS 中打开一个 A 字段,配置如下:主机名:yourDomainName.com / 类型:A / TTL: 3600 / 数据:服务器的 IP 地址

使用 NVM 安装 Node.js

第一步是安装 NodeJS。然后,为了使其更加灵活,我们使用 Node 版本管理器来随时更改 NodeJS 的版本。

使用以下命令为用户账户安装 Node 版本管理器。

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

要访问 nvm 脚本,请重启终端或使用以下命令重新加载:

$ source ~/.bashrc

使用此命令可以查看所有可用的 Node.js 版本:

$ nvm list-remote
...
v14.12.0
v14.13.0
v14.13.1
v14.14.0
v14.15.0 (LTS: Fermium)
v14.15.1 (LTS: Fermium)
v14.15.2 (LTS: Fermium)
v14.15.3 (LTS: Fermium)
v14.15.4 (LTS: 镄)
v14.15.5 (LTS: 镄)
v14.16.0 (LTS: 镄)
v14.16.1 (LTS: 镄)
v14.17.0 (LTS: Fermium)
v14.17.1 (LTS: 镄)
v14.17.2 (LTS: 镄)
v14.17.3 (LTS: 镄)
v14.17.4 (LTS: 镄)
v14.17.5 (LTS: 镄)
v14.17.6 (LTS: 镄)
v14.18.0 (最新 LTS: 镄)
v15.0.0
v15.0.1
v15.1.0
v15.2.0
v15.2.1
v15.3.0
...

您可以安装此列表中的任何 Node JS 版本。在本教程中,我们将安装 NodeJS 的最新推荐版本 14.18.0 (Fermium)。根据您阅读本教程的时间,下一个推荐版本(Gallium)可能会发布。您可以安装它。

现在,安装最新的 LTS版本:

$ nvm install v14.18.0

要确保 Node.js 已正确安装,请运行此命令:

$ node -v
v14.18.0

NodeJS 是通过名为 NPM 的软件包管理器安装的。要确保安装正确,请使用以下命令:

$ npm -v
8.1.0

PM2 和 Node.js 项目

Node.js 安装完成后,您就可以进入第二步了:安装 PM2!PM2 允许您在后台运行多个应用程序。要安装管理器,请运行以下命令:

$ npm install pm2@latest -g

-g 标志允许您全局安装 PM2(安装到您的用户账户)。

安装完成后,您可以根据 JavaScript 项目的类型确定自己的需求。启动 NodeJS 应用程序通常有两种方法:

  1. 使用主 JavaScript 文件(通常位于项目根目录)运行应用程序
  2. 或者,使用 package.json 文件中的启动脚本运行应用程序。

使用主文件

如果你的项目有一个主文件(假设文件名为 "main.js"),你就可以通过该文件运行应用程序。不过,在使用 PM2 启动应用程序之前,我建议您在终端中启动应用程序,以确保没有错误。如果应用程序启动失败,PM2 不会告诉您。

$ node main.js

如果没有错误,请使用 pm2 启动应用程序。使用以下命令启动应用程序:

$ pm2 start main.js
[PM2] 在应用程序[main](ids:[ 0 ]) 上应用 action restartProcessId
[PM2][main](0) âœ"[PM2] 进程成功启动。
[PM2] 进程成功启动
...

要停止应用程序,请使用以下命令:

$ pm2 stop main.js

如果不在文件文件夹中,可以使用文件名停止应用程序:

$ pm2 stop main

要重启应用程序,请运行以下命令之一:

$ pm2 restart main.js
或
pm2 restart main

使用 package.json

如果没有类似于 "main.js "的启动文件,可以使用 package.json 中的脚本启动应用程序。

在下面的示例中,我们将使用 Next.js 项目中的 package.json 文件。在本教程的其余部分,应用程序将通过端口 3000 启动。

...
"脚本":{
    "dev":"crossenv NODE_ENV=development PORT=3000 node index.js"、
    "构建":"next build"、
    "启动":"node index.js"、
    "安装后":"下一次构建"
},
...

在本例中,应用程序将在生产环境中启动("start "脚本)。但您的应用程序可能会使用其他值。

现在,在项目根目录下创建并编辑名为 "ecosystem.config.cjs "的文件:

$ sudo nano ./ecosystem.config.cjs

打开后,在文件中写入以下内容

module.exports = {
  应用程序
    {
      name: 'myapp'、
      脚本npm'、
      args: 'run start'、
    },
  ],
};

name"(名称)字段包含您要为应用程序起的名称。请将 "myapp "替换为您想赋予它的名称。

在 "args "字段中,您可以指定应用程序的启动脚本。将 "run start "中的 "start "替换为项目 package.json 文件中要运行的脚本(例如:"dev"、"build" 、"start"、"postinstall, ...")。

配置好文件后,使用以下命令启动应用程序:

$ pm2 start ecosystem.config.cjs

首次启动后,您可以使用在 "ecosystem.config.cjs "中指定的名称启动应用程序。

pm2 start myapp

停止应用程序

pm2 stop myapp

重新启动

pm2 restart myapp

想启动多少应用程序,就重复这一步。

要了解 PM2 管理的应用程序的状态,可以使用以下命令:

$ pm2 status

Nginx 和反向代理

现在应用程序已在机器上启动,安装并配置 Nginx 以创建 HTTP 访问。

您的应用程序将在 localhost 上运行和监听。当使用域名从服务器外部发出请求时,请求会发送到您机器的 80 端口(Nginx 网络服务器的端口)。但应用程序在 3000 端口上运行。Nginx 在此扮演代理角色。也就是说,它会将请求重定向到分配给配置域名(在 DNS 中)的服务(Node.js 应用程序)。您需要对 Nginx 进行配置,告诉它您的域名对应的服务运行在您机器的特定端口上。

要在 Ubuntu 服务器上安装 Nginx,请运行以下命令:

$ sudo apt update
$ sudo apt install nginx

在配置Nginx之前,确保防火墙已启用并配置好。首先,打开防火墙(如果还没有)。

$ sudo ufw enable

然后在防火墙中允许 Nginx:

$ sudo ufw allow 'Nginx Full'
或
$ sudo ufw allow 'Nginx HTTP' 或
$ sudo ufw allow "Nginx HTTPS

警告!如果您通过 SSH 连接到服务器,并且是第一次激活防火墙,则必须在防火墙中添加 "OpenSSH"。

$ sudo ufw allow "OpenSSH

配置好防火墙后,为域名创建 Nginx 配置。

$ sudo nano /etc/nginx/sites-available/example.com

在文件中写入以下内容

服务器 {
  listen 80;
  listen [::]:80;
  server_name example.com www.example.com;
  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;
  }
}

listen "字段表示 Nginx 的监听端口。第一个涉及 IPV4,第二个涉及 IPV6。除非特别配置,否则应指定端口 80。

server_name "字段包含附加到配置应用程序的所有域名。

位置 "块表示两件事。首先,"/"处是访问应用程序的 URL 路径。在本例中,它是 "http://example.com/",可以访问配置文件中指定的应用程序。

接下来,"location "块内是 "proxy_pass "字段。proxy_pass 字段是应用程序的本地链接http://localhost:[端口]。请记住,应用程序是在 3000 端口下运行的,所以链接是 "http://localhost:3000"。

您可以使用相同的域名,在第二个区块(同一文件)或另一个文件中为另一个应用程序指定一个更完整的路径。您可以为运行在 5000 端口的应用程序(如内容管理系统)指定"/admin"。这样就会产生一个根 URL "http://example.com/",用于访问主程序,另一个 URL "http://example.com/admin "用于访问管理程序。

可选:

服务器
  listen 80;
  listen [::]:80;
  server_name example.com www.example.com;
  location /admin {
    proxy_pass http://localhost:5000;
    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;
  }
}

写完适合您应用程序的配置后,您可以使用以下命令检查语法错误:

$ sudo nginx -t

现在,使用以下命令将配置导入 /etc/nginx/sites-enabled 文件夹:

$ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled

最后,重启 Nginx

$ sudo service nginx restart
或
$ sudo systemctl restart nginx

如果 DNS 配置正确,就可以通过 HTTP 访问应用程序,如http://example.com。

使用 Let's Encrypt 加密nginx

目前,你可以通过 HTTP 访问应用程序。但要确保客户端与服务器之间的连接安全,就需要改进协议,将其改为HTTPS。为此,请安装 Certbot,它是一项能为你生成和安装 Let's Encrypt SSL 证书的服务。

要在机器上安装 Certbot,请运行以下命令:

$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

安装好 certbot 后,为应用程序申请 SSL 证书:

$ sudo certbot --nginx
您想为哪些名称激活 HTTPS?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: example.com
2: myapp.net
3: globalapp.org
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

现在,选择要保护的域名("example.com")。

$ 选择以逗号或空格分隔的相应数字,或留空输入以选择显示的所有选项(输入 "c "取消):1

在本例中,选择数字 1 并按 ENTER 键。

成功收到证书。
证书保存在/etc/letsencrypt/live/example.com/fullchain.pem
密钥保存在         /etc/letsencrypt/live/example.com/privkey.pem。
此证书将于 ... 到期
证书更新时将更新这些文件。
Certbot 已设置一个计划任务,在后台自动更新该证书。
部署证书
成功将 example.com 的证书部署到 /etc/nginx/sites-enabled/example.com
您的现有证书已成功更新,新证书已安装。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
如果您喜欢 Certbot,请考虑通过以下方式支持我们的工作:
* 向 ISRG / Let's Encrypt 捐款: https://letsencrypt.org/donate
* 向 EFF 捐款: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Certbot 会自动修改 Nginx 配置文件。启用 HTTPS 时无需更改配置文件。请注意,Certbot 生成的证书有有效期。Certbot肯定会询问您的电子邮件地址。在截止日期前几周,您会收到一封电子邮件,提醒您证书过期。您只需重复以下命令即可重新生成和安装证书。

$ sudo certbot --nginx

结论

在本教程中,你已经成功地在机器上安装了 Node.js,使用 PM2 将应用程序转化为后台运行的服务,使用 Nginx 将它们联网并链接到域名,最后通过安装 SSL 证书确保客户端与服务器通信的安全。

您可以参阅此处介绍的各项技术的官方文档来深化本教程:

版权声明:
作者:指北针
链接:https://www.vpscue.com/49320.html
来源:主机指北
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
如何使用 Nginx 在 Ubuntu 20.04 上运行多个 Node.JS 应用程序
简介 虽然在 Ubuntu 终端中启动 Node.js 应用程序很容易,但每个初学者都会问:如何同时启动多个应用程序?如何在关闭终端时保持程序运行?或者,如何将应用程……
<<上一篇
下一篇>>