디스크리스 웹 서버 구축하기: Raspberry Pi Zero에서 전체 웹사이트를 RAM에 호스팅하기

현대적인 웹 호스팅의 세계에서 우리는 기가바이트 단위의 RAM을 가진 거대한 클라우드 인스턴스와 컨테이너에 익숙해져 있습니다. 하지만 미니멀리즘에는 독특한 우아함이 있습니다. 시스템을 절대적인 필수 요소로만 축소하여 최대의 신뢰성과 효율성을 달성하는 것입니다.

그러한 실험 중 하나는 Alpine Linux를 실행하는 Raspberry Pi Zero v1.3에서 전체를 메모리에서 서비스하는 공공 웹사이트를 운영하는 것입니다. "디스크리스" 구성을 활용함으로써, 시스템은 싱글 보드 컴퓨터에서 가장 흔한 발생 지점인 microSD 카드를 제거합니다. 이 접근 방식은 전원 차단에 탄력적인 읽기 전용 환경을 생성하며 하드웨어의 수명을 크게 연장합니다.

아키텍처: 로컬 Pi와 외부 VPS

Raspberry Pi Zero를 가볍게 유지하기 위해, 아키텍처는 작업 부하를 로컬 하드웨어와 경량 Virtual Private Server (VPS) 사이로 분산합니다.

로컬 하드웨어

  • Raspberry Pi Zero v1.3: 핵심 컴퓨팅 노드.
  • 512MB microSD Card: 초기 부팅 및 지속적인 설정 파일 저장용으로만 사용됨.
  • Waveshare Ethernet HAT: 안정적인 네트워크 연결용 (OTG 어댑터도 작동함).

외부 하드웨어 (The VPS)

TLS 종료(HTTPS 암호화를 처리하는 프로세스)는 Pi Zero에게 CPU 집약적일 수 있기 때문에, 아주 작은 VPS (예: 128MB RAM을 가진 Alpine Linux)가 게이트웨이 역할을 합니다. 이 VPS는 보안 핸드셰이크를 처리한 다음 트래픽을 로컬 Pi로 전달합니다. 이 설정을 통해 Pi는 HTTP를 통해 정적 콘텐츠를 서비스하는 데에만 전적으로 집중할 수 있습니다.

단계별 구현

1. 부팅 미디어 준비

macOS 환경을 사용하여 microSD card를 FAT32로 포맷합니다. Alpine Linux tar.gz 이미지를 카드에 직접 추출합니다. 이를 통해 시스템이 Alpine Live 환경으로 부팅될 수 있도록 합니다.

2. Alpine을 디스크리스 모드로 구성하기

부팅되면, 목표는 루트 파일시스템을 RAM (tmpfs 또는 ramfs)으로 이동하는 것입니다. 재부팅 시 변경 사항이 손실되지 않도록 하기 위해 Local Backup (lbu) 유틸리티를 사용합니다.

프로세스는 다음과 같습니다:

  1. lbu를 microSD card (mmcblk0p1)를 가리키도록 설정합니다.
  2. 매 부팅마다 패키지를 다시 다운로드하지 않도록 카드에 APK cache를 생성합니다.
  3. setup-alpine을 실행하고 디스크 옵션으로 none을 선택합니다. 이것이 시스템을 디스크리스로 유지하는 핵심 단계입니다.

3. 소프트웨어 스택

메모리 사용량을 최소화하기 위해, 저자는 고도로 최적화된 도구 세트를 선택했습니다:

  • darkhttpd: 작고 빠른 정적 웹 서버. 부팅 시 시작되도록 OpenRC 서비스로 구성됩니다.
  • dropbear: OpenSSH보다 훨씬 더 자원 효율적인 경량 SSH 서버.
  • rsync: 로컬 개발 머신에서 Pi로 웹사이트 파일을 동기화하는 데 사용됨.
  • lbu: 설정 변경 사항을 SD 카드에 다시 커밋하는 지속성 계층.

더 많은 유연성이 필요한 경우, nginx가 실행 가능한 대안이 될 수 있지만, darkhttpd보다 더 많은 자원을 소비합니다.

네트워킹 및 TLS 종료

Pi의 성능을 저해하지 않으면서 인터넷에 사이트를 노출하기 위해, 다음과 같은 흐름이 구현됩니다:

Internet $\rightarrow$ VPS (HAProxy/TLS Termination) $\rightarrow$ Local Router $\rightarrow$ Raspberry Pi Zero

  1. 포트 포워딩: 로컬 라우터에서 포트 80 (또는 사용자 정의 포트)을 열고 Pi의 정적 IP를 가리키도록 합니다.
  2. 트래픽 전달: VPS에서 socat을 사용하여 VPS의 공용 IP로부터 홈 IP/DDNS 호스트네임으로 들어오는 TCP 트래픽을 전달합니다.
  3. SSL 관리: TierHive의 HAProxy Edge와 같은 서비스를 사용하여 SSL 인증서를 자동으로 관리하고 갱신하여, Pi가 단 한 번의 RSA 또는 ECC 계산을 수행할 필요 없이 사이트가 HTTPS를 over HTTPS로 서비스되도록 합니다.

신뢰성 및 백업

이 설정의 주요 장점 중 하나는 견고함입니다. OS가 RAM에 실행되므로, microSD card는 거의 쓰기 작업이 수행되지 않아 Pi 프로젝트에서 흔히 발생하는 "SD card corruption" 문제를 방드할 수 있습니다.

백업은 단일 명령어로 단순화됩니다: ssh root@YOUR-PI-ZERO-IP "dd if=/dev/mmcblk0 bs=4M" > zero-backup.img

이것은 부팅 미디어의 바이트 단위 클론을 생성하여, 새 카드로 즉시 복구할 수 있게 합니다.

기술적 관점 및 반론

이 프로젝트는 미니멀리즘에 대한 성공적인 연습이지만, 기술 커뮤니티 내에서 빌드의 필요성과 "인상적임"에 대한 활발한 토열을 불러일으켰습니다.

성능 및 역량에 대하여

일부 비판론자들은 Pi Zero가 1990년대의 많은 서버보다 강력하며 TLS 종료를 로컬에서 처리할 수 있어야 한다고 주장합니다. 한 댓글 작성자가 다음과 같이 언급했습니다:

"The Pi Zero has 512MB RAM and a one GIGA Hertz CPU... It should be perfectly capable of handling TLS... AES might be a bit heavy without hardware acceleration, but you can also do only ChaCha20."

"디스크리스"의 정의에 대하여

순수주의자들은 Pi가 여전히 SD 카드로 부팅팅된다는 점에서, 아키텍처적 의미에서 진정한 디스크리스는 아니라고 지적했습니다. 진정한 디스크리스 부팅은 TFTP (Trivial File Transfer Protocol) 또는 HTTP 부팅 (Pi 4 및 5에서 사용 가능)을 포함하며, 여기서 초기 부팅 이미지는 네트워크에서 가져옵니다.

실용성 측에 대하여

다른 이들은 사이트가 VPS 자체에서 호스팅될 수 있음에도 불구하고 트래픽을 매우 프록시하는 데 VPS를 사용하는 것이 유용할지 의문문을 던졌습니다. 하지만, 여기서의 가치는 self-hosting에 대한 교육적 탐구와 미니멀리스트 인프라의 개념 증명으로 기능하는 매우 탄력적이고 저전력인 어플라이언스를 만드는 데 있습니다.

Sources