
개인 서버라고 지칭하기도 거창하지만, 컴퓨터를 끄지 않고 특정 목적을 위해 동작, 사용하기 때문에 큰 의미로 본다면 서버 컴퓨터가 맞다고 생각한다. 많은 기능을 처리하고 있지는 않지만 앞으로 이것저것 테스트 해 볼 것들도 많고, 운동 모임을 위한 간단한 웹/ 앱 배포도 할 수 있기 때문에, 좀 더 유리한 서버 구성을 위해 알아본 것들을 정리한다.
먼저 현재 이용하고 있는 서버 컴퓨터의 구조는 아래와 같다.
1. Proxmox 를 이용한 Vm Ubuntu Server
[ Internet ]
│ 80/443
[ Router / NAT ]
│ (포트포워딩: 80,443 → Reverse Proxy VM)
│
┌───────────────────────────────┐
│- Reverse Proxy VM (Nginx+TLS) │
│ - certbot/SSL │
│ - Host/SNI 라우팅. │
│- ChatGPT 용 API 서버 │
│- 기타 자동화 작업들. │
└───────────────────────────────┘
하나의 VM 을 생성하여 사용하고 있고, 이 VM OS 안에 모든(?) 기능들이 동작하고 있는 상태이다. 하지만 앞으로 해보고 싶은 기능들이 생길때마다 하나의 VM 에 계속해서 추가하는 것 보다는 기능별로 VM 을 생성한다던가, 아니면 하나의 VM 에 필요한 공통의 기능을 동작시키고 다른 특수 기능들을 컨테이너에 올리는 건 어떨까? 하는 생각이 들었다.
2. VM 분리형 구조
[ Internet ]
│ 80/443
[ Router / NAT ]
│ (포트포워딩: 80,443 → Reverse Proxy VM)
┌──────────────────────────────┐
│ Reverse Proxy VM (Nginx+TLS) │
│ - certbot/SSL │
│ - Host/SNI 라우팅. │
└─────┬──────────┬──────────┬──┘
│ │ │
│ │ └─────┐
│ │ │
┌─────▼─────┐ ┌──▼─────────┐ ┌────▼───────┐
│ GPT │ │ APP VM │ │ WEB-TEST VM│
│ server │ │ │ │ │
└───────────┘ └────────────┘ └────────────┘
서비스별로 개별 VM(Ubuntu 등)을 생성하고, 각 VM이 하나의 역할만 수행하도록 하는 방식이다.
예를 들어, Reverse Proxy 전용 VM, ChatGPT의 API 서버용 VM, 모임 앱 개발 서버 VM, 웹 테스트 서버 VM을 각각 분리하는 것이다.
장점
- 단일 책임 원칙 준수: VM 단위로 역할이 명확하게 구분되어 관리가 쉽다.
- 보안 격리 강화: 한 VM이 침해당해도 다른 VM으로의 영향이 최소화된다.
- 장애 영향 최소화: 특정 서비스 장애가 다른 서비스로 확산되지 않는다.
- 운영 체계 독립성: 각 VM이 다른 OS 버전이나 설정을 가질 수 있다.
단점
- 리소스 오버헤드: VM마다 OS가 따로 돌아가므로 메모리, 디스크 사용량이 증가한다.
- 확장 비용 증가: 서비스가 늘어날수록 VM 관리 부담이 커지고, 하드웨어 자원 요구량이 커진다.
- 배포 속도 느림: VM을 생성·설정하는 시간이 길고, 스냅샷·복원도 상대적으로 무겁다.
3. 컨테이너형
[ Internet ]
│ 80/443
[ Router / NAT ]
│ (80,443 → Reverse Proxy Node)
┌──────────────────────────────────────────────┐
│ Reverse Proxy Node (Nginx/Traefik + certbot) │
│ - Host/SNI 라우팅 │
│ - (옵션) Path 라우팅 │
└───────────────┬───────────────┬──────────────┘
│ │
api.example.com app.example.com web.example.com
│ │
┌───────▼───────────────────────────────┐
│ App Node (Docker or LXC on Ubuntu) │
│ ┌─────────────────────────────────┐ │
│ │ GPT-svc app-svc web-test │ │ ← 여러 컨테이너/LXC
│ │ :8000 :3000 :8080 │ │ (각 서비스 1개 이상)
│ └────────────┬─────────┬──────────┘ │
│ │ │ │
│ volumes/networks/env 관리(공유) │
└───────────────┴─────────┴─────────────┘
Reverse Proxy 서버를 두고, 그 뒤에서 Docker 또는 LXC로 서비스별 컨테이너를 실행하는 방식이다.
즉 하나의 VM OS 위에 여러 서비스 컨테이너를 띄워 운영한다. 지금 현재 방식과 비슷하지만, 서비스를 시스템에 계속 깔아대는(?) 게 아니라, 컨테이너를 생성하고, 그 위에 독립적으로 서비스를 운영한다.
장점
- 자원 효율성: VM보다 훨씬 가볍고, 동일 하드웨어에서 더 많은 서비스를 운영 가능하다.
- 배포·롤백 속도: 이미지 교체만으로 빠르게 배포 가능하며, 무중단 롤링 업데이트도 쉽다.
- 환경 일관성: 개발 환경과 운영 환경이 동일하게 유지된다.
- 운영 자동화 용이: Docker Compose, Portainer, Ansible 등으로 전체 서비스 배포를 자동화할 수 있다.
- 유연한 네트워킹: 컨테이너 네트워크로 직접 서비스명을 이용한 라우팅 가능.
단점
- 보안 격리 한계: VM처럼 완전한 커널/OS 격리를 제공하지 않아, 강력한 멀티테넌시에는 부적합하다.
- 운영 체계 통일 필요: 같은 호스트 OS 커널을 공유하므로, OS 버전을 달리하기 어렵다.
- 호스트 의존성: 호스트 장애 시 모든 컨테이너가 동시에 영향을 받는다.
4. 결론
만약 보안과 서비스 간 완전한 격리가 중요하고, 자원 사용량보다 안정성과 독립성이 우선이라면 VM 분리형이 적합하다. 반면, 개발·테스트 환경을 자주 바꾸고, 자원 효율과 빠른 배포가 중요한 상황이라면 Docker/LXC 컨테이너형이 유리하다. 나의 경우, 외부에 노출되는 HTTPS 트래픽을 한 곳에서 관리하고, 내부 서비스는 가볍게 운영하고 싶기 때문에 Reverse Proxy 전용 VM + 서비스별 Docker 컨테이너 조합을 우선적으로 고려하고 있다. 하나의 방식만 선택하는게 아니라, 내가 개인적으로 중요하게 사용할 GPT 서버에게 하나의 VM 을 할당하고, 또 모임 전용 웹/앱 페이지를 만든다고 하면, VM 을 하나 더 생성하되, 웹/앱에 필요한 다른 서버 기능들은 컨테이너로 구성 할 예정이다.
'CS 공부 > 기타' 카테고리의 다른 글
| [etc] NTP 란 무엇인가? (0) | 2025.08.21 |
|---|---|
| [기타] Mac OS 에서 가상 윈도우 PC 로 원격 접속하기 (1) | 2025.08.18 |
| [기타] 4월 21일 ~ 7월 2일 까지 작성된 블로그 포스팅의 항목별 정리 (3) | 2025.07.03 |
| [기타] PoE와 NVR 은 무엇인가? (1) | 2025.06.13 |
| [기타] Raspberry Pi Zero 2W 초기 설정하기 (Ubuntu 설치) (1) | 2025.05.23 |