如何在 Ubuntu 16.04 上用 Node-RED 连接物联网

介绍

Node-RED是物联网的交换板,是一个可视化工具,可以帮助您连接您最喜欢的应用程序,网站和硬件来做新的和有用的事情。 与 IFTTT或晚期雅虎管道相比,Node-RED有一个更强大和灵活的界面,以及一个庞大的开源社区,创建 _nodes_来与各种应用程序和服务进行交互。

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

前提条件

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

  • 一个Ubuntu 16.04服务器,有一个非root sudo用户和基本防火墙,通过跟踪这个Ubuntu 16.04 断开设置教程而设置. 对于这个教程,我们将使用一个用户叫做Sammy ,但当然你可以选择任何你喜欢的,并根据需要替换.
  • 联合国 安装了网络服务器Nginx,更新了防火墙,允许80和443端口的流量(Nginx Full ),解释见[How To Instruction Nginx on Ubuntu 16.04] (https://andsky.com/tech/tutorials/how-to-install-nginx-on-ubuntu-16-04)
  • 一个域名指向您的服务器,详见如何用数字海洋设置主机名. 这个教程将全用"node-red.example.com".
  • 让我们安装加密, 并为您在上面配置的域生成证书 。 [如何用Ubuntu 16.04加密来保护Nginx(https://andsky.com/tech/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04),将带你走过必要的步骤. 你可以忽略关于Nginx配置的步骤(第3–5步),因为我们将覆盖这里. 只要确保成功获得颁发的证书,并设立 " cron " 工作来处理自动续签。 .

第1步:安装 Node.js 和 npm

Ubuntu 16.04 使安装 Node.js 最新的长期支持 (LTS) 版本变得容易,因为它包含在默认存储库中。

1sudo apt-get install nodejs-legacy

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

注:安装包的遗留版本很重要,因为Node-RED的启动脚本预计您的Node.js二进制将被命名为node,但标准包使用nodejs

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

1node -v

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

1[secondary_label Output]
2v4.2.6

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

1sudo apt-get install npm

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

1npm -v
1[secondary_label Output]
23.5.2

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

第2步:安装Node-RED

使用npm来安装node-red和一个名为node-red-admin的辅助工具。

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

npm 通常会将其包安装到当前目录中. 在这里,我们使用-g 标志来全球安装包,以便它们放置在标准的系统位置,如/usr/local/bin--unsafe-perm 标志有助于我们避免一些可能出现的错误,当npm 试图编译本地模块(编译语言的模块,如 C 或 C++ 或 JavaScript)。

在下載和檔案變化之後,您將返回正常的命令行提示. 讓我們測試我們的安裝。

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

1sudo ufw allow 1880

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

1node-red

某些欢迎到Node-RED消息会打印到终端上。在您的计算机上,点击网页浏览器端口为服务器的1880。在我们的示例中,这就是http://node-red.example.com:1880。Node-RED的主要管理界面将加载。

Node-RED's main editing interface

如果它奏效了,你可以在终端中键入CTRL+C,关闭Node-RED并返回命令提示.我们已经成功安装Node-RED并测试了它,所以接下来,我们将设置它在系统启动期间启动。

步骤 3 — 在初创公司推出 Node-RED

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

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

1sudo nano /etc/systemd/system/node-red.service

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

 1[label /etc/systemd/system/node-red.service]
 2[Unit]
 3Description=Node-RED
 4After=syslog.target network.target
 5
 6[Service]
 7ExecStart=/usr/local/bin/node-red-pi --max-old-space-size=128 -v
 8Restart=on-failure
 9KillSignal=SIGINT
10
11# log output to syslog as 'node-red'
12SyslogIdentifier=node-red
13StandardOutput=syslog
14
15# non-root user to run as
16WorkingDirectory=/home/sammy/
17User=sammy
18Group=sammy
19
20[Install]
21WantedBy=multi-user.target

系统d服务文件的完整解释超出了本教程,但您可以通过阅读更多信息(https://andsky.com/tech/tutorials/systemd-essentials-working-with-services-units-and-the-journal)。

说到这一点,让我们在我们的服务文件中分解一些部分:

1[label /etc/systemd/system/node-red.service]
2[Unit]
3Description=Node-RED
4After=syslog.target network.target

这描述了我们的服务,并表明它应该在网络和 syslog 工作后启动。

1[label /etc/systemd/system/node-red.service]
2[Service]
3ExecStart=/usr/local/bin/node-red-pi --max-old-space-size=128 -v
4Restart=on-failure
5KillSignal=SIGINT

ExecStart ' 是启动我们服务所需的命令。 我们称之为 " 节点-红相 " ,而不是 " 节点-红相 " ,这样我们就可以将一些节省记忆的选择传递给节点.js。 这应该允许它在任何合理大小的服务器上运行良好,这当然取决于您在节点RED中创建了多少个流量(以及它们有多复杂). Restart=on-failure'表示系统一旦崩溃将尝试重新启动节点RED,而`KillSignal'则告诉系统在需要关闭或重新启动进程时退出节点RED的最佳方式.

1[label /etc/systemd/system/node-red.service]
2# log output to syslog as 'node-red'
3SyslogIdentifier=node-red
4StandardOutput=syslog

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

1[label /etc/systemd/system/node-red.service]
2# non-root user to run as
3WorkingDirectory=/home/sammy/
4User=sammy
5Group=sammy

我们希望运行Node-RED作为我们的非根用户。上面的行告诉系统d使用我们的用户和组,并从我们的主目录中启动Node-RED。

1[label /etc/systemd/system/node-red.service]
2[Install]
3WantedBy=multi-user.target

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

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

1sudo systemctl enable node-red

现在我们将手动启动服务,以测试它是否仍然工作。

1sudo systemctl start node-red

将浏览器指向服务器的端口1880,并验证 Node-RED 是否备份。

1sudo systemctl stop node-red

第4步:设置 Nginx

这意味着 Nginx 将处理所有在端口 443 的 SSL 连接(使用您之前设置的 Let's Encrypt 证书),然后将流量传输到 Node-RED。

打开网站的新 Nginx 配置。

1sudo nano /etc/nginx/sites-enabled/node-red.example.com

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

 1[label /etc/nginx/sites-enabled/node-red.example.com]
 2server {
 3    listen 80;
 4    listen 443 ssl http2;
 5    server_name node-red.example.com;
 6    ssl_certificate /etc/letsencrypt/live/node-red.example.com/fullchain.pem;
 7    ssl_certificate_key /etc/letsencrypt/live/node-red.example.com/privkey.pem;
 8    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 9    ssl_ciphers EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
10    ssl_prefer_server_ciphers On;
11    ssl_session_cache shared:SSL:128m;
12    ssl_stapling on;
13    ssl_stapling_verify on;
14    resolver 8.8.8.8;
15
16    location / {
17        if ($scheme = http) {
18            return 301 https://$server_name$request_uri;
19        }
20        proxy_pass http://localhost:1880;
21        proxy_set_header Host $host;
22        proxy_set_header X-Real-IP $remote_addr;
23        proxy_http_version 1.1;
24        proxy_set_header Upgrade $http_upgrade;
25        proxy_set_header Connection "upgrade";
26    }
27
28    location '/.well-known/acme-challenge' {
29        root /var/www/html;
30    }
31}

保存並關閉檔案. 讓我們解釋這個檔案的功能。

最初的三行告诉 Nginx 要听哪些端口,以及要响应哪个域名。 ssl_certificatessl_certificate_key 行指我们从 Let's Encrypt 获取的证书。

位置 /开始了我们实际定义我们的Node-RED代理区块。

1[label /etc/nginx/sites-enabled/node-red.example.com]
2if ($scheme = http) {
3    return 301 https://$server_name$request_uri;
4}

此块将匹配任何简单的,不安全的 http 连接,并将其重定向到网站的 https 版本。

1[label /etc/nginx/sites-enabled/node-red.example.com]
2proxy_pass http://localhost:1880;

我们指向我们的Node-RED服务在这里。它可以在本地主机上提供,在端口1880,所以我们在那里传输连接。 此配置块的其余部分设置了一些标题,这些标题对于代理程序的正常运作至关重要。

最後,我們有一個區塊,以確保 Let's Encrypt 挑戰的答案繼續從 Nginx 的默認網頁根收集:

1[label /etc/nginx/sites-enabled/node-red.example.com]
2location '/.well-known/acme-challenge' {
3    root /var/www/html;
4}

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

1sudo systemctl reload nginx

最后,重新启动 Node-RED。

1sudo 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管理员中,而不是将一个裸体的密码直接放入我们的设置文件中,我们首先会对其进行一个单向的加密哈希,然后使用它。

1node-red-admin hash-pw

您将被要求提供密码,输入它,按ENTER,并在屏幕上打印一个哈希。 将其复制到您的剪辑板并打开 Node-RED 设置文件。

1nano ~/.node-red/settings.js

向下滚动,删除adminAuth区块(通过在每个行前删除//)。

1[label settings.js]
2adminAuth: {
3    type: "credentials",
4    users: [{
5        username: "admin",
6        password: "$2a$08$Ab9prIr1M8a5a1/Zx8.B9.uIOCPe.v90ZGuZc2kAATp6BHJ/WV5KS",
7        permissions: "*"
8    }]
9},

虽然我们已经打开了文件,但也可以通过删除线前面的//删除uihost行。

1[label settings.js]
2uiHost: "127.0.0.1",

这意味着Node-RED只会在本地界面上收听,并不能直接通过外部世界访问(它只会通过Nginx代理程序访问)。

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

1sudo ufw deny 1880

最后,重新启动 Node-RED。

1sudo systemctl restart node-red

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

Node-RED's login screen

如果您的网站显示了登录屏幕和https连接,那么您已经设置了正确的设置。

结论

我们现在有一个相当安全的Node-RED安装,由Nginx使用Let's Encrypt进行代理,用于其SSL证书。登录并获取电缆!在Node-RED的网站(http://nodered.org)提供更多信息和项目灵感。

Published At
Categories with 技术
comments powered by Disqus