介绍
节点RED是物联网,可视化工具,可以帮助您连接您最喜欢的应用,网站和硬件一起做新的和有用的东西交换机。 相比于大多数情况IFTTT或已故雅虎管道,节点RED有一个更强大和灵活的接口,和一个大型的开源社区创建节点与各种应用程序和服务的互动。
在本教程中,我们将安装Node.js和Node-RED,从Let's Encrypt获取SSL证书,并使用Nginx处理Node-RED的安全连接。
先决条件
要遵循本教程,您需要:
一个Ubuntu的16.04服务器以非root用户sudo的和基本的防火墙通过以下设置这个Ubuntu的16.04断绝安装教程 。 在本教程中,我们将使用一个名为sammy用户,当然你可以选择任何你喜欢的替代品需要。
Web服务器Nginx的安装,与防火墙更新,以允许在端口80和443(Nginx的全部 )流量,在解释如何在Ubuntu 16.04安装的Nginx
一个域名指向你的服务器,如描述如何建立与DigitalOcean主机名 。 本教程将使用
node-red.example.com
贯穿始终。让我们来加密安装,并为您上面配置的域生成的证书。 如何在Ubuntu 16.04与咱们加密安全的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 Foundation将在2015年10月12日发布之后的30个月内继续支持此版本。
注意 :安装是非常重要的-legacy
因为节点-RED的启动脚本期待您的Node.js二进制文件被命名为包的版本node
,但标准包使用nodejs
来代替。 这是由于与预先存在的包的命名冲突。
通过检查版本来验证安装是否成功。
node -v
你会看到Node.js输出其版本号:
Outputv4.2.6
节点包管理器( npm
)可帮助您安装和管理Node.js的软件包,我们将用它来安装节点RED。 安装npm
使用apt-get
。
sudo apt-get install npm
要验证安装是否成功,请npm
打印的版本信息:
npm -v
Output3.5.2
如果打印的版本号没有错误,我们可以继续到我们的下一个步骤,我们将使用npm
安装节点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的模块)本机模块。
经过一点下载和文件洗牌,你会返回到正常的命令行提示符。 让我们测试我们的安装。
首先,我们需要在防火墙上打开一个端口。 节点RED默认使用的端口1880
,让我们的允许。
sudo ufw allow 1880
现在启动Node-RED本身。 没有sudo
是必要的,因为端口1880
是高到足以不需要root权限。
node-red
一些“欢迎使用Node-RED”消息将打印到终端。 在您的计算机,网络浏览器指向到端口1880
的服务器。 在我们的例子,这是http:// node-red.example.com :1880
。 Node-RED的主管理界面将加载。
如果它的工作,你可以键入CTRL+C
在终端关闭节点RED并返回到命令提示符。 我们成功安装了Node-RED并对其进行了测试,接下来,我们将其设置为在系统启动时启动。
第3步 - 启动时启动Node-RED
为了在启动时自动启动节点RED,我们需要安装一个node-red.service
而不是更传统的init脚本文件。 这是因为,Ubuntu的16.04是使用第一LTS释放systemd
为它的init系统。 你可以找到这个和其他的Ubuntu 16.04的变化总结什么在Ubuntu 16.04的新功能 。
打开名为一个空白文件服务node-red.service
。
sudo nano /etc/systemd/system/node-red.service
在以下内容中复制和粘贴,然后保存并关闭文件。
[Unit]
Description=Node-RED
After=syslog.target network.target
[Service]
ExecStart=/usr/local/bin/node-red-pi --max-old-space-size=128 -v
Restart=on-failure
KillSignal=SIGINT
# log output to syslog as 'node-red'
SyslogIdentifier=node-red
StandardOutput=syslog
# non-root user to run as
WorkingDirectory=/home/sammy/
User=sammy
Group=sammy
[Install]
WantedBy=multi-user.target
的systemd服务文件的完整解释超出了本教程,但你可以通过阅读了解更多Systemd要领:用服务,单位和学报工作 。
也就是说,让我们分解我们的服务文件中的一些部分:
[Unit]
Description=Node-RED
After=syslog.target network.target
这描述了我们的服务,并指示它应该在网络和系统日志运行后启动。
[Service]
ExecStart=/usr/local/bin/node-red-pi --max-old-space-size=128 -v
Restart=on-failure
KillSignal=SIGINT
ExecStart
是启动我们的服务所需要的命令。 我们称之为node-red-pi
而不是简单的node-red
,所以我们可以通过一些节省内存的选项Node.js的 这应该允许它的合理大小的服务器上运行良好,您在节点RED(以及如何复杂,他们是)创建了多少流量取决于当然, Restart=on-failure
意味着systemd会尝试重新启动节点RED如果崩溃和KillSignal
告诉systemd退出节点RED时,它需要关闭或重新启动过程中的最佳途径。
# log output to syslog as 'node-red'
SyslogIdentifier=node-red
StandardOutput=syslog
这将设置记录时使用的标签,并将所有输出记录到syslog服务。
# non-root user to run as
WorkingDirectory=/home/sammy/
User=sammy
Group=sammy
我们要运行Node-RED作为非root用户。 上面的行告诉systemd使用我们的用户和组,以及从我们的主目录中启动Node-RED。
[Install]
WantedBy=multi-user.target
WantedBy
表明我们的服务应该下运行的目标。 在这种情况下,当Ubuntu启动到多用户模式时,它会知道也启动我们的Node-RED服务。 多用户模式是默认启动目标。
现在我们的服务文件已经安装和理解,我们需要启用它。 这将使其能够在启动时执行。
sudo systemctl enable node-red
让我们手动启动服务,测试它仍然工作。
sudo systemctl start node-red
将浏览器指向回服务器的端口1880
,确认节点-RED是回来了。 如果是,请将其关闭,直到我们在下一步中确保安装。
sudo systemctl stop node-red
第4步 - 设置Nginx
我们将使用Nginx的代理节点-RED服务。 这意味着Nginx的将处理所有端口上的SSL连接的443
(使用您之前设置了让我们的加密证书),然后通过交通沿线到节点红色。
Oopen一个新的Nginx配置的网站。
sudo nano /etc/nginx/sites-enabled/node-red.example.com
复制并粘贴以下内容,更改服务器名称和证书路径:
server {
listen 80;
listen 443 ssl http2;
server_name node-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 On;
ssl_session_cache shared:SSL:128m;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8;
location / {
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
proxy_pass http://localhost:1880;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location '/.well-known/acme-challenge' {
root /var/www/html;
}
}
保存并关闭文件。 让我们来解释这个文件的作用。
前三行告诉Nginx要监听的端口,以及要响应的域名。 该ssl_certificate
和ssl_certificate_key
线指向我们从咱们加密检索到的证书。 其余ssl_
行选择比默认值更安全协议,加密算法和选项。
location /
开始的地方,我们实际上定义了节点RED代理块。
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
此块将匹配任何简单的非安全http连接,并将它们重定向到站点的https版本。
proxy_pass http://localhost:1880;
我们在这里指向我们的Node-RED服务。 它可用于localhost
,端口为1880
,所以我们通过连接它。 此配置块的其余部分设置一些对正确的代理功能很重要的头。 在Upgrade
和Connection
头是处理节点-RED公司的WebSocket连接尤为重要。
最后,我们有一个块,以确保Let's Encrypt挑战响应继续从Nginx的默认Web根:
location '/.well-known/acme-challenge' {
root /var/www/html;
}
重新加载Nginx来获取新的配置。
sudo systemctl reload nginx
最后,再次启动Node-RED。
sudo systemctl start node-red
再次,导航到你的服务器: http:// node-red.example.com
。 您应该被重定向到https:// node-red.example.com
(注意https
),看看节点-RED管理界面。 这意味着我们现在通过Nginx代理Node-RED。 我们只需要进行一些调整来锁定Node-RED,然后我们就完成了。
第5步 - 保护节点RED和包装
现在我们的连接是安全的,让我们给Node-RED管理员添加一个密码。 我们不是将裸密码放入我们的设置文件中,而是首先对其进行单向加密哈希,然后使用它。 我们将使用node-red-admin
创建哈希:
node-red-admin hash-pw
系统将提示您输入密码。 键入它,然后按ENTER
,和一个哈希将在屏幕上打印出来。 将其复制到剪贴板并打开Node-RED设置文件。
nano ~/.node-red/settings.js
向下滚动并取消adminAuth
(每行前通过删除“//”)模块。 更改username
,以任何你喜欢的,和散列粘贴到password
字段中。
adminAuth: {
type: "credentials",
users: [{
username: "admin",
password: "$2a$08$Ab9prIr1M8a5a1/Zx8.B9.uIOCPe.v90ZGuZc2kAATp6BHJ/WV5KS",
permissions: "*"
}]
},
虽然我们已经拿到了文件的打开,取消uihost
通过删除线以及//
在该行的前面。
uiHost: "127.0.0.1",
这意味着Node-RED将只监听本地接口,并且不能被外部直接访问(它只能通过Nginx代理访问)。 您现在可以保存并关闭文件。
最后一次更新防火墙,只是为了确保Node-RED永远不能直接访问。
sudo ufw deny 1880
最后,重新启动Node-RED。
sudo systemctl restart node-red
导航到https:// node-red.example.com
,你会看到一个登录屏幕,而不是主编辑界面。
如果您的网站是显示一个登录屏幕和一个https
连接时,你已经正确地设置了一切。
结论
我们现在有一个相当安全的Node-RED安装,由Nginx使用Let's Encrypt为其SSL证书代理。 登录并获得接线! 有提供更多的信息和项目的灵感节点-RED的网站 。