如何使用 Nginx 在 Ubuntu 20.04 上运行多个 Node.JS 应用程序
简介
虽然在 Ubuntu 终端中启动 Node.js 应用程序很容易,但每个初学者都会问:如何同时启动多个应用程序?如何在关闭终端时保持程序运行?或者,如何将应用程序连接到域名?
在本教程中,我们将使用几种不同的工具:
- 要启动应用程序,您需要安装 NodeJS JavaScript 运行时环境。
- 要将应用程序投入生产并在后台运行(作为服务),您将使用 PM2。
- 要将应用程序联网并附加到域名,需要安装和配置 Nginx。
- 要确保应用程序的安全(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 应用程序通常有两种方法:
- 使用主 JavaScript 文件(通常位于项目根目录)运行应用程序
- 或者,使用 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
来源:主机指北
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论