자동화&툴 리뷰

10년 Ubuntu 서버를 FreeBSD로 마이그레이션한 이야기 — 비용 절반, 성능 11배 향상

노동1호 2026. 5. 25. 04:04

Ubuntu 16.04에서 10년 운영 후 FreeBSD로 마이그레이션한 서버 환경


블로그를 Ubuntu 16.04에서 10년 동안 운영하다가 FreeBSD로 마이그레이션한 이야기

10년 넘게 Ubuntu 16.04 LTS에서 블로그를 운영한 뒤, FreeBSD로 전환했다. 비용은 절반 이하로 줄고 성능은 최대 11배 높아졌다. 이 글에서는 왜 마이그레이션을 결정했는지, 어떤 구조로 구축했는지, 그리고 부하 테스트 결과를 정리한다.

왜 마이그레이션을 했는가

기존 블로그는약 데이터센터의 DigitalOcean VPS에서 10년 넘게 운영됐다. Ubuntu 16.04 LTS 기반이었지만, 이 배포판의 지원이 종료된 지 이미 5년 이상이 지났다. apt 패키지 저장소 업데이트가 중단됐고, 보안 패치를 받을 수 없는 상태가 이어졌다.

과거에 별도 WordPress 블로그가 오래된 VPS에서 카지노·도박 링크 삽입 공격을당한 적이 있다. 보안상 불안정한 요소가 커졌다.

업타임은 1491일(약 4년)으로, 재부팅 없이 길게 운영할 수는 있었다. 다만 더 이상 보안 업데이트가 없는 상태에서 서버를 유지하는 것은Risk였다.

새 서버는 독일 Hetzner VPS로 이전했다. 기존 DigitalOcean 서버가 월 13달러에 RAM 2GB, vCPU 1개였는데, Hetzner의 가장 저렴한 서버는 기존보다 메모리와 CPU가 두 배면서 월 6유로 미만이다. 비용은 절반 이하로 줄었고 사양은 올라갔다.

FreeBSD를 선택한 이유

FreeBSD는 새로운 시스템을 실제 환경에서 시험해보고 싶었고, 통합 설계와 안정성, Jails 기능이 매력적이었다.

Jails는 FreeBSD에 25년 넘게 포함된 가상화 기능이다. 호스트 시스템에 접근하지 못하는 샌드박스 환경을 만들 수 있어서, 특정 Jail이 침해돼도 해당 Jail만 삭제하고 새로 만들면 된다.

Docker 같은 컨테이너 솔루션은 프로그램 패키징에 적합하고 일시적·불변적인 성격을 갖는다. 반면 Jails는 같은 커널을 공유하는 서브시스템이나 미니 VM에 가깝다. 영구적인 사이트 호스팅에는 Jails가 더 적합하다고 판단했다.

ZFS도 선택 이유였다. 데이터 무결성과 스냅샷 기능이 있고, Linux의 Btrfs와 유사하지만 훨씬 성숙한 파일시스템으로 평가된다. 자주 스냅샷을 남기면 VPS 제공자의 유료 백업 시스템에 덜 의존할 수 있다.

설계 목표와 구조

목표는 사이트마다 하나의 Jail을두고, 각 Jail 안에 필요한 빌드 도구와 nginx를 넣는 방식이었다. 메인 웹 서버용 Jail은 외부와 연결되는 리버스 프록시를 맡고, 특정 Jail이 침해되면 해당 Jail을토 삭제하고 새로 만드는 구조를 의도했다.

전체 스택은 Caddy Jail 하나가 모든 도메인과 SSL 인증서를 처리하고, 사이트별 Jail로 트래픽을 리버스 프록시하는 구조다. 내부 가상 네트워크 인터페이스는 bastille0로 만들어 10.0.0.1/24 네트워크를 할당했다.

외부 HTTP·HTTPS 요청은 PF(Packet Filter) 규칙으로 Caddy Jail에 전달된다.

ext_if = "vtnet0"int_if = "bastille0"vpn_if = "tailscale1"nat on $ext_if from 10.0.0.0/24 to any -> ($ext_if)rdr pass on $ext_if proto tcp from any to any port {80, 443} -> 10.0.0.5

Bastille로 Jail 관리하기

Bastille는 Jail 관리를 쉽게 하기 위한 도구다. 수동으로 여러 단계를 진행해야 하는 Jail 생성을 bastille 명령으로 처리할 수 있다.

FreeBSD 릴리스를 Bastille에 부트스트랩한 뒤 Jail을 만든다.

bastille bootstrap 14.3-RELEASEbastille create caddy 14.3-RELEASE 10.0.0.5 bastille0bastille start caddy

Caddy Jail 내부에서 SSL 인증서 관리를 자동화했다. 기존 nginx 환경에서는 certbot으로 인증서를 주기적으로 갱신해야 했는데, 갱신을 놓친 적이 여러 번 있었다. Caddy는 인증서를 자동으로 관리해주므로 이 문제를 해결했다.

사이트 Jail은 nginx Bastille 템플릿으로 만들었다.

bastille bootstrap https://github.com/bastillebsd/templatesbastille create escroto 14.3-RELEASE 10.0.0.11 bastille0bastille template escroto www/nginx

호스트의 사이트 디렉터리는 Jail에 읽기 전용으로 마운트한다.

bastille mount escroto /usr/local/www/escroto /usr/local/www/escroto nullfs ro 0 0

블로그는 Hugo로 생성되며 GitHub 저장소로 관리한다. 저장소는 호스트의 /usr/local/www/blog에 클론하고, blog Jail에 마운트한 뒤 Jail 안에서 Hugo를 실행해 nginx 웹 루트에 바로 출력한다.

부하 테스트 결과

DNS 레코드를 변경하기 전에 기존 서버(crocidb.com)와 새 서버(crocidb.cro.to)의 성능을 비교했다.

첫 번째 테스트는 같은 Hetzner의 다른 VPS에서 wrk를 실행했다.

wrk -t4 -c100 -d30s --latency https://crocidb.com/

기존 Ubuntu 서버는 평균 지연시간 89.63ms, 초당 요청 833.41개, 전송량 8.29MB/s였다. 새 FreeBSD 서버는 평균 지연시간 6.75ms, 초당 요청 12,260.10개, 전송량 130.80MB/s였다. 테스트 머신이 같은 데이터센터에 있어서 공정한 비교는 아니었지만 격차가 컸다.

요리 현실적인 비교를 위해 여러 지역의 실제 VPS에서 테스트했다. Vultr 기반으로 London, São Paulo, Silicon Valley, Tokyo에 가장 저렴한 Fedora VM을 만들고hey로 테스트했다.

./hey_linux_amd64 -n 1000000 -c 10000 -t 10 -z 5m -h2 https://crocidb.com/./hey_linux_amd64 -n 1000000 -c 10000 -t 10 -z 5m -h2 https://crocidb.cro.to/

설정은 총 100만 요청, 동시 요청 1만개, 타임아웃 10초, HTTP/2였다.

첫 실행에서 새 FreeBSD 서버가 10,000개 동시 연결을 감당하지 못하고 초반에 실패했다. netstat -Lan으로 소켓 큐 크기를 확인했더니 기본값 kern.ipc.somaxconn이 128이었다. 이렇게 늘렸다.

sysctl kern.ipc.somaxconn=16384

São Paulo 테스트에서 기존 Ubuntu 서버는 전체 요청의 약 7%만 완료했다. 새 FreeBSD 서버는 약 94%를 완료했다. 초당 요청 수 기준으로 새 서버가 기존 서버보다 최소 3배, 최대 11배 높았다.

Tokyo에서는 새 서버의 성공률이 약간 낮았지만 크게 우려할 수준은 아니었다. 지연시간 백분위에서는 새 서버가 약 90% 지점까지 더 선형적으로 증가해 예측 가능성이 더 높았다.

높은 부하에서도 전 세계 대부분 지역에서 블로그 메인 페이지 콘텐츠를 3.5초 미만에 받을 수 있었다.

전환 후 핵심 교훈

네트워킹과 FreeBSD 설정 학습이 필요했지만, 중앙화된 설정과 문서 품질 덕분에 예상보다 구성하기 쉬웠다. Jails와 Bastille 조합은_site isolation을 간단하게 구현할 수 있게 해준다.

Caddy는 SSL 인증서 자동화관리으로 certbot 갱신 문제에서 해방시켜줬다. Jails 구조 덕분에 특정 서비스 문제가 전체 시스템에 영향을 주지 않는다.

FreeBSD로 사이트 호스팅 머신을 운영한 지 벌써 몇 달이 지났다. 기존 Ubuntu 환경보다 안정적이고 성능도 크게 좋아졌다. 비용은 절반 이하로 줄었으니만의적이다.


📚 출처

https://news.hada.io/topic?id=29801