미니PC 한 대로 웹 서비스 4개 운영하기
집에 있는 인텔 N100 미니PC 한 대가 제 서버 전부입니다. 여기에 지금 네 개의 웹 서비스가 돌아갑니다. 직장인 퇴사가이드, 웹 게임, 투병기 블로그, 그리고 일정 관리 서비스입니다. 클라우드를 쓰면 편하지만, 개인 프로젝트에 매달 고정비를 내는 건 부담이라 홈서버를 택했습니다.
서비스마다 도메인을 나눈 이유
처음에는 서비스마다 도메인을 따로 샀습니다. 그런데 서비스가 늘수록 관리가 번거로워졌습니다. 도메인 갱신일도 제각각이고, 인증서도 따로 발급해야 했습니다. 그래서 루트 도메인 하나를 두고 서브도메인으로 나누는 방식으로 정리했습니다. 지금은 서비스마다 (서비스명).hswork.win 형태를 씁니다. 새 서비스를 열 때 도메인을 새로 살 필요가 없고, 와일드카드 DNS 레코드를 걸어두면 서브도메인을 추가할 때 DNS를 건드리지 않아도 됩니다.
포트 하나를 여러 서비스가 나눠 쓰는 법
홈서버의 가장 큰 제약은 공인 IP가 하나뿐이고, 공유기에서 열어줄 수 있는 443 포트도 하나라는 점입니다. 서비스가 넷인데 입구는 하나입니다. 해법은 리버스 프록시입니다. 앞단에 nginx를 두고, 들어온 요청의 호스트명(server_name)을 보고 각 컨테이너로 넘겨줍니다. 브라우저가 어떤 주소로 들어왔는지에 따라 서로 다른 컨테이너가 응답하는 구조입니다.
이걸 모르고 처음 서브도메인을 붙였을 때, 엉뚱하게도 루트 도메인으로 접속해도 다른 서비스 화면이 떴습니다. 원인은 단순했습니다. nginx는 요청의 호스트명과 일치하는 설정이 하나도 없으면 맨 처음 정의된 설정을 기본값으로 사용합니다. 그래서 등록해두지 않은 주소가 전부 첫 번째 서비스로 흘러들어간 것이었습니다. 도메인마다 설정 블록을 명시해 주니 해결됐습니다.
컨테이너는 서비스별로 완전히 분리
네 서비스는 성격이 많이 다릅니다. 어떤 것은 검색 노출이 중요한 정적 사이트이고, 어떤 것은 실시간 통신이 계속 열려 있어야 하는 게임 서버입니다. 그래서 컨테이너·네트워크·배포 파이프라인을 서비스마다 완전히 분리했습니다. 한 서비스를 재배포해도 다른 서비스는 영향을 받지 않아야 하니까요. 데이터가 있는 서비스는 볼륨을 따로 두고, 컨테이너를 지웠다 다시 만들어도 데이터가 남도록 했습니다.
겪고 나서야 알게 된 것들
운영하면서 배운 건 대부분 사고를 통해서였습니다. 도커를 잘못 재설치했다가 컨테이너들이 참조하던 내부 네트워크가 통째로 사라져 전부 기동에 실패한 적이 있습니다. 죽은 컨테이너가 물고 있던 포트를 프록시 프로세스가 계속 점유해, 새 컨테이너가 "포트가 이미 사용 중"이라며 뜨지 않은 적도 있습니다. 둘 다 원인을 알고 나면 몇 줄로 해결되지만, 모르면 몇 시간을 헤맵니다.
그래서 지금은 모든 컨테이너에 자동 재시작 정책을 걸어두고, 장애가 났을 때 확인할 순서를 문서로 정리해 두었습니다. 재부팅 한 번에 서비스가 전부 내려가는 일은 그 뒤로 없었습니다. 홈서버 운영은 결국 화려한 기술보다, 무엇이 어디서 어떻게 도는지 스스로 설명할 수 있느냐의 문제인 것 같습니다.