Back

나만의 작은 서버

집에 Raspberry Pi 2가 하나 있다.

BCM2836 CPU, 1GB RAM, 16GB SD 카드 꼽혀있다.

귀엽다. 한번 괴롭혀보자.

갑자기 나만의 작은 서버를 만들어보고, 뭐라도 배포를 해보고 싶어졌다.

데비안 계열 rasbian이 올라가 있다.

뭔가 익숙한 단어 같았으나, 뇌 속 깊은 메모리 어딘가 lazbian과 착각을 했던 모양이다.

위 사진을 볼 수 있듯 마우스, 키보드, 이더넷, HDMI, 전원 등 많은 것들이 물려있다.

언제나 이렇게 사용할 수는 없는 법, SSH를 사용하여 원격 접속하도록 해본다.

기본 설정으로는 SSH가 활성화되어있지 않다.

그래서 다음과 같은 설정을 해줘야 한다.

sudo raspi-config

다음을 통해 Configuration Tool에 접근한다.

이후 SSH 설정을 Enable 처리해준다.

이후 ip 주소를 확인한다.

짜잔!

이젠 nginx를 설치하려고 하는데,

설치하기 전 필요한 Advance Packging Tools 업데이트가 되지 않는다..

알고 보니 패키지 리스트 Repository가 현재 사용할 수 없는 주소였다.

RaspbianMirrors - Raspbian

위의 사이트를 통해

다음과 같이 설정을 변경했다.

이것저것 시도하느라 계정도 root로 변경한 흔적도 보인다..

..😭

오만가지 잡다한 오류가 다 나오고 별짓을 다하다가 결국 펌웨어 업데이트까지 가게 되었다.

이후에 라즈비안 OS가 그냥 뻗어버렸다.

데스크톱 모드로 확인하니 무한 저전력 경고에 시작바가 열렸다 닫혔다 무한반복한다.

뭔가 화가 많이 난 것처럼 보였다.

그냥 다 밀어버리고 우분투로 다시 깔았다.

쉽게 ssh 통신이 이루어진다.

이후 nginx 설치 및 배포도 아무런 문제 없이 쉽게 되었다.

nginx 서버 켜는 법은 할 때마다 검색해서 찾아보는데 이번 기회에 정리를 해본다.

정리를 해보자면 다음과 같은 명령어를 통해 사용이 가능하다.

sudo service nginx restart

sudo service nginx start

sudo service nginx stop

또한 기본적인 배포 디렉토리 위치는 다음과 같다.

/var/www/html

웹서버를 통해서 올릴만한 뭔가가 없을까 생각을 해보게 되었다.

하지만 아무것도 없다! 오히려 정적 페이지는 netlify라던가 GitHub Pages와 같이 좋은 대안이 있다.

그래서 노드를 설치하고 express기반으로 만들어놓았던 원식과아이들을 배포해보기로 했다.

원래 이전에 heroku로 배포를 했으며, 아직까지 동작을 하지만, 굳이 여기서 배포해야할 당위성을 찾아보자면, heroku는 접속하는 사용자가 일정 시간동안 없으면 잠자기 모드로 들어가고, 다시 켜는데 오랜 시간이 걸리는 문제가 있다. 직접 배포하면 이런 문제가 없다.

sudo apt install nodejs
sudo apt install npm

노드 설치, 노드 패키지 매니저 설치

(원래 노드 설치하면 npm도 같이 설치가 되었던 것 같은데 이번에는 그렇지 않았다.)

프로젝트를 클론 떠오려고 깃을 깔아보려고 했는데.. 왜인지는 모르겠으나 우분투에 이미 깔려있다.

깃 클론 받고, 배포 포트 80으로 변경, DB 커넥션 PaaS 배포 시절 환경변수로 잡혀있던 것 하드코딩으로 넣었다.

배포에 신경을 써본적이 없어 사용을 해본적은 없으나, pm2라는 것을 사용하면 편하다고 한다. 모니터링, 프로세스관리, 클러스터모드 등 여러가지 기능들이 존재한다.

이번 기회에 사용해보도록 하자.

참고로 전역으로 설치해야 한다고 한다.

npm install pm2 -g

띠용? 전역으로 설치하느라 해당 경로에 권한이 없는 것 같다.

이렇게 해본 적은 없으나, super user do를 통해서 진행해본다.

sudo npm install pm2 -g

뭔가 잘 된 것 같다.

이후 사용법은 이렇다고 한다.

PM2 - Single Page Doc

짜잔~

캡쳐는 따로 하지 않았으나, pm2를 전역으로 설치할 때 슈퍼 유저 권한으로 설치하여 접근권한이 없는 곳에 실행 관련한 파일이 들어가게 된 것 같다. 그래서 서버를 여는 것 자체도 su 권한이 없으면 진행이 되지 않았다.

이 문제를 해결하기 위해서 node global install location 변경하는 과정을 진행하던가, 이미 전역 설치된 폴더의 권한 설정을 바꿔주는 것으로 해결이 가능할 것 같다.

또한 이런 권한과 관련한 문제인지 중간에 pm2 status로 확인하였을 때 배포 중인 것이 아무것도 없었음에도 배포가 되고 있었으며 (데몬으로 pm2가 별도로 사용되는 것으로 판단), 파일 내용을 수정하고 재배포해도 변경되지 않는 현상이 있어서 강제로 프로세스를 종료시켰다.

사용 중인 포트 번호 확인과 그 프로세스를 kill하는 과정은 매번 인터넷으로 검색을 하는데, 이번에 정리를 해보겠다.

netstat -tnlp

(이 상황에서 PID가 보이지 않아 root 계정으로 확인하니 보였었다.)

이후

kill PROCESS_ID

하면 깔끔하게 정리된다.

그리고 라즈베리파이를 매번 껏다킬 때 아까 깔았던 nginx가 자동으로 실행되어 80포트를 점유해버린다. 이 문제는 다음과 같은 명령어로 해결 했다.

sudo update-rc.d -f nginx disable

이후로는 클러스터 모드로 배포하는 과정도 진행했다.

pm2 기존 시작 명령어 뒤에 -i 실행시킬 프로세스 갯수를 지정하면 클러스터 모드로 사용이 가능하다. 0을 적게되면 cpu 최대갯수로 지정이 된다고 한다.

pm2 start index.js -i 0

BCM2836 CPU가 쿼드코어인데, 이에 맞게 4개의 프로세스가 사용된다.

트래픽이 없어서 분산 처리의 관점에서 볼 때는 의미가 없지만, 덕분에 무중단 배포를 할 수 있게 해준다.
pm2의 reload 기능을 사용하면 모든 프로세스를 kill하고 다시 배포하는 것이 아니라, 순차적으로 프로세스를 다시 실행하며, 결과적으로 항상 하나 이상의 프로세스를 계속 실행될 수 있도록 도와준다.
실제로 이 상태로 파일 수정 후 reload를 해놓고 브라우저 새로고침 광클을 하였으나, 깔끔하게 재배포되는 것을 확인했다.


이제는 방구석 어두운 책상 밑에 놓고 방치하면 된다.

다음에 기회가 된다면, 추가 기능 구현, 배포 자동화, 도메인 등록 등 여러 가지로 개선하고 싶다.