15 min read

서버란 무엇인가, 셀프호스팅에 대하여

서버란 무엇인가, 셀프호스팅에 대하여
본 블로그 글은
GDSC Kookmin Organizer로서 2024.04.09에 발표한
"서버가 무엇인지 알아봅시다 - 셀프호스팅을 통한 빠른 배포" 자료를 재구성 및 정리한 글입니다.

서론

본 세션 발표 및 블로그 글에서 다루고자 하는 내용은 아래와 같습니다

  • 서버란 무엇인가? 에 대한 기초적 이해
  • 서버를 통해서 할 수 있는 것들
  • 서버를 보유하고 운영하는 다양한 방법
  • 추후 서버를 도입하고자 할때 고려해볼법한 "키워드" 의 제공.

키워드 위주로 최대한 간단하게 훑어보는 것을 목표로 하고 있기 때문에, 각각의 개념들을 도입하고 실제로 활용하는 방법들에 대해서는 다른 자료를 찾아보는것을 추천드립니다. 본 블로그 상에서도 이미 비슷한 주제들을 작성한 바 있습니다.

서버란 무엇인가

서버는 사실 24시간 돌아가는 컴퓨팅 파워를 가진 장비의 총칭으로, 굳이 컴퓨터여야 할 이유도 없을 뿐더러 사양이 높을 필요도 전혀 없습니다. 국내에서는 서버라는 명칭을 사용하지만 북한 쪽에서는 봉사기 라는 명칭을 사용하는데, 굳이 말하자면 봉사기 쪽이 조금 더 맥락을 쉽게 이해할 수 있는 명칭이 아닌가 싶기는 합니다.

서버에 대한 편견

서버는 일반적으로 서버실을 보유하고 수많은 전자기기들의 발열을 감당하기 위해 24시간 에어컨을 가동하고 있는 곳에서 주로 사용하지만, 일반적인 가정이나 개인이 사용하기에 그런 셋업은 너무나 과분하기도 하고,

국내의 누진세 제도로 인해 집에서 그 규모의 서버를 돌리는건 사실상 불가능합니다.

보통 개인이 굴리는 범주에서는 남는 컴퓨터, 구형 스마트폰, 저가 개발보드 등을 활용하고는 하며, 국민대학교 소프트웨어융합대학 학생들의 경우 배포받은 라즈베리파이 정도로도 훌륭한 서버의 역할을 대체할 수 있습니다.

실제로도 필자는 개인 서버를 최초로 제작하였던 것이

라즈베리파이 3b+ 모델 / 60gb ide 외장하드 / openmediavault 운영체제

조합이었습니다.

IP주소와 도메인 네임

서버뿐만 아니라 인터넷에 접속되어 사용하고 있는 모든 장비는 ip주소를 한개씩 부여받게 됩니다. 이 IP주소를 통해서 컴퓨터 한대를 특정하고 데이터를 주고받을 수 있으며, 국내의 경우 대부분 공유기가 실제로 인터넷과 통신하는 역할을 담당하기 때문에,

서버를 운영하기 위해서는 공유기의 관리자 페이지에서 포트 포워딩 을 진행해주어야 하는 등의 추가적인 절차가 있습니다.

본인의 서버가 벽에서 나오는 인터넷 포트에 직결로 연결되어 있다면 보통 이 부분은 고민을 안해도 됩니다.

IP주소는 보통 xxx.xxx.xxx.xxx 의 12자리 숫자의 형태를 띄고 있으며, ipv6 규격의 경우 16진수 문자 32개를 사용해 표기되어집니다.

이러한 형태의 IP주소로도 이론상 접속이 가능하나, 이걸 모두 외우는것이 비현실적인 관계로 도메인 주소를 구매해서 이름을 연결지어주는 방식으로 접속하게 됩니다.

필자는 본 블로그가 호스팅되고 있는 koder.page와 koderpark.dev를 소유하고 있으며, 보통 도메인 한개를 구독하는데 10달러/1년 정도의 금액이 필요합니다.

ppt상의 "도메인" 주도 개발은 그냥 유머입니다.
실제 도메인 주도 개발에는 다른 의미가 부여되어 있습니다...

서버를 통해 할 수 있는 것들

서버를 개인이 보유하는 주된 목적은 Selfhosting입니다.

국내에서는 svrforum 커뮤니티 쪽이 조금 활성화 된 것 같고, 해외에서는 레딧의 r/selfhosted 쪽이나 r/sysadmin 등지가 활성화 되어 있습니다.

셀프호스팅이란 본인이 직접 서비스를 구동하여 사용하는 것으로, 구독제로 사용되고 있는 대부분의 프로그램은 selfhosting을 통해 부분적으로 대체가 가능합니다.

넷플릭스 / 스포티파이 / 유튜브 뮤직 / 아이클라우드 / 구글드라이브

등의 수많은 컨텐츠 공급 플랫폼 들이 존재하지만, 해당 플랫폼들은 서비스를 종료하면 내가 애지중지하던 수많은 자료들이 모두 날아갈 위험을 가지고 있습니다.

그 점에서 셀프호스팅은 절대적으로 안전한것이, 본인이 저작권적으로 문제가 없는 파일을 소유하고 있다면 접근에 아무런 애로사항이 없습니다.

이러한 파일만을 저장하고 서빙하는 특수 목적의 서버를 NAS 라고 별도로 부릅니다.

개발과 별 연이 없는 분들이 서버를 도입하는 이유가 위의 NAS에 가까운 목적이었다면, 개발자는 보다 폭 넓게 서버를 활용할 수 있습니다.

본인이 개발한 프로그램을 본인의 서버 상에 직접 호스팅 및 운영할 수 있으며, 많은 사용자를 보유하고 있는 프로그램이 아닌 경우 대개 집에서 운영하셔도 큰 문제가 되지는 않습니다.

필자는 실제로 지금 보시고 계신 블로그를 직접 호스팅해서 운영하고 있으며, 본 블로그는 티스토리 등의 어떤 블로그 플랫폼에도 속하지 않기에 해당 회사들의 정책과 무관하게 자유롭게 테마를 변경하거나 기능을 추가할 수 있습니다.

테마도 직접 개발하여서 사용하고 있습니다.
현재 사용하고 있는 블로그 엔진은 GHOST입니다.

서버를 운용하기

이러한 서버를 운용하는 방법에는 크게 세가지 정도가 있습니다.

셀프호스팅

첫번째는 직접 집에 남는 전자기기 등을 이용해서 서버를 구축해 사용하는 것으로, 그 특성상 고사양 컴퓨터일 경우 오히려 애로사항이 꽃피기에

  • 가볍고
  • 조용하고
  • 전기를 적게 사용하는

컴퓨터를 주로 구매하거나 사용합니다.

개발자 분들 중 devops 직군에 관심이 있거나, 가상화 기술에 관심이 있는 분들은 기술의 실증 목적을 위해서 서버를 구매해보는것도 좋습니다.

보안 관련 직군에 재직하시는 분들 역시 모의해킹을 시도하기 위해서 개인 서버를 보유하는 경우가 있다고 알고 있습니다.

IDC에 입주하기

서버는 구매하고 난 뒤에도 지속적인 유지보수를 필요로 하기 때문에, 해당 유지보수를 어느정도 대행해주는 곳들이 있습니다.

이러한 장소를 IDC, Internet Data Center라고 부르며, 주로

  • 정전되지 않는 안정적인 전력 공급
  • 고속의 인터넷을 제공

등의 업무를 대행합니다. 둘 모두 개인의 집에서 처리할 수 있으나, 서버를 취미로 하시는 일부 분들을 제외하고는 현실적으로 쉽지 않고 금전적 비용이 과하게 많이 들어 어느정도 규모가 있는 서버를 운영하시는 분들은 고려해볼법한 대안입니다.

전쟁 / 지진 / 해일 등의 재난에 대비하여 어느정도 거리가 먼 곳에 백업 서버를 구축하는 "코로케이션" 시에도 주로 고려되는 솔루션이기도 합니다.

IDC에 입주한다는것은 보통 서버컴퓨터를 본인이 보유하고 있다는 전제 하의 이야기고, 운영의 편의상 rack 형태로 서버를 구성해야 한다는 단점이 있습니다.

클라우드 기업

한편 이 모든것을 대행해주고, 컴퓨터에는 원격 접속만을 할 수 있거나 아예 내가 호스팅할 프로그램만 들고가면 알아서 실행시켜주는 회사들이 존재합니다.

이러한 분야를 클라우드 컴퓨팅이라고 부르며, 주된 기업에는

  • 아마존 AWS
  • 구글 GCP
  • 마이크로소프트 AZURE

등이 존재합니다.

얼마나 사용했는지를 기준으로 가격 정책이 책정되기 때문에, 개발 서버 등을 목적으로 과도한 트래픽이 발생할 수 있는 경우에 별로 적합하지 않다는 단점이 있으나,

그 특유의 엄청난 안정성과 강력한 컴퓨팅 능력 제공 덕분에 대부분의 회사에서 실제로 프로그램을 가동시킬때에는 곧잘 선택되고는 합니다.

셀프호스팅을 하는 법

저희는 개발 서버의 구축이 주된 목적이기 때문에, 셀프호스팅 솔루션에 대하여 보도록 하겠습니다.

도커 라는 가상화 기술을 통해, 전 세계의 프로그램들은 하나의 통일된 형태로 규격화되어지는데 성공했습니다.

이를 통해 전 세계 모든 컴퓨터에서 도커만 준비되어 있다면 내가 작성한 서버 프로그램을 실행할 수 있게 되었으며, 우리는 docker 상에 작성한 프로그램을 올리는 환경을 구축해볼 것입니다.

도커는 리눅스 컨테이너(LXC) 기술을 사용해 만들어진 서비스 중의 하나로, 가상머신(VM) 기술에 비해 가상화하는데에 드는 추가적인 리소스 사용이 적어 보다 경제적이라는 장점이 있습니다.

도커의 설치나 환경 구축 등은 본 글에서 설명하지 않습니다.

도커를 통해 우리가 작성한 프로그램을 실제로 서빙하기 위해서는 위와같은 매우 복잡한 절차가 필요합니다.

  1. dockerfile가 있는 디렉토리에 접근하고,
  2. dockerfile을 읽어 이미지 형태로 프로그램을 정리합니다.
  3. 해당 이미지를 원격지 서버나 로컬 서버에서 실행해, 컨테이너를 띄우고
  4. 컨테이너를 실행합니다. 이 시점에서 프로그램이 동작합니다.
  5. 실행된 컨테이너를 도메인과 연결지어 접속할 수 있게 합니다.

크게 다섯 단계로 쪼개서 설명할 수 있습니다.

dockerfile은 이미지를 어떻게 만들면 좋을지, 내 프로그램을 컨테이너 규격에 맞출 수 있도록 명시해주는 설명서와도 같은 파일입니다.

컨테이너를 실행시킨 시점에서 프로그램은 실행되어지고 있으나, ip주소와 포트번호를 사용한 접속은 너무나도 어렵고, 이를 해결하기 위해 우리는 도메인을 연결하는

리버스 프록시 등의 솔루션을 도입합니다.

  • nginx
  • nginx proxy manager
  • traefik

등의 다양한 프로그램들이 리버스 프록시를 구성하는데에 사용되어질 수 있습니다. 비교해보시고 취향에 맞게 사용하시면 됩니다.

노가다를 줄이기, CI/CD

과정이 굉장히 복잡하여서, 우리가 생각하는 빠른 배포와는 매우 거리가 먼 것만 같습니다. 이제 이 일련의 과정들을 자동화해서 최대한 손쓸일이 없도록 해보겠습니다.

Continuous Integration, Continuous Deployment 도구를 사용하면 이 과정을 자동화 해서 대폭 절감할 수 있습니다.

보통은 github와 결합해 특정 브랜치(보통 main)에 변경상황이 있을 경우 자동으로 위에 상기하였던 다섯 단계를 진행시키며,

pipeline script를 작성해 해당 과정을 직접 설계해 줍니다.

파이프라인 스크립트의 작성은 각 프로그램별로 다르고, 복잡한 과정이기에 굳이 설명하지는 않겠습니다.

대표적인 ci/cd 도구로는

  • jenkins
  • github actions

이 있는데, 실제 기업에서는 github actions를 많이 검토하는 것 같고, 개인 서버에서 배포할 때는 jenkins가 조금 더 다양한 작업이 가능해 많이들 선호되는 것 같습니다.

수많은 키워드들을 돌아보면서 왔는데, 각 개념에 대한 주도면밀한 이해 끝에 환경을 구축하시면 위와 같은 흐름을 만들어 낼 수 있습니다.

이 모든 과정이 복잡해 보일 수 있으나, 한번만 구축해 두면 여러번의 배포에 적용할 수 있기 때문에, 장기적으로 봤을 때에는 이득이 되는 과정이기도 합니다.

결론

  • 서버란 무엇인가
  • IP주소
  • 도메인 주소
  • 셀프호스팅이란 무엇인가
  • 서버를 구축할 수 있는 방법들
  • docker
  • docker를 통한 배포 흐름
  • ci/cd 도구를 통한 흐름의 자동화
  • reverse proxy를 통한 외부 공개

등의 개념들을 가볍게 훑어보았습니다.

본 발표만 보시고 모든것을 이해하실 필요는 없습니다. 내가 알고있는 부분이 있다면 과감하게 스킵해도 좋고, 내가 모르는 부분이 있다면

이런 키워드를 위주로 공부해보면 되겠구나!

라는 가이드라인을 가져가시면 좋을것 같아 본 발표를 구상 및 기록으로 남겨봅니다.

추가적인 도움이 필요하신 부분이 있다면 위의 연락처를 통해 DM을 주셔도 좋고, 지금 이 블로그 글에 댓글을 통해서 질문을 주셔도 좋습니다. 가능한 선에서 최대한 도와드려보도록 하겠습니다.

감사합니다.