개발을 위해 Raspberry Pi 서버를 구축하는 방법

게시 됨: 2022-03-11

Raspberry Pi는 USD $5의 저렴한 가격에 구입할 수 있는 작은 컴퓨터로 다양한 유형의 소프트웨어를 실행하고 다양한 프로젝트를 구축할 수 있습니다.

이 기사에서는 홈 개발 서버로 설정하고 네트워크 외부에서 액세스할 수 있는 전체 스택 JavaScript 애플리케이션을 배포하는 프로세스를 안내합니다. 이것은 원격 디지털 작업 공간을 설정하거나 단순히 개발에 사용하는 하드웨어를 제어하는 ​​데 적합합니다.

이 Raspberry Pi 홈 서버에 필요한 것은 무엇입니까?

이것은 이제 특히 Raspberry Pi 3 자습서이지만 1세대로 돌아가는 모델에서도 여전히 작동 해야 합니다. 이전 모델이나 Raspberry Pi Zero가 있는 경우 아래 의견에 경험을 알려주십시오.

Raspberry Pi 보드 자체 외에도 다음이 필요합니다.

  • 마이크로 USB 충전기
  • 이더넷 케이블
  • microSD 카드(최소 8GB, 최대 32GB의 카드가 제대로 작동하는 것 같습니다)

다음은 초기 설정 중에도 유용합니다.

  • USB 키보드
  • HDMI 케이블 및 모니터

라즈베리 파이 OS: 라즈비안

Raspberry Pi에 운영 체제를 설치하는 것은 간단합니다. 먼저 컴퓨터를 사용하여 부팅 이미지를 microSD 카드에 설치합니다. 그런 다음 카드를 Raspberry Pi에 삽입하고 거기에서 부팅하기만 하면 됩니다.

Raspbian은 Debian 7.0( Wheezy )에서 이식된 Linux 배포판으로 장치 아키텍처에 최적화된 Raspberry Pi의 공식 OS입니다. Pi에서 선호하는 OS를 실행하기 위한 다른 옵션이 있지만 단순성 때문에 Raspbian을 사용합니다.

이 튜토리얼은 Raspbian의 이 버전(또는 그 이상)에서 작동하도록 업데이트되었습니다.

 Kernel version : #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) Kernel release : 4.9.0-8-amd64

Raspbian을 설치하려면 공식 다운로드 페이지로 이동하여 최신 Raspbian 버전이 포함된 zip 파일을 다운로드합니다.

그런 다음 microSD 카드를 컴퓨터의 SD 카드 슬롯이나 어댑터에 삽입합니다. 컴퓨터의 운영 체제에 따라 Linux, Mac OS 또는 Windows용 Raspberry 웹 사이트에 제공된 지침을 따르십시오.

프로세스가 완료되면 컴퓨터에서 SD 카드를 꺼내 라즈베리 파이에 삽입합니다. 이더넷 케이블을 사용하여 Raspberry Pi를 라우터에 연결하고 Micro USB 충전기를 연결하면 Raspberry Pi 부팅이 시작됩니다.

초기 구성에는 두 가지 옵션이 있습니다.

  • USB 키보드와 HDMI 모니터가 있는 경우 초기 설정을 위해 이를 Raspberry Pi에 연결할 수 있습니다.
    • Pi는 이러한 장치를 연결하는 즉시 인식해야 합니다.
    • Pi가 처음 부팅되면 자동으로 raspi-config 를 실행합니다. 첫 번째 부팅 후 장치를 구성하려면 sudo raspi-config 를 직접 실행해야 합니다.
  • 해당 항목이 없으면 SSH를 사용하여 켜져 있는 동안 Raspberry Pi에 연결할 수 있습니다.
    • 먼저 로컬 네트워크에서 Raspberry Pi의 IP 주소를 찾아야 합니다. 이것은 라우터의 관리 페이지에 연결하거나 nmap 과 같은 네트워크 도구를 사용하여 수행할 수 있습니다.
    • 장치의 IP 주소가 있으면 터미널에서 SSH를 사용하여(또는 Windows를 사용하는 경우 Putty를 통해) 연결합니다. 기본 사용자는 pi 이고 기본 암호는 raspberry 입니다. 예를 들어 IP 주소가 192.168.1.16인 경우 ssh [email protected] 을 실행하고 메시지가 표시되면 비밀번호를 입력합니다.
    • 연결되면 sudo raspi-config 를 실행합니다.

raspi-config 가 최종 설정을 안내합니다. 모든 옵션을 구성할 수 있지만 가장 중요한 것은 처음 두 가지입니다. 파일 시스템을 확장하고 OS에서 모든 SD 카드 저장소를 사용할 수 있는지 확인하고 기본 Pi 사용자의 암호를 변경하여 서버가 침입자로부터 보호됩니다.

Raspi 구성

Raspberry Pi에 웹 서버(Nginx) 설치

다음으로 웹 서버를 설치합니다. 메모리 사용량이 적고 Node.js(나중에 설정할 예정)와 잘 작동하기 때문에 Nginx를 선호합니다. Apache 또는 lighttpd와 같은 다른 웹 서버도 작동하지만 이 데모에서는 Nginx를 사용합니다.

설치를 시작하기 전에 Pi에서 다음 명령을 실행하여 모든 것이 최신 상태인지 확인해야 합니다.

 sudo apt-get update sudo apt-get upgrade

그런 다음 apt-get 을 사용하여 Nginx를 설치할 수 있습니다.

 sudo apt-get install nginx

설치가 완료되면 다음을 실행하여 서버를 시작합니다.

 sudo service nginx start

이전 단계에서 라즈베리 파이의 로컬 IP를 알아낼 필요가 없었다면 이제 ifconfig 를 실행하여 알아낼 차례입니다. 이더넷 어댑터의 출력은 eth0 아래에 있고 로컬 IP 주소는 inet addr 로 표시됩니다.

IP 주소를 알면 컴퓨터의 브라우저가 해당 주소를 가리키도록 할 수 있습니다. 그러면 기본 "Nginx에 오신 것을 환영합니다" 메시지가 표시됩니다.

웹으로 열기: 포트 포워딩

로컬 네트워크 외부에서 Raspberry Pi에 액세스할 계획이 아니라면 이 단계를 건너뛸 수 있습니다. 그러나 다른 위치에서 서버에 액세스하려는 사용자를 위해 가능한지 확인하겠습니다.

일반적인 홈 네트워크에서 라우터에 연결된 장치는 외부 세계에 보이지 않습니다. 네트워크의 외부 IP 주소를 사용하여 외부에서 라우터에만 연결할 수 있습니다. 라우터는 어떤 수신 트래픽이 네트워크로 허용되는지, 어떤 장치로 보내야 하는지를 결정하는 역할을 합니다.

로컬 네트워크의 장치가 연결을 시작하면(예: 브라우저에서 웹사이트를 열 때) 라우터는 들어오는 응답 트래픽을 이 연결의 일부로 인식하고 통과하도록 허용합니다. 그러나 라우터가 열린 연결의 일부가 아닌 들어오는 트래픽을 수신하는 경우(예: 외부 장치가 내부 장치와 연결을 시작하려고 시도하는 경우) 들어오는 트래픽이 네트워크를 통과하는 것을 차단합니다. 이것은 네트워크를 보호하기 위한 중요한 보안 기능입니다!

그렇다면 외부에서 어떻게 Pi에 연결할 수 있습니까? 정답은 포트포워딩입니다. 라우터는 특정 포트에서 들어오는 연결이 통과하고 올바른 장치로 전송되도록 구성해야 합니다. 기본적으로 HTTP 프로토콜은 포트 80을 사용하고 SSH는 포트 22를 사용하므로 웹 애플리케이션에 액세스하고 서버 관리를 위한 보안 연결을 허용하기 위해 라우터에서 열어야 하는 두 개의 포트입니다.

포트 포워딩.

포트를 열고 전달하도록 라우터를 구성하는 단계는 인터넷 공급자와 라우터 브랜드에 따라 다를 수 있지만 어떤 경우에도 라우터 관리 페이지의 고급 구성 옵션을 통해 이를 수행할 수 있어야 합니다. "Forwarding", "Port Forwarding" 또는 "Network Address Translation"과 같은 이름을 가진 옵션을 찾으십시오.

HTTP 연결용 포트와 SSH용 포트를 하나 더 열어야 합니다. 기본 아이디어는 Nginx가 수신하는 포트 80으로 가는 웹 트래픽과 SSH 서버가 외부 컴퓨터로부터의 연결을 수락하는 포트 22로 가는 SSH 트래픽을 사용하여 이 두 외부 포트로 주소가 지정된 데이터를 Raspberry Pi로 전달하는 것으로 구성됩니다. 다음은 라우터의 구성 페이지에서 볼 수 있는 방법의 예입니다.

포트 포워딩 구성 테이블.

Raspberry Pi의 내부 IP 주소가 192.168.1.16 인 경우 포트 전달 구성. 포트 80 또는 22로 향하는 모든 수신 트래픽은 이 내부 주소로 전달됩니다.

Google에 "내 IP 주소는 무엇인가요?"라고 입력하기만 하면 라우터의 외부 IP 주소를 확인할 수 있습니다. 그런 다음 라우터 네트워크 외부로 이동하는 경우 ssh pi@{external IP address} 로 SSH 연결을 열어 포트 전달이 작동하는지 테스트할 수 있습니다. 마찬가지로 브라우저의 주소 표시줄에 외부 IP 주소를 입력하여 HTTP 포트 포워딩을 테스트할 수 있습니다. 포트 포워딩을 사용하면 라우터의 외부 IP를 알고 있는 외부 사람이 이 포트의 장치에 액세스할 수 있습니다.

고정 IP가 없으면 동적 DNS를 설정할 수 있습니다. 매우 간단하고 쉬운 단계입니다. 라우터에서 동적 DNS를 설정하거나 이를 위해 Raspberry Pi를 구성할 수 있습니다. 여기서는 DDNS를 구성하는 방법을 다루지 않겠지만 필요한 경우 BitPi.co에 이 주제에 대한 좋은 자습서가 있습니다.

프레임워크 설치: 전체 스택 JavaScript

Nginx 위에서 대부분의 웹 프레임워크를 실행할 수 있지만 JavaScript로 전체 스택을 실행하는 방법을 살펴보겠습니다. 이를 위해서는 Node.js와 MongoDB를 설치해야 합니다.

요즘 Node.js는 다음을 사용하여 Raspberry Pi에 쉽게 설치됩니다.

 sudo apt-get install nodejs

설치가 완료되면 node -v 를 실행하여 작동하는지 확인할 수 있습니다.

이제 다음을 입력하여 MongoDB를 설치할 수 있습니다.

 sudo apt-get install mongodb

Raspberry Pi를 꺼야 하는 경우 데이터베이스 손상을 방지하기 위해 먼저 서비스를 종료해야 합니다.

 sudo service mongodb stop

앱 배포

로컬 시스템에서 개발한 다음 BitBucket의 Git 리포지토리에 변경 사항을 푸시할 수 있습니다. Raspbian은 Git이 사전 설치된 상태로 제공되므로 최신 애플리케이션 코드를 장치로 가져와 실행할 수 있습니다.

프로젝트 비계

먼저 일부 애플리케이션 코드를 설정하고 Git 리포지토리에 푸시해 보겠습니다. 응용 프로그램을 시작하는 방법에는 여러 가지가 있지만 제가 가장 좋아하는 방법 중 하나는 서버와 클라이언트 코드를 모두 스캐폴딩하는 Generator-Angular-fullstack입니다.

컴퓨터에 generator-angular-fullstack 설치:

 npm install -g generator-angular-fullstack

응용 프로그램에 대한 새 디렉터리를 만듭니다.

 mkdir my-app cd my-app

그리고 애플리케이션을 스캐폴드:

 yo angular-fullstack my-app

리포지토리 생성 및 코드 푸시

이제 여기에 설명된 대로 BitBucket에 리포지토리를 만듭니다. 그런 다음 로컬 디렉터리를 설정합니다.

 git init git remote add origin [email protected]:USER/REPO.git

따라서 코드를 커밋하고 푸시할 수 있습니다.

 git add . git commit -m 'Initial commit' git push -u origin master

생성기는 grunt-build-control 플러그인과 함께 제공되며, 이를 통해 저장소의 특정 분기에 빌드 코드를 커밋할 수 있습니다. BitBucket에 대한 구성을 애플리케이션의 루트 디렉토리에 있는 Gruntfile.js 에 추가하기만 하면 됩니다.

 buildcontrol: { options: { dir: 'dist', commit: true, push: true, connectCommits: false, message: 'Built %sourceName% from commit %sourceCommit% on branch %sourceBranch%' }, bitbucket: { options: { remote: '[email protected]:USER/REPO.git', branch: 'build' } } }, // ...

이제 실행:

 grunt build

...배포 폴더를 만든 다음 다음을 수행합니다.

 grunt buildcontrol:bitbucket

... 저장소의 빌드 분기에 코드를 커밋하고 푸시합니다.

SSH 키 생성

이제 코드가 호스팅되었습니다. Raspberry Pi에 배포하려면 먼저 Raspberry Pi용 SSH 키를 생성하고 BitBucket 계정에 추가해야 합니다. 이 단계는 빠르게 진행되지만 문제가 있는 경우 BitBucket 가이드를 따르세요. 따라서 Raspberry Pi 터미널에 다시 로그인하고 공개/개인 키 쌍을 생성합니다.

 ssh-keygen

그런 다음 에이전트를 시작합니다.

 ssh-agent /bin/bash

그리고 에이전트에 키를 추가합니다.

 ssh-add /home/pi/.ssh/id_rsa

이제 공개 키의 내용을 출력하기만 하면 됩니다.

 cat /home/pi/.ssh/id_rsa.pub

… BitBucket에 복사하여 붙여넣을 수 있습니다.

BitBucket에서 프로필 사진을 클릭하고 계정 관리 로 이동합니다. 보안 에서 SSH 키 를 찾아 키 추가 버튼을 클릭합니다.

리포지토리 복제

앱 코드를 어디에 둘 것인지에 대한 규칙은 없지만 /var/www 디렉토리를 만들고 모든 프로젝트를 거기에 넣을 수 있습니다.

 cd /var sudo mkdir www

웹루트에 파일을 저장하고 싶을 때 sudo 를 사용하지 않으려면 소유자를 Pi 사용자로 변경하고 그룹을 Nginx에서 사용하는 www-data 로 변경할 수 있습니다.

 sudo chown -R pi:www-data www cd www

이제 저장소의 빌드 분기를 복제하고 종속성을 설치할 수 있습니다.

 git clone [email protected]:USER/REPO.git --branch build --single-branch cd REPO npm install --production

완료되면 환경을 프로덕션으로 설정하여 앱을 시작할 수 있습니다.

 export NODE_ENV=production; node server/app.js &

이제 컴퓨터 브라우저가 장치 IP 주소를 가리키도록 하여 작동하는지 확인합니다.

자신의 서버라고 부를 수 있는 개발 서버를 갖고 싶으십니까? #RaspberryPi 로 할 수 있습니다.
트위터

Nginx 리버스 프록시 구성

외부에서 애플리케이션에 액세스할 수 있도록 하려면 한 단계 더 남았습니다. Nginx는 Pi에 대한 HTTP 요청을 수신할 포트 80에서 수신 대기하지만 노드 애플리케이션 자체는 다른 포트(예: 포트 8080)에서 수신 대기합니다. 따라서 Nginx가 역 프록시 역할을 하도록 구성하여 애플리케이션을 위한 요청을 인식하고 이를 Node.js로 전달해야 합니다.

Nginx는 제공하는 각 애플리케이션의 구성 파일을 sites-available 폴더에 보관합니다.

 cd /etc/nginx/sites-available/

여기에서 default 구성 파일을 복사하고 편의에 따라 편집할 수 있습니다.

 sudo cp default my-app sudo nano my-app

최종 구성 파일은 Nginx가 Node.js 서버에 대한 프록시 역할을 하는 다음과 같아야 합니다.

 server { listen 80; root /var/www/my-app/; # identifies the location of the application you are configuring server_name my-app.dev; # identifies the hostname used by this application's traffic location / { proxy_pass http://localhost:8080/; # configures the back-end destination for this traffic } }

이 구성을 활성화하려면 Nginx가 런타임 중에 활성 구성을 찾는 sites-enabled 폴더에 심볼릭 링크를 생성해야 합니다.

 sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/my-app

그리고 이러한 변경 사항을 활성화하려면 서비스를 다시 로드하세요.

 sudo service nginx reload

이 시점에서 애플리케이션은 my-app.dev 도메인에 대한 HTTP 트래픽을 수신할 준비가 되었습니다(위에서 구성한 server_name my-app.dev 지시문 덕분에). 해결해야 할 마지막 문제는 외부에서 보내는 트래픽을 이 도메인 이름과 일치시키는 방법입니다. 도메인 이름을 구입하고 IP를 가리킬 수 있지만 hosts 파일이 구출되어 필요하지 않게 만듭니다.

사이트에 액세스할 워크스테이션에서 라우터의 외부 IP 주소를 추가하고 호스트 이름 my-app.dev 와 일치시키기만 하면 됩니다. 그러면 my-app.dev 에 대해 생성하는 모든 HTTP 트래픽이 Host HTTP 헤더에 올바른 호스트 이름과 함께 라우터로 직접 전송됩니다.

Windows에서 관리자 권한으로 메모장을 사용하여 c:\windows\system32\drivers\etc\hosts 에 있는 파일을 편집할 수 있습니다. Linux 및 Mac에서는 각각 sudo nano /etc/hostssudo nano /private/etc/hosts hosts와 함께 터미널을 사용할 수 있습니다.

 ## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost 212.124.126.242 my-app.dev # add your host name to the list

무엇 향후 계획?

이제 모든 것이 설정되었으므로 Raspberry Pi에 원하는 만큼 애플리케이션을 배포하고 Node.js 서버를 활성 상태로 유지하기 위해 영원히 또는 pm2를 설치할 수 있습니다.

그리고 문제가 발생하면 SD 카드를 지우고 처음부터 다시 시작할 수 있다는 것을 기억하십시오!

작동 중인 Raspberry Pi 개발 서버.

관련: 이 Raspberry Pi 온도 조절기 자습서로 기후 제어