介绍
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的主要管理界面将加载。
如果它奏效了,你可以在终端中键入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_certificate
和 ssl_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
,您将看到登录屏幕,而不是主要的编辑界面。
如果您的网站显示了登录屏幕和https
连接,那么您已经设置了正确的设置。
结论
我们现在有一个相当安全的Node-RED安装,由Nginx使用Let's Encrypt进行代理,用于其SSL证书。登录并获取电缆!在Node-RED的网站(http://nodered.org)提供更多信息和项目灵感。