专栏首页云计算教程系列如何在Debian 9上设置Node.js生产应用程序
原创

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

介绍

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

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

准备

本教程假设您具有以下内容:

完成准备后,您将在https://example.com/拥有一个服务器,为您的域的默认占位符页面提供服务。

第1步 - 安装Node.js.

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

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

sudo apt update
sudo apt install curl

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

cd ~
curl -sL https://deb.nodesource.com/setup_8.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
v8.11.4

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

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

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

npm -v
5.6.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

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

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),并返回伴有200HTTP成功代码的“Hello World!” 。由于我们正在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@latest -g

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

让我们首先使用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自动分配一个App name(基于文件名,没有.js扩展名)和一个PM2 id。PM2还维护其他信息,例如PID进程,其当前状态和内存使用情况。

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

pm2 startup systemd

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

[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

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

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

pm2 save

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

启动服务systemctl

sudo systemctl start pm2-sammy

检查systemd单元的状态:

systemctl status pm2-sammy

除了我们所介绍的内容之外,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/example.com的文件中设置Nginx配置。打开此文件进行编辑:

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/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;
    }
...
}

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

键入以下命令确保没有引入任何语法错误:

sudo nginx -t

重启Nginx:

sudo systemctl restart nginx

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

结论

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

想要了解更多关于设置Node.js生产应用程序的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How To Set Up a Node.js Application for Production on Debian 9》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在Ubuntu 18.04上创建多节点MySQL集群

    MySQL Cluster分布式数据库为MySQL数据库管理系统提供高可用性和吞吐量。MySQL Cluster由一个或多个管理节点(ndb_mgmd)组成,这...

    木纸鸢
  • 如何在Ubuntu 14.04上使用Nginx安装HHVM

    HHVM是一个用于执行PHP和Hack代码的开源虚拟机。HHVM由Facebook开发和支持,这一事实最近引起了越来越多的人们对HHVM的关注。

    木纸鸢
  • 如何在Ubuntu 14.04上为IRC安装Lita Chat Bot

    许多现代DevOps团队在聊天室周围建立了越来越多的基础设施。有很多聊天室,从商业选项(如HipChat和Slack)到DIY选项(如IRC或Jabber / ...

    木纸鸢
  • 在腾讯云CVM上安装熟悉Node.js

    Node.js是一个开源JavaScript运行环境,用于轻松构建服务器端和网络应用程序。该应用程序可在Linux,OS X,FreeBSD和Windows上运...

    黑色技术
  • 如何在Ubuntu 18.04上配置Node.js生产环境应用

    Node.js是一个开源JavaScript运行环境,用于构建服务器端和网络应用程序。该平台可在Linux,macOS,FreeBSD和Windows上运行。虽...

    藕丝空间
  • 如何在Ubuntu 16.04上设置Node.js生产应用程序

    Node.js是一个开源JavaScript运行时环境,用于轻松构建服务器端和网络应用程序。该平台可在Linux,OS X,FreeBSD和Windows上运行...

    小皇帝James
  • Node JS 的未来是什么?

    服务器端: 得益于强大的语言以及主流浏览器的支持和帮助, Node.js是所有编程语言中运行速度最快的。最近,我偶然发现了一篇关于最好的 NodeJS 框架的文...

    五月君
  • 提升 Node.js 应用性能的 5 个技巧

    “如果nginx没有在你的节点服务器之前,那么你可能就错了。”Bryan Hughes在Twitter上说 Node.js是全球领先的用JavaScript——...

    李海彬
  • 提升 Node.js 应用性能的 5 个技巧

    “如果nginx没有在你的节点服务器之前,那么你可能就错了。”Bryan Hughes在Twitter上说 Node.js是全球领先的用JavaScript——...

    李海彬
  • 超实用的Node.js代码段(代码逆袭)

    本书精选300余段Node.js代码,涵盖了服务器端脚本开发中的绝大多数要点、技巧与方法,堪称史上最实用的Node.js框架开发方面的参考书籍,是网站建设与服务...

    用户3157710

扫码关注云+社区

领取腾讯云代金券