From FTP to Kamal: Rails 애플리케이션 배포의 역사

RailsConf 2025 From FTP to Kamal: 20 Years of Deploying Rails by Ben Curtis

작성자
Ruby Central
발행일
2025년 07월 24일

핵심 요약

  • 1 본 발표는 1991년 웹의 등장부터 현재에 이르기까지 Ruby on Rails 애플리케이션 배포 방식의 역사적 진화를 상세히 설명합니다.
  • 2 FTP 및 CGI와 같은 초기 방식부터 FastCGI, Mongrel, Passenger, Unicorn, Puma 등 다양한 웹 서버 및 배포 도구의 발전 과정을 다룹니다.
  • 3 Heroku, Docker, Kamal, CI/CD와 같은 최신 기술이 개발자에게 배포를 얼마나 단순화하고 효율적으로 만들었는지 조명합니다.

도입

본 발표는 웹의 초기 단계부터 현대에 이르기까지 Ruby on Rails 애플리케이션 배포 방식의 복잡하고도 흥미로운 진화 과정을 연대기적으로 탐구합니다. 웹의 태동기인 1991년부터 시작하여, 단순한 HTML 파일 전송에서부터 동적인 웹 애플리케이션의 등장, 그리고 오늘날의 컨테이너 기반 배포에 이르기까지, 개발자들이 직면했던 도전과 이를 극복하기 위해 개발된 다양한 기술적 해법들을 조명합니다. 특히 Ruby on Rails 프레임워크가 등장한 2004년을 기점으로, 배포 환경이 어떻게 변화하고 발전해왔는지 상세히 살펴봅니다. 이 역사는 단순한 기술적 발전사를 넘어, 개발자들이 시스템 관리의 복잡성에서 벗어나 핵심 개발에 집중할 수 있도록 돕는 방향으로 나아간 여정을 보여줍니다.

초기 웹 시대(1991년경)에는 주로 HTML 파일을 FTP나 VI 편집기를 통해 공유 호스팅 서버에 직접 업로드하는 방식이 사용되었습니다. 이후 대화형 웹 페이지의 필요성이 대두되면서 1993년에 CGI(Common Gateway Interface)가 등장했습니다. CGI는 웹 서버가 요청에 따라 별도의 프로세스를 생성하여 Perl 스크립트와 같은 동적 콘텐츠를 실행하고 결과를 반환하는 방식이었습니다. 이는 획기적이었지만, 요청마다 프로세스를 새로 시작해야 하는 성능 문제가 있었습니다. 1997년 PHP 3.0의 출현은 웹 서버 내부에 인터프리터를 내장하여 프로세스 생성 오버헤드를 줄이는 방식으로 CGI의 한계를 극복했습니다. Ruby 역시 ‘Mod Ruby’라는 형태로 Apache에 내장하려는 시도가 있었으나, 안정성과 격리 문제로 인해 널리 사용되지 못했습니다.

2004년 Ruby on Rails가 공개되면서 배포 방식은 또 다른 전환점을 맞이합니다. 초기 Rails 앱은 CGI 방식으로 배포되었으나, 프레임워크의 크기가 커지면서 성능 문제가 더욱 부각되었습니다. 이에 대한 해결책으로 Windows 환경에서 주로 사용되던 FastCGI(그리고 유사한 SCGI)가 도입되었습니다. FastCGI는 웹 서버와 별도의 데몬 프로세스를 통해 애플리케이션을 실행하여 성능을 개선했지만, 불안정하고 취약하다는 단점이 있었습니다. 이 시기에 Lighttpd와 같은 경량 웹 서버가 FastCGI와의 궁합으로 인기를 얻기도 했습니다.

FastCGI의 한계를 극복하기 위해 2007년경 Mongrel이 등장했습니다. Mongrel은 HTTP 파서를 내장한 Ruby 기반 웹 서버로, Apache나 Nginx가 트래픽을 Mongrel로 프록시하는 방식으로 작동했습니다. 이는 성능을 크게 향상시켰지만, 단일 프로세스 모델로 인해 동시 요청 처리에 한계가 있었고, 애플리케이션 충돌 시 수동 재시작이 필요했습니다. 이를 해결하기 위해 Mongrel Cluster와 같은 다중 프로세스 관리 방식이 도입되었고, Monit, God와 같은 프로세스 모니터링 도구가 등장하여 죽은 프로세스를 자동으로 재시작하는 역할을 수행했습니다.

배포 자동화의 필요성이 커지면서 2006년 Capistrano가 출시되었습니다. Capistrano는 SSH를 통해 원격 서버에 코드를 배포하고, 웹 서버를 재시작하는 등의 복잡한 과정을 자동화하여 개발자들의 수고를 덜어주었습니다. 이후 Passenger는 Ruby 애플리케이션을 Apache나 Nginx에 직접 통합하면서도 격리된 환경을 제공하여, 배포를 더욱 단순화하고 안정성을 높였습니다. Unicorn, Puma, Thin과 같은 웹 서버들은 각각 프로세스 포킹, 스레딩, 이벤트 기반 모델을 통해 Ruby 앱의 동시성 및 성능을 최적화했습니다.

2010년대에 들어서면서 클라우드 기반 플랫폼 서비스(PaaS)인 Heroku의 등장은 배포 패러다임을 혁신했습니다. 개발자는 단순히 Git 저장소에 코드를 푸시하는 것만으로도 애플리케이션을 배포할 수 있게 되어, 서버 관리의 부담을 완전히 덜었습니다. 2013년 Docker의 등장은 ‘내 컴퓨터에서는 되는데…’ 문제를 해결하며 배포의 표준으로 자리 잡았습니다. Docker는 애플리케이션과 그 종속성을 컨테이너라는 단일 패키지로 묶어, 어떤 환경에서든 일관되게 실행될 수 있도록 했습니다. 이는 Ruby 버전 충돌과 같은 문제를 근본적으로 해결했습니다.

Docker의 성공을 기반으로, 2021년에는 Capistrano의 정신적 후속작이라 할 수 있는 Kamal(구 MRSK)이 출시되었습니다. Kamal은 Docker 컨테이너를 사용하여 서버에 애플리케이션을 배포하고 관리하는 과정을 간소화합니다. 또한, GitHub Actions와 같은 CI/CD(지속적 통합/지속적 배포) 파이프라인은 코드가 변경될 때마다 자동으로 테스트, 이미지 빌드, 배포를 수행하여 개발자의 개입 없이 프로덕션 환경에 반영될 수 있도록 합니다. 오늘날 개발자들은 Heroku, Fly, Render와 같은 PaaS, 또는 Docku, Koolifi와 같은 자체 호스팅 가능한 Heroku 유사 환경, 혹은 Docker Swarm, Docker Compose, Kubernetes와 같은 컨테이너 오케스트레이션 도구에 이르기까지 다양한 배포 옵션을 선택할 수 있게 되었습니다.

결론

결론적으로, Ruby on Rails 애플리케이션 배포의 역사는 웹 기술의 발전과 궤를 같이하며, 개발자들의 생산성과 편의성을 극대화하는 방향으로 진화해왔습니다. 초기 수동적인 파일 전송 방식부터 시작하여, CGI, FastCGI, 다양한 웹 서버와 프로세스 관리 도구, 그리고 Capistrano와 같은 자동화 도구를 거쳐, Heroku와 Docker에 기반한 현대적인 컨테이너 및 CI/CD 파이프라인에 이르기까지, 배포는 점차 추상화되고 자동화되었습니다. 이러한 발전 덕분에 오늘날 개발자들은 인프라 관리에 대한 부담을 덜고, 애플리케이션의 핵심 기능 개발에 더욱 집중할 수 있게 되었습니다. 배포 옵션의 풍부함은 개발자들에게 더 큰 유연성을 제공하며, 이는 Ruby on Rails 생태계의 지속적인 활력과 성장을 가능하게 하는 원동력이 되고 있습니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!