如何将物联网与节点连接红在Ubuntu 16.04

介绍

节点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的主管理界面将加载。

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

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

/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要领:用服务,单位和学报工作

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

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

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

/etc/systemd/system/node-red.service
[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时,它需要关闭或重新启动过程中的最佳途径。

/etc/systemd/system/node-red.service
# log output to syslog as 'node-red'
SyslogIdentifier=node-red
StandardOutput=syslog

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

/etc/systemd/system/node-red.service
# non-root user to run as
WorkingDirectory=/home/sammy/
User=sammy
Group=sammy

我们要运行Node-RED作为非root用户。 上面的行告诉systemd使用我们的用户和组,以及从我们的主目录中启动Node-RED。

/etc/systemd/system/node-red.service
[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

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

/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_certificatessl_certificate_key线指向我们从咱们加密检索到的证书。 其余ssl_行选择比默认值更安全协议,加密算法和选项。

location /开始的地方,我们实际上定义了节点RED代理块。

/etc/nginx/sites-enabled/node-red.example.com
if ($scheme = http) {
    return 301 https://$server_name$request_uri;
}

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

/etc/nginx/sites-enabled/node-red.example.com
proxy_pass http://localhost:1880;

我们在这里指向我们的Node-RED服务。 它可用于localhost ,端口为1880 ,所以我们通过连接它。 此配置块的其余部分设置一些对正确的代理功能很重要的头。 UpgradeConnection头是处理节点-RED公司的WebSocket连接尤为重要。

最后,我们有一个块,以确保Let's Encrypt挑战响应继续从Nginx的默认Web根:

/etc/nginx/sites-enabled/node-red.example.com
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字段中。

settings.js
adminAuth: {
    type: "credentials",
    users: [{
        username: "admin",
        password: "$2a$08$Ab9prIr1M8a5a1/Zx8.B9.uIOCPe.v90ZGuZc2kAATp6BHJ/WV5KS",
        permissions: "*"
    }]
},

虽然我们已经拿到了文件的打开,取消uihost通过删除线以及//在该行的前面。

settings.js
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 ,你会看到一个登录屏幕,而不是主编辑界面。

Node-RED的登录屏幕

如果您的网站是显示一个登录屏幕和一个https连接时,你已经正确地设置了一切。

结论

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

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏