欢迎光临
我们一直在努力

如何在Debian 10上设置Node.js生产应用程序

介绍

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

在本教程中,您将在单个Debian 10服务器上设置生产就绪的Node.js环境。 该服务器将运行由PM2管理的Node.js应用程序,并通过Nginx反向代理为用户提供对应用程序的安全访问。 Nginx服务器将使用Let’s Encrypt提供的免费证书提供HTTPS。

先决条件

本指南假设您具有以下内容:

完成先决条件后,您将拥有一个服务器,通过https:// your_domain /为您的域的默认占位符页面提供服务。

第1步 – 安装Node.js.

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

要安装NodeSource PPA并访问其内容,首先需要更新软件包索引并安装curl

sudo apt updatesudo apt install curl

确保您位于主目录中,然后使用curl检索Node.js 10 .x存档的安装脚本:

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

您可以使用nano首选文本编辑器检查此脚本的内容:

nano nodesource_setup.sh

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

sudo bash nodesource_setup.sh

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

sudo apt install nodejs

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

nodejs -v
v10.16.0

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

nodejs包中包含nodejs二进制文件以及npm (Node模块的包管理器),因此您无需单独安装npm

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

npm -v
6.9.0

为了使某些npm包能够工作(例如,需要从源代码编译代码),您需要安装build-essential包:

sudo apt install build-essential

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

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

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

让我们编写一个Hello World应用程序,它将“Hello World”返回给任何HTTP请求。 此示例应用程序将帮助您设置Node.js. 您可以使用自己的应用程序替换它 – 只需确保修改应用程序以监听相应的IP地址和端口。

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

cd ~nano hello.js

将以下代码插入到文件中:

〜/ 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 ,因此远程客户端将无法连接到我们的应用程序。

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

node hello.js

您将看到以下输出:

Server running at http://localhost:3000/

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

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

curl http://localhost:3000

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

Hello World!

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

一旦你确定它正在工作,按CTRL+C应用程序(如果你还没有)。

第3步 – 安装PM2

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

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

sudo npm install pm2 -g

-g选项告诉npm全局安装模块,因此它在系统范围内可用。

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

pm2 start hello.js

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

[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会根据没有.js扩展名的文件名自动分配App name以及PM2 id PM2还维护其他信息,例如进程的PID ,其当前状态和内存使用情况。

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

sudo pm2 startup

您将看到如下所示的输出,描述PM2生成的服务配置:

[PM2] Init System found: systemdPlatform systemdTemplate[Unit]Description=PM2 process managerDocumentation=https://pm2.keymetrics.io/After=network.target[Service]Type=forkingUser=rootLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityEnvironment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binEnvironment=PM2_HOME=/root/.pm2PIDFile=/root/.pm2/pm2.pidRestart=on-failureExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrectExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload allExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill[Install]WantedBy=multi-user.targetTarget path/etc/systemd/system/pm2-root.serviceCommand list[ 'systemctl enable pm2-root' ][PM2] Writing init configuration in /etc/systemd/system/pm2-root.service[PM2] Making script booting at startup...[PM2] [-] Executing: systemctl enable pm2-root...Created symlink /etc/systemd/system/multi-user.target.wants/pm2-root.service  /etc/systemd/system/pm2-root.service.[PM2] [v] Command successfully executed.+---------------------------------------+[PM2] Freeze a process list on reboot via:$ pm2 save[PM2] Remove init script via:$ pm2 unstartup systemd

您现在已经创建了一个在启动时运行pm2的systemd 单元 反过来,这个pm2实例运行hello.js

使用systemctl启动服务:

sudo systemctl start pm2-root.service

检查systemd单元的状态:

systemctl status pm2-root.service

您应该看到如下输出:

 pm2-root.service - PM2 process manager   Loaded: loaded (/etc/systemd/system/pm2-root.service; enabled; vendor preset: enabled)   Active: active (running) since Fri 2019-07-12 16:09:54 UTC; 4s ago

有关systemd的详细概述,请参阅Systemd Essentials:使用服务,单位和日记

除了我们所介绍的内容之外,PM2还提供了许多子命令,允许您管理或查找有关应用程序的信息。

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

pm2 stop app_name_or_id

重启应用程序:

pm2 restart app_name_or_id

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

pm2 list

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

pm2 info app_name

可以使用monit子命令提取PM2进程监视器。 这将显示应用程序状态,CPU和内存使用情况:

pm2 monit

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

既然您的Node.js应用程序正在由PM2运行和管理,那么让我们设置反向代理。

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

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

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

sudo nano /etc/nginx/sites-available/your_domain

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

在/ etc / nginx的/网站可用/您的网域
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;    }...}

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

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

/ etc / nginx / sites-available / your_domain – 可选
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;    }...}

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

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

sudo nginx -t

重启Nginx:

sudo systemctl restart nginx

假设您的Node.js应用程序正在运行且您的应用程序和Nginx配置正确,您现在应该能够通过Nginx反向代理访问您的应用程序。 通过在浏览器中访问您的域来试用它: https:// your_domain

结论

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

赞(0) 打赏
未经允许不得转载:老赵部落 » 如何在Debian 10上设置Node.js生产应用程序
data-ad-format="auto" data-full-width-responsive="true">

评论 抢沙发