웹사이트 검색

Ubuntu 16.04에서 Node-RED로 사물 인터넷을 연결하는 방법


소개

IFTTT 또는 후기 Yahoo Pipes인 Node-RED는 훨씬 더 강력하고 유연한 인터페이스와 다양한 앱 및 서비스와 상호작용하기 위해 노드를 생성하는 대규모 오픈 소스 커뮤니티를 가지고 있습니다.

이 튜토리얼에서는 Node.js와 Node-RED를 설치하고, Let’s Encrypt에서 SSL 인증서를 받고, Nginx를 사용하여 Node-RED에 대한 보안 연결을 처리합니다.

전제 조건

이 자습서를 따르려면 다음이 필요합니다.

  • 이 Ubuntu 16.04 서버 설정 자습서에 따라 루트가 아닌 sudo 사용자 및 기본 방화벽이 설정된 Ubuntu 16.04 서버 1대. 이 자습서에서는 sammy라는 사용자를 사용하지만 물론 원하는 것을 선택하고 필요에 따라 대체할 수 있습니다.\n
  • Ubuntu 16.04에 Nginx를 설치하는 방법에 설명된 대로 포트 80 및 443(Nginx 전체)에서 트래픽을 허용하도록 업데이트된 방화벽과 함께 웹 서버 Nginx가 설치되었습니다.\n
  • DigitalOcean으로 호스트 이름을 설정하는 방법에 설명된 대로 서버를 가리키는 도메인 이름입니다. 이 튜토리얼에서는 전체적으로 node-red.example.com을 사용합니다.\n
  • Let's Encrypt가 설치되고 위에서 구성한 도메인에 대한 인증서가 생성됩니다. Ubuntu 16.04에서 Let's Encrypt로 Nginx를 보호하는 방법은 필요한 단계를 안내합니다. Nginx 구성과 관련된 단계(3~5단계)는 여기에서 다루므로 무시해도 됩니다. 인증서가 성공적으로 발급되었는지 확인하고 자동 갱신을 처리하도록 cron 작업을 설정하십시오.\n

1단계 — Node.js 및 npm 설치

Ubuntu 16.04에서는 Node.js의 최신 장기 지원(LTS) 릴리스가 기본 리포지토리에 포함되어 있으므로 쉽게 설치할 수 있습니다.

  1. sudo apt-get install nodejs-legacy

이 명령은 Node.js v4.2.x LTS(장기 지원)를 설치합니다. 즉, Node.js 재단은 2015년 10월 12일 릴리스 날짜로부터 30개월 동안 이 버전을 계속 지원할 것입니다.

참고: Node-RED의 시작 스크립트는 Node.js 바이너리 이름이 node일 것으로 예상하지만 표준 패키지는 -legacy 버전을 설치하는 것이 중요합니다.nodejs 대신. 이는 기존 패키지와의 이름 충돌 때문입니다.

버전을 확인하여 설치가 성공했는지 확인하십시오.

  1. node -v

Node.js가 버전 번호를 출력하는 것을 볼 수 있습니다.

Output
v4.2.6

Node Package Manager(npm)는 Node.js 소프트웨어 패키지를 설치하고 관리하는 데 도움이 되며 Node-RED를 설치하는 데 사용할 것입니다. apt-get을 사용하여 npm을 설치합니다.

  1. sudo apt-get install npm

성공적으로 설치되었는지 확인하려면 npm에 버전 정보를 인쇄하도록 요청하십시오.

  1. npm -v
Output
3.5.2

오류 없이 버전 번호가 출력되면 npm을 사용하여 Node-RED 자체를 설치하는 다음 단계로 계속 진행할 수 있습니다.

2단계 - Node-RED 설치

npm을 사용하여 node-rednode-red-admin이라는 도우미 유틸리티를 설치합니다.

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

npm은 일반적으로 패키지를 현재 디렉터리에 설치합니다. 여기에서 -g 플래그를 사용하여 패키지를 '전역적으로' 설치하므로 /usr/local/bin과 같은 표준 시스템 위치에 배치됩니다. --unsafe-perm 플래그는 npm이 네이티브 모듈(C 또는 C++과 같은 컴파일된 언어로 작성된 모듈과 . 자바스크립트).

약간의 다운로드 및 파일 섞기 후에 일반 명령줄 프롬프트로 돌아갑니다. 설치를 테스트해 봅시다.

먼저 방화벽에서 포트를 열어야 합니다. Node-RED는 기본적으로 1880 포트를 사용하므로 허용하도록 하겠습니다.

  1. sudo ufw allow 1880

이제 Node-RED 자체를 시작합니다. 포트 1880은 루트 권한이 필요하지 않을 만큼 충분히 높기 때문에 sudo가 필요하지 않습니다.

  1. node-red

일부 "Welcome to 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 파일을 설치해야 합니다. 이는 Ubuntu 16.04가 초기 시스템에 systemd를 사용하는 첫 번째 LTS 릴리스이기 때문입니다. Ubuntu 16.04의 새로운 기능에서 이것과 다른 Ubuntu 16.04 변경 사항에 대한 요약을 찾을 수 있습니다.

node-red.service라는 빈 서비스 파일을 엽니다.

  1. 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: Working with Services, Units, and the Journal을 읽으면 더 많은 정보를 얻을 수 있습니다.

즉, 서비스 파일의 일부 섹션을 분석해 보겠습니다.

[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.js에 일부 메모리 절약 옵션을 전달할 수 있도록 일반 node-red 대신 node-red-pi를 호출합니다. 이렇게 하면 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

루트가 아닌 사용자로 Node-RED를 실행하려고 합니다. 위의 행은 사용자 및 그룹을 사용하여 홈 디렉토리 내에서 Node-RED를 시작하도록 systemd에 지시합니다.

[Install]
WantedBy=multi-user.target

WantedBy는 서비스가 실행되어야 하는 대상을 나타냅니다. 이 경우 Ubuntu가 다중 사용자 모드로 부팅되면 Node-RED 서비스도 시작해야 합니다. 다중 사용자 모드는 기본 시작 대상입니다.

이제 서비스 파일이 설치되고 이해되었으므로 이를 활성화해야 합니다. 이렇게 하면 시작할 때 실행할 수 있습니다.

  1. sudo systemctl enable node-red

지금 서비스를 수동으로 시작하여 여전히 작동하는지 테스트해 보겠습니다.

  1. sudo systemctl start node-red

서버의 포트 1880에서 브라우저를 다시 가리키고 Node-RED가 백업되는지 확인합니다. 그렇다면 다음 단계에서 설치를 확보할 때까지 다시 종료하십시오.

  1. sudo systemctl stop node-red

4단계 - Nginx 설정

Nginx를 사용하여 Node-RED 서비스를 프록시할 것입니다. 즉, Nginx는 포트 443에서 모든 SSL 연결을 처리하고(이전에 설정한 Let’s Encrypt 인증서 사용) 트래픽을 Node-RED로 전달합니다.

사이트에 대한 새 Nginx 구성을 엽니다.

  1. 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_certificatessl_certificate_key 줄은 Let’s Encrypt에서 검색한 인증서를 가리킵니다. 나머지 ssl_ 줄은 기본값보다 더 안전한 프로토콜, 암호 및 옵션을 선택합니다.

location /은 Node-RED 프록시를 실제로 정의하는 블록을 시작합니다.

if ($scheme = http) {
    return 301 https://$server_name$request_uri;
}

이 블록은 일반 비보안 http 연결과 일치하고 사이트의 https 버전으로 리디렉션합니다.

proxy_pass http://localhost:1880;

여기서는 Node-RED 서비스를 가리킵니다. 포트 1880localhost에서 사용할 수 있으므로 여기로 연결을 전달합니다. 이 구성 블록의 나머지 부분은 올바른 프록시 기능에 중요한 몇 가지 헤더를 설정합니다. UpgradeConnection 헤더는 Node-RED의 웹소켓 연결을 처리하는 데 특히 중요합니다.

마지막으로 Nginx의 기본 웹 루트에서 Let’s Encrypt 챌린지 응답을 계속 가져오는지 확인하는 블록이 있습니다.

location '/.well-known/acme-challenge' {
    root /var/www/html;
}

Nginx를 다시 로드하여 새 구성을 선택합니다.

  1. sudo systemctl reload nginx

마지막으로 Node-RED를 다시 시작합니다.

  1. 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을 사용하여 해시를 생성합니다.

  1. node-red-admin hash-pw

비밀번호를 입력하라는 메시지가 표시됩니다. 입력하고 ENTER를 누르면 해시가 화면에 인쇄됩니다. 클립보드에 복사하고 Node-RED 설정 파일을 엽니다.

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

아래로 스크롤하여 adminAuth 블록의 주석 처리를 제거합니다(각 줄 앞의 \//\제거). 사용자 이름을 원하는 대로 변경하고 해시를 암호 필드에 붙여넣습니다.

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에 직접 액세스할 수 없도록 합니다.

  1. sudo ufw deny 1880

마지막으로 Node-RED를 다시 시작합니다.

  1. sudo systemctl restart node-red

https://node-red.example.com으로 이동하면 기본 편집 인터페이스 대신 로그인 화면이 표시됩니다.

사이트에 로그인 화면과 https 연결이 표시되면 모든 것이 올바르게 설정된 것입니다.

결론

이제 SSL 인증서에 Let's Encrypt를 사용하여 Nginx에 의해 프록시되는 Node-RED의 상당히 안전한 설치가 있습니다. 로그인하고 배선하세요! Node-RED의 웹사이트에서 훨씬 더 많은 정보와 프로젝트 영감을 얻을 수 있습니다.