Ubuntu16.04でモノのインターネットをNode-REDに接続する方法
序章
Node-RED は、モノのインターネットの交換機です。これは、お気に入りのアプリ、ウェブサイト、ハードウェアを接続して、新しく便利なことを行うのに役立つビジュアルツールです。 ほとんどの場合、 IFTTTや後期のYahooPipesと比較して、Node-REDははるかに強力で柔軟なインターフェースを備えており、さまざまなノードを作成する大規模なオープンソースコミュニティがあります。アプリとサービス。
このチュートリアルでは、Node.jsとNode-REDをインストールし、Let’s EncryptからSSL証明書を取得し、Nginxを使用してNode-REDの安全な接続を処理します。
前提条件
このチュートリアルに従うには、次のものが必要です。
-
ルート以外のsudoユーザーと基本的なファイアウォールを備えた1つのUbuntu16.04サーバーは、このUbuntu16.04サーバーセットアップチュートリアルに従ってセットアップされます。 このチュートリアルでは、 sammy というユーザーを使用しますが、もちろん、好きなものを選択して、必要に応じて置き換えることができます。
-
Ubuntu 16.04にNginxをインストールする方法で説明されているように、ポート80および443( Nginx Full )でトラフィックを許可するようにファイアウォールが更新されたWebサーバーNginxがインストールされています
-
DigitalOcean でホスト名を設定する方法で説明されているように、サーバーを指すドメイン名。 このチュートリアルでは、全体を通して
node-red.example.com
を使用します。 -
Let’s Encryptをインストールし、上記で構成したドメイン用に証明書を生成します。 Ubuntu 16.04でLet’sEncryptを使用して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か月間、このバージョンを引き続きサポートすることを意味します。
注:Node-REDの起動スクリプトはNode.jsバイナリの名前がnode
であると想定しているため、パッケージの-legacy
バージョンをインストールすることが重要ですが、標準パッケージでは代わりにnodejs
。 これは、既存のパッケージとの名前の競合が原因です。
バージョンを確認して、インストールが成功したことを確認します。
- node -v
Node.jsがバージョン番号を出力するのがわかります。
Outputv4.2.6
Node Package Manager(npm
)は、Node.jsソフトウェアパッケージのインストールと管理に役立ちます。これを使用してNode-REDをインストールします。 apt-get
を使用してnpm
をインストールします。
- sudo apt-get install npm
インストールが成功したことを確認するには、npm
にバージョン情報を印刷するように依頼します。
- npm -v
Output3.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++などのコンパイル言語で記述されたモジュールvs. JavaScript)。
少しダウンロードしてファイルをシャッフルすると、通常のコマンドラインプロンプトに戻ります。 インストールをテストしてみましょう。
まず、ファイアウォールのポートを開く必要があります。 Node-REDはデフォルトでポート1880
を使用するので、それを許可しましょう。
- sudo ufw allow 1880
そして、Node-RED自体を起動します。 ポート1880
はルート権限を必要としないほど高いため、sudo
は必要ありません。
- node-red
一部の「WelcometoNode-RED」メッセージが端末に出力されます。 コンピューターで、Webブラウザーをサーバーのポート1880
にポイントします。 この例では、それはhttp://node-red.example.com:1880
です。 Node-REDのメイン管理インターフェースがロードされます。
正常に機能した場合は、端末にCTRL+C
と入力して、Node-REDをシャットダウンし、コマンドプロンプトに戻ることができます。 Node-REDを正常にインストールしてテストしたので、次に、システムの起動時に起動するように設定します。
ステップ3—起動時にNode-REDを起動する
起動時にNode-REDを自動的に起動するには、従来のinitスクリプトではなく、node-red.service
ファイルをインストールする必要があります。 これは、Ubuntu16.04が初期システムにsystemd
を使用する最初のLTSリリースであるためです。 これと他のUbuntu16.04の変更の概要は、 Ubuntu16.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 Essentials:サービス、ユニット、およびジャーナルの操作を読むことで詳細を学ぶことができます。
そうは言っても、サービスファイルのいくつかのセクションを分解してみましょう。
[Unit]
Description=Node-RED
After=syslog.target network.target
これは私たちのサービスを説明し、ネットワーキングとsyslogが機能した後に開始する必要があることを示しています。
[Service]
ExecStart=/usr/local/bin/node-red-pi --max-old-space-size=128 -v
Restart=on-failure
KillSignal=SIGINT
ExecStart
は、サービスを開始するために必要なコマンドです。 プレーンなnode-red
の代わりにnode-red-pi
と呼ぶので、いくつかのメモリ節約オプションをNode.jsに渡すことができます。 これにより、Node-REDで作成するフローの数(およびそれらの複雑さ)に応じて、適切なサイズのサーバーで適切に実行できるようになります。 Restart=on-failure
は、systemdがクラッシュした場合にNode-REDを再起動しようとすることを意味し、KillSignal
は、プロセスをシャットダウンまたは再起動する必要があるときにNode-REDを終了する最良の方法をsystemdに指示します。
# 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
非rootユーザーとしてNode-REDを実行したいと思います。 上記の行は、systemdに、ユーザーとグループを使用して、ホームディレクトリ内からNode-REDを起動するように指示しています。
[Install]
WantedBy=multi-user.target
WantedBy
は、サービスを実行する必要があるターゲットを示します。 この場合、Ubuntuがマルチユーザーモードで起動すると、Node-REDサービスも起動することがわかります。 Muti-userモードがデフォルトの起動ターゲットです。
サービスファイルがインストールされて理解されたので、それを有効にする必要があります。 これにより、起動時に実行できるようになります。
- sudo systemctl enable node-red
今すぐ手動でサービスを開始して、サービスがまだ機能していることをテストしてみましょう。
- 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構成を開きます。
- 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;
}
}
ファイルを保存して閉じます。 このファイルの機能を説明しましょう。
最初の3行は、リッスンするポートと応答するドメイン名をNginxに指示します。 ssl_certificate
行とssl_certificate_key
行は、Let’sEncryptから取得した証明書を指しています。 残りのssl_
行は、デフォルトよりも安全なプロトコル、暗号、およびオプションを選択します。
location /
は、Node-REDプロキシを実際に定義するブロックを開始します。
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
このブロックは、プレーンで安全でないhttp接続と一致し、それらをサイトのhttpsバージョンにリダイレクトします。
proxy_pass http://localhost:1880;
ここでNode-REDサービスを紹介します。 localhost
のポート1880
で利用できるので、そこに接続を渡します。 この構成ブロックの残りの部分では、適切なプロキシ機能に重要ないくつかのヘッダーを設定します。 Upgrade
およびConnection
ヘッダーは、Node-REDのWebSocket接続を処理するために特に重要です。
最後に、Let’sEncryptチャレンジ応答が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
に注意)にリダイレクトされ、Node-RED管理インターフェースが表示されます。 これは、Nginxを介してNode-REDをプロキシしていることを意味します。 Node-REDをロックダウンするための調整があと少しあります。これで、完了です。
ステップ5—Node-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
接続が表示されている場合は、すべてが正しく設定されています。
結論
これで、SSL証明書にLet’s Encryptを使用してNginxによってプロキシされ、Node-REDがかなり安全にインストールされました。 ログインして配線を取得してください! Node-REDのウェブサイトにはさらに多くの情報とプロジェクトのインスピレーションがあります。