介绍

Node-RED 是物联网的总机,是一种可视化工具,可帮助您将喜爱的应用程序、网站和硬件连接在一起,以做新的有用的事情。通常与 IFTTT 或已故的 Yahoo Pipes 相比,Node-RED 具有更强大和更灵活的界面,以及创建 nodes 的大型开源社区以与各种应用程序和服务。

在本教程中,我们将安装 Node.js 和 Node-RED,从 Let's Encrypt 获取 SSL 证书,并使用 Nginx 处理 Node-RED 的安全连接。

先决条件

要遵循本教程,您将需要:

  • 一台具有非 root sudo 用户和基本防火墙的 Ubuntu 16.04 服务器,按照 [此 Ubuntu 16.04 服务器设置教程](https://www.digitalocean.com/community/tutorials/initial-server-setup-with- ubuntu-16-04)。对于本教程,我们将使用一个名为 sammy 的用户,但当然您可以选择您喜欢的任何内容并根据需要进行替换。

  • 已安装 Web 服务器 Nginx,并更新防火墙以允许端口 80 和 443(Nginx Full)上的流量,如 [如何在 Ubuntu 16.04 上安装 Nginx] 中所述(https://www.digitalocean.com /community/tutorials/how-to-install-nginx-on-ubuntu-16-04)

  • 指向您服务器的域名,如如何使用 DigitalOcean 设置主机名。本教程将始终使用 node-red.example.com

  • 安装 Let's Encrypt,并为您在上面配置的域生成证书。 如何在 Ubuntu 16.04 上使用 Let's Encrypt 保护 Nginx 将引导您完成必要的步骤。您可以忽略有关 Nginx 配置的步骤(步骤 3-5),我们将在此处进行介绍。只需确保您获得成功颁发的证书,并设置 cron 作业来处理自动续订。

第 1 步 — 安装 Node.js 和 npm

Ubuntu 16.04 可以轻松安装最新的 Node.js 长期支持 (LTS) 版本,因为它包含在默认存储库中。

sudo apt-get install nodejs-legacy

该命令会安装 Node.js v4.2.x LTS(长期支持),这意味着 Node.js 基金会将从 2015 年 10 月 12 日发布之日起 30 个月内继续支持此版本。

注意:安装包的 -legacy 版本很重要,因为 Node-RED 的启动脚本要求您的 Node.js 二进制文件命名为 node,但标准包使用 nodejs 代替。这是由于与预先存在的包的命名冲突。

通过检查版本来验证安装是否成功。

节点-v

你会看到 Node.js 输出它的版本号:

输出v4.2.6

Node Package Manager (npm) 帮助您安装和管理 Node.js 软件包,我们将使用它来安装 Node-RED。使用 apt-get 安装 npm

sudo apt-get 安装 npm

要验证安装是否成功,请让 npm 打印其版本信息:

npm -v

输出3.5.2

如果它打印的版本号没有错误,我们可以继续下一步,我们将使用 npm 安装 Node-RED 本身。

第 2 步 — 安装 Node-RED

使用 npm 安装 node-red 和一个名为 node-red-admin 的辅助实用程序。

sudo npm install -g --unsafe-perm node-red node-red-admin

npm 通常会将其包安装到您的当前目录中。在这里,我们使用 -g 标志来“全局”安装软件包,因此它们被放置在标准系统位置,例如 /usr/local/bin--unsafe-perm 标志帮助我们避免在 npm 尝试编译本机模块(以 C 或 C++ 与 JavaScript 之类的编译语言编写的模块)时可能弹出的一些错误。

经过一些下载和文件改组后,您将返回到正常的命令行提示符。让我们测试一下我们的安装。

首先,我们需要在防火墙上打开一个端口。 Node-RED 默认使用端口 1880,所以让我们允许它。

sudo ufw 允许 1880

现在启动 Node-RED 本身。不需要 sudo,因为端口 1880 足够高,不需要 root 权限。

节点红

一些“欢迎使用 Node-RED”消息将打印到终端。在您的计算机上,将网络浏览器指向服务器的“1880”端口。在我们的示例中,它是http://node-red.example.com:1880。将加载 Node-RED 的主管理界面。

Node-RED的主编辑界面

如果成功,您可以在终端中键入“CTRL+C”来关闭 Node-RED 并返回到命令提示符。我们已经成功安装 Node-RED 并对其进行了测试,接下来,我们将设置它以在系统启动期间启动。

第 3 步 — 在启动时启动 Node-RED

为了在启动时自动启动 Node-RED,我们需要安装一个 node-red.service 文件,而不是更传统的 init 脚本。这是因为 Ubuntu 16.04 是第一个使用 systemd 作为其初始化系统的 LTS 版本。您可以在 [Ubuntu 16.04 中的新增功能] (https://www.digitalocean.com/community/tutorials/what-s-new-in-ubuntu-16-04) 中找到此更改和其他 Ubuntu 16.04 更改的摘要。

打开一个名为“node-red.service”的空白服务文件。

它是 sudo / tc / sys md / sys m / so d。服务

复制并粘贴以下内容,然后保存并关闭文件。

/etc/systemd/system/node-red.service

[单元]
描述u003d节点-RED
Afteru003dsyslog.target network.target

[服务]
ExecStartu003d/usr/local/bin/node-red-pi --max-old-space-sizeu003d128 -v
重启u003d失败
KillSignalu003dSIGINT

# 将输出记录到 syslog 为 'node-red'
SyslogIdentifieru003dnode-red
标准输出u003d系统日志

# 非root用户运行
工作目录u003d/home/sammy/
用户u003dsammy
组u003d萨米

[安装]
WantedByu003d多用户.target

systemd 服务文件的完整解释超出了本教程,但您可以通过阅读 [Systemd Essentials: Working with Services, Units, and the Journal](https://www.digitalocean.com/community/tutorials/systemd- Essentials-working-with-services-units-and-the-journal)。

也就是说,让我们分解一下我们的服务文件中的一些部分:

/etc/systemd/system/node-red.service

[单元]
描述u003d节点-RED
Afteru003dsyslog.target network.target

这描述了我们的服务,并表明它应该在网络和系统日志运行后启动。

/etc/systemd/system/node-red.service

[服务]
ExecStartu003d/usr/local/bin/node-red-pi --max-old-space-sizeu003d128 -v
重启u003d失败
KillSignalu003dSIGINT

ExecStart 是启动我们的服务所需的命令。我们调用 node-red-pi 而不是普通的 node-red,因此我们可以将一些节省内存的选项传递给 Node.js。这应该允许它在任何合理大小的服务器上运行良好,当然这取决于您在 Node-RED 中创建的流的数量(以及它们的复杂程度)。 Restartu003don-failure 意味着 systemd 将在 Node-RED 崩溃时尝试重新启动它,而KillSignal 告诉 systemd 在需要关闭或重新启动进程时退出 Node-RED 的最佳方式。

/etc/systemd/system/node-red.service

# 将输出记录到 syslog 为 'node-red'
SyslogIdentifieru003dnode-red
标准输出u003d系统日志

这将设置记录时使用的标签,并将所有输出记录到 syslog 服务。

/etc/systemd/system/node-red.service

# 非root用户运行
工作目录u003d/home/sammy/
用户u003dsammy
组u003d萨米

我们想以非 root 用户身份运行 Node-RED。上面的几行告诉 systemd 使用我们的用户和组从我们的主目录中启动 Node-RED。

/etc/systemd/system/node-red.service

[安装]
WantedByu003d多用户.target

WantedBy 表示我们的服务应该运行的目标。在这种情况下,当 Ubuntu 启动到多用户模式时,它会知道也启动我们的 Node-RED 服务。多用户模式是默认的启动目标。

现在我们的服务文件已安装并理解,我们需要启用它。这将使它能够在启动时执行。

sudo systemctl 启用节点红色

现在让我们手动启动该服务以测试它是否仍在工作。

sudo systemctl start node-red

将浏览器指向服务器的端口“1880”并验证 Node-RED 是否已备份。如果是,请将其关闭,直到我们在下一步中保护安装。

sudo systemctl stop node-red

第 4 步 — 设置 Nginx

我们将使用 Nginx 来代理 Node-RED 服务。这意味着 Nginx 将处理端口“443”上的所有 SSL 连接(使用您之前设置的 Let's Encrypt 证书),然后将流量传递给 Node-RED。

为站点打开一个新的 Nginx 配置。

Sudona no / Etc / Ngin x / Shite so Ena bed d / Sore d。嗯。这个米

复制并粘贴以下内容,更改服务器名称和证书路径:

/etc/nginx/sites-enabled/node-red.example.com

服务器 {
听 80;
听 443 ssl http2;
server_name 节点-red.example.com;
ssl_certificate /etc/letsencrypt/live/node-red.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/node-red.example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers 开启;
ssl_session_cache 共享:SSL:128m;
ssl_stapling 开启;
ssl_stapling_verify 开启;
解析器 8.8.8.8;

地点 / {
if ($scheme u003d http) {
返回 301 https://$server_name$request_uri;
}
proxy_pass http://localhost:1880;
proxy_set_header 主机 $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header 升级 $http_upgrade;
proxy_set_header 连接“升级”;
}

位置'/.well-known/acme-challenge' {
根 /var/www/html;
}
}

保存并关闭文件。让我们解释一下这个文件的作用。

前三行告诉 Nginx 监听什么端口,响应什么域名。 ssl_certificatessl_certificate_key 行指向我们从 Let's Encrypt 检索到的证书。其余的 ssl_ 行选择比默认值更安全的协议、密码和选项。

location / 开始我们实际定义 Node-RED 代理的块。

/etc/nginx/sites-enabled/node-red.example.com

if ($scheme u003d http) {
返回 301 https://$server_name$request_uri;
}

此块将匹配任何普通的、非安全的 http 连接,并将它们重定向到站点的 https 版本。

/etc/nginx/sites-enabled/node-red.example.com

proxy_pass http://localhost:1880;

我们在这里指向我们的 Node-RED 服务。它在 localhost1880 端口上可用,所以我们在那里将连接传递给它。此配置块的其余部分设置了一些对代理正常运行很重要的标头。 UpgradeConnection 标头对于处理 Node-RED 的 websocket 连接尤其重要。

最后,我们有一个块来确保让我们加密挑战响应继续从 Nginx 的默认 Web 根中获取:

/etc/nginx/sites-enabled/node-red.example.com

位置'/.well-known/acme-challenge' {
根 /var/www/html;
}

重新加载 Nginx 以获取新配置。

sudo systemctl 重新加载 nginx

最后,再次启动 Node-RED。

sudo systemctl start node-red

再次导航到您的服务器:http://node-red.example.com。您应该被重定向到“https://node-red.example.com”(注意“https”)并查看 Node-RED 管理界面。这意味着我们现在通过 Nginx 代理 Node-RED。我们只需再做一些调整来锁定 Node-RED,然后我们就完成了。

步骤 5 — 保护 Node-RED 并结束

现在我们的连接是安全的,让我们为 Node-RED 管理员添加密码。我们没有将裸密码直接放入我们的设置文件中,而是首先对其进行单向加密哈希,然后使用它。我们将使用 node-red-admin 来创建哈希:

节点红色管理员哈希密码

系统将提示您输入密码。输入它,按“ENTER”,一个哈希将打印在屏幕上。将其复制到剪贴板并打开 Node-RED 设置文件。

纳米 ~/.node-red/settings.js

向下滚动并取消注释 adminAuth 块(通过删除每行前面的“//”)。将“用户名”更改为您喜欢的任何内容,并将哈希粘贴到“密码”字段中。

设置.js

管理员授权:{
类型:“凭证”,
用户:[{
用户名:“管理员”,
密码:“$any$08$abber1 pump1/xxxz.bus.asab.fas0zgozskaattabaj/fakhs”,
权限:“*”
}]
},

当我们打开文件时,通过删除行前的 // 取消注释 uihost 行。

设置.js

uiHost: "127.0.0.1",

这意味着 Node-RED 只会监听本地接口,而不会被外界直接访问(它只能通过 Nginx 代理访问)。您现在可以保存并关闭文件。

最后一次更新防火墙,以确保永远无法直接访问 Node-RED。

sudo ufw 拒绝 1880

最后,重新启动 Node-RED。

sudo systemctl restart node-red

导航到“https://node-red.example.com”,您将看到登录屏幕而不是主编辑界面。

Node-RED的登录界面

如果您的网站显示登录屏幕和“https”连接,则您已正确设置所有内容。

结论

我们现在有一个相当安全的 Node-RED 安装,由 Nginx 使用 Let's Encrypt 为其 SSL 证书代理。登录并获取接线! Node-RED 的网站 上提供了更多信息和项目灵感。

Logo

更多推荐