如何在 Ubuntu 18.04 上设置用于生产的 Node.js 应用程序如何在 Ubuntu 18.04 上设置用于生产的 Node.js 应用程序如何在 Ubuntu 18.04 上设置用于生产的 Node.js 应用程序如何在 Ubuntu 18.04 上设置用于生产的 Node.js 应用程序
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Ubuntu 18.04 上设置用于生产的 Node.js 应用程序

介绍

Node.js 是用于构建服务器端和网络应用程序的开源 JavaScript 运行时环境。该平台在 Linux、macOS、FreeBSD 和 Windows 上运行。虽然您可以在命令行运行 Node.js 应用程序,但本教程将重点介绍将它们作为服务运行。这意味着它们将在重新启动或失败时重新启动,并且可以安全地用于生产环境。

在本教程中,您将在单个 Ubuntu 18.04 服务器上设置生产就绪的 Node.js 环境。该服务器将运行由 Let's Encrypt 管理的 Node.js 应用程序。

先决条件

本指南假定您具备以下条件:

  • Ubuntu 18.04 服务器设置,如 Ubuntu 18.04 初始服务器设置指南中所述。您应该有一个具有 sudo 权限的非根用户和一个活动的防火墙。
  • 贯穿始终的 example.com。
  • 已安装 Nginx,如如何在 Ubuntu 18.04 上安装 Nginx 中所述。
  • 使用 Let's Encrypt 证书为 Nginx 配置 SSL。如何在 Ubuntu 18.04 上使用 Let's Encrypt 保护 Nginx 将引导您完成整个过程。

完成先决条件后,您将拥有一台服务器,该服务器为您域的默认占位符页面提供服务,网址为 https://example.com/。

第 1 步 — 安装 Node.js

让我们首先使用 NodeSource 包存档安装最新的 Node.js LTS 版本。

首先,安装 NodeSource PPA 以访问其内容。确保您位于主目录中,并使用 curl 检索 Node.js 8.x 存档的安装脚本:

  1. cd ~
  2. curl -sL https://deb.nodesource.com/setup_8.x -o nodesource_setup.sh

您可以使用 nano 或您喜欢的文本编辑器检查此脚本的内容:

  1. nano nodesource_setup.sh

检查完脚本后,在 sudo 下运行它:

  1. sudo bash nodesource_setup.sh

PPA 将添加到您的配置中,您的本地包缓存将自动更新。从 Nodesource 运行安装脚本后,您可以安装 Node.js 包:

  1. sudo apt install nodejs

要在完成这些初始步骤后检查安装的 Node.js 版本,请键入:

  1. nodejs -v
Output
v8.11.3

注意:从 NodeSource PPA 安装时,Node.js 可执行文件称为 nodejs,而不是 node。

nodejs 包包含 nodejs 二进制文件以及 npm,Node 模块的包管理器,因此您无需安装 npm 分开。

npm 使用主目录中的配置文件来跟踪更新。它将在您第一次运行 npm 时创建。执行此命令以验证是否安装了 npm 并创建配置文件:

  1. npm -v
Output
5.6.0

为了让一些 npm 包工作(例如那些需要从源代码编译代码的包),你需要安装 build-essential 包:

  1. sudo apt install build-essential

您现在拥有必要的工具来处理需要从源代码编译代码的 npm 包。

安装 Node.js 运行时后,让我们继续编写 Node.js 应用程序。

第 2 步 — 创建 Node.js 应用程序

让我们编写一个 Hello World 应用程序,它向任何 HTTP 请求返回 \Hello World。这个示例应用程序将帮助您设置 Node.js。您可以用您自己的应用程序替换它 - 只要确保您修改应用程序以侦听适当的 IP 地址和端口。

首先,让我们创建一个名为 hello.js 的示例应用程序:

  1. cd ~
  2. nano hello.js

在文件中插入以下代码:

const http = require('http');

const hostname = 'localhost';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World!\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

保存文件并退出编辑器。

此 Node.js 应用程序侦听指定地址 (localhost) 和端口 (3000),并返回“Hello World!”带有 200 HTTP 成功代码。由于我们正在监听 localhost,因此远程客户端将无法连接到我们的应用程序。

要测试您的应用程序,请键入:

  1. node hello.js

您将看到以下输出:

Output
Server running at http://localhost:3000/

注意:以这种方式运行 Node.js 应用程序将阻止其他命令,直到通过按 CTRL+C 终止应用程序。

要测试应用程序,请在您的服务器上打开另一个终端会话,并使用 curl 连接到 localhost:

  1. curl http://localhost:3000

如果您看到以下输出,则应用程序正常工作并侦听正确的地址和端口:

Output
Hello World!

如果您没有看到预期的输出,请确保您的 Node.js 应用程序正在运行并配置为侦听正确的地址和端口。

一旦您确定它正在运行,请按 CTRL+C 终止应用程序(如果您尚未终止)。

第 3 步 — 安装 PM2

接下来让我们安装 PM2,它是 Node.js 应用程序的进程管理器。 PM2 使应用程序守护进程成为可能,以便它们作为服务在后台运行。

使用 npm 在您的服务器上安装最新版本的 PM2:

  1. sudo npm install pm2@latest -g

-g 选项告诉 npm 安装模块 globally,以便它在系统范围内可用。

让我们首先使用 pm2 start 命令在后台运行您的应用程序 hello.js:

  1. pm2 start hello.js

这也会将您的应用程序添加到 PM2 的进程列表中,每次启动应用程序时都会输出该列表:

Output
[PM2] Spawning PM2 daemon with pm2_home=/home/sammy/.pm2 [PM2] PM2 Successfully daemonized [PM2] Starting /home/sammy/hello.js in fork_mode (1 instance) [PM2] Done. ┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐ │ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │ ├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤ │ hello │ 0 │ fork │ 1338 │ online │ 0 │ 0s │ 0% │ 23.0 MB │ sammy │ disabled │ └──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘ Use `pm2 show <id|name>` to get more details about an app

如您所见,PM2 会自动分配一个App name(基于文件名,没有.js 扩展名)和一个PM2 id。 PM2 还维护其他信息,例如进程的 PID、当前状态和内存使用情况。

如果应用程序崩溃或被终止,在 PM2 下运行的应用程序将自动重启,但我们可以采取额外的步骤,使用 startup 子命令让应用程序在系统启动时启动。此子命令生成并配置启动脚本以在服务器启动时启动 PM2 及其托管进程:

  1. pm2 startup systemd

结果输出的最后一行将包含一个以超级用户权限运行的命令,以便将 PM2 设置为开机启动:

Output
[PM2] Init System found: systemd [PM2] To setup the Startup Script, copy/paste the following command: sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

从输出运行命令,用你的用户名代替 sammy:

  1. sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

作为附加步骤,我们可以保存 PM2 进程列表和相应的环境:

  1. pm2 save

您现在已经创建了一个 systemd unit,它在启动时为您的用户运行 pm2。这个 pm2 实例反过来运行 hello.js。

使用 systemctl 启动服务:

  1. sudo systemctl start pm2-sammy

检查systemd单元的状态:

  1. systemctl status pm2-sammy

有关 systemd 的详细概述,请参阅 Systemd Essentials:使用服务、单元和日志。

除了我们已经涵盖的那些之外,PM2 还提供了许多子命令,允许您管理或查找有关您的应用程序的信息。

使用此命令停止应用程序(指定 PM2 App name 或 id):

  1. pm2 stop app_name_or_id

重新启动应用程序:

  1. pm2 restart app_name_or_id

列出当前由 PM2 管理的应用程序:

  1. pm2 list

使用其 App name 获取有关特定应用程序的信息:

  1. pm2 info app_name

可以使用 monit 子命令启动 PM2 进程监视器。这会显示应用程序状态、CPU 和内存使用情况:

  1. pm2 monit

请注意,不带任何参数运行 pm2 也会显示一个包含示例用法的帮助页面。

现在您的 Node.js 应用程序正在运行并由 PM2 管理,让我们设置反向代理。

第 4 步 — 将 Nginx 设置为反向代理服务器

您的应用程序正在 localhost 上运行并侦听,但您需要为您的用户设置一种访问它的方式。为此,我们将设置 Nginx Web 服务器作为反向代理。

在先决条件教程中,您在 /etc/nginx/sites-available/example.com 文件中设置 Nginx 配置。打开此文件进行编辑:

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

在 server 块中,您应该有一个现有的 location / 块。用以下配置替换该块的内容。如果您的应用程序设置为侦听不同的端口,请将突出显示的部分更新为正确的端口号:

server {
...
    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;
    }
...
}

这会将服务器配置为响应其根目录中的请求。假设我们的服务器在 example.com 可用,通过网络访问 https://example.com/浏览器会将请求发送到 hello.js,监听 localhost 的端口 3000。

您可以将额外的 location 块添加到同一服务器块,以提供对同一服务器上其他应用程序的访问。例如,如果您还在端口 3001 上运行另一个 Node.js 应用程序,您可以添加此位置块以允许通过 https://example.com< 访问它/mark>/app2:

server {
...
    location /app2 {
        proxy_pass http://localhost:3001;
        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;
    }
...
}

为应用程序添加位置块后,保存文件并退出编辑器。

通过键入以下内容确保您没有引入任何语法错误:

  1. sudo nginx -t

重启 Nginx:

  1. sudo systemctl restart nginx

假设您的 Node.js 应用程序正在运行,并且您的应用程序和 Nginx 配置正确,您现在应该能够通过 Nginx 反向代理访问您的应用程序。通过访问您服务器的 URL(其公共 IP 地址或域名)来尝试一下。

结论

恭喜!现在,您的 Node.js 应用程序在 Ubuntu 18.04 服务器上的 Nginx 反向代理后面运行。这种反向代理设置非常灵活,可以让您的用户访问您想要共享的其他应用程序或静态 Web 内容。

©2015-2025 艾丽卡 support@alaica.com