Rails 앱을 배포하는 방법을 조사하면 Apache, Unicorn, Puma, Phusion Passenger, Nginx, Rainbows 등 많은 이름을 볼 수 있습니다. 모두 "Rails 배포" 소프트웨어 범주에 속하는 것처럼 보이지만, 둘 사이에는 중요한 차이점이 있습니다. 일부는 "웹 서버"이고 다른 일부는 "앱 서버"입니다.
어떤 카테고리가 시스템에서 어디에 해당하는지 이해하고 나면 배포가 훨씬 더 합리적입니다. 하지만 카테고리가 항상 명확한 것은 아닙니다.
웹 서버란 무엇이며 앱 서버와 어떻게 다릅니까? 하나 없이 다른 하나를 사용할 수 있습니까? 그리고 Rack은 어디에 적합합니까?
웹 서버란 무엇입니까?
웹 서버 사용자의 웹사이트 요청을 받아 처리하는 프로그램입니다. 그런 다음 Rails 앱에 요청을 보낼 수 있습니다. Nginx와 Apache는 마주하게 될 두 개의 큰 웹 서버입니다.
CSS, JavaScript 또는 이미지와 같이 자주 변경되지 않는 항목에 대한 요청인 경우 Rails 앱에서 이를 볼 필요가 없을 것입니다. 웹 서버는 앱과 통신하지 않고도 요청 자체를 처리할 수 있습니다. 일반적으로 그렇게 하면 더 빠릅니다.
웹 서버는 SSL 요청을 처리하고, 정적 파일 및 자산을 제공하고, 요청을 압축하고, 거의 모든 웹사이트에 필요한 기타 많은 작업을 수행할 수 있습니다. Rails 앱이 그렇다면 요청을 처리해야 하는 경우 웹 서버가 이를 앱 서버로 전달합니다.
앱 서버란 무엇입니까?
앱 서버 Rails 앱을 실제로 실행하는 것입니다. 앱 서버는 코드를 로드하고 앱을 메모리에 유지합니다. 앱 서버가 웹 서버로부터 요청을 받으면 이에 대해 Rails 앱에 알립니다. 앱이 요청 처리를 완료한 후 앱 서버는 응답을 웹 서버(결국 사용자에게)로 다시 보냅니다.
앞에 웹 서버 없이 대부분의 앱 서버를 단독으로 실행할 수 있습니다. 그것이 아마도 개발 모드에서 하는 일입니다! 하지만 프로덕션에서는 일반적으로 앞에 웹 서버가 있습니다. 한 번에 여러 앱을 처리하고 자산을 더 빠르게 렌더링하며 모든 요청에 대해 수행할 많은 처리를 처리합니다.
톤이 있습니다. Mongrel(더 이상 많이 사용되지 않음), Unicorn, Thin, Rainbows 및 Puma를 포함한 Rails 앱용 앱 서버. 각각의 장점과 철학이 다릅니다. 그러나 결국에는 Rails 앱을 계속 실행하고 요청을 처리하는 동일한 작업을 수행합니다.
여객은 어떻습니까?
Phusion Passenger는 조금 독특합니다. "독립형 모드"에서는 앱 서버처럼 작동할 수 있습니다. 하지만 웹 서버에 바로 구축할 수도 있으므로 필요 Rails 앱을 실행하기 위한 별도의 앱 서버
이것은 정말 편리할 수 있습니다. 특히 여러 앱을 실행할 계획이고 각각에 대해 앱 서버를 설정하는 데 시간을 소비하고 싶지 않은 경우. Passenger를 설치한 후 웹 서버가 (앱 서버 대신) Rails 앱을 직접 가리키도록 하면 Rails 앱이 요청 처리를 시작합니다!
승객도 좋은 옵션이지만 별도의 앱 서버가 있는 것도 좋습니다. 앱 서버를 별도로 유지하면 요구 사항에 가장 적합한 앱 서버를 유연하게 선택할 수 있으며 자체적으로 실행하고 확장할 수 있습니다. 그래도 다음에 새로운 작은 앱을 배포할 때 다시 시도할 것입니다. 향후 앱을 동일한 서버에 더 쉽게 배포할 수 있기를 바랍니다.
랙은 어떻습니까?
Rack은 이러한 앱 서버에서 Rails 앱을 실행할 수 있게 해주는 마법입니다. (또는 Sinatra 앱, Padrino 앱, 또는...)
Rack은 Ruby 웹 프레임워크(예:Rails)와 앱 서버가 모두 사용하는 공통 언어로 생각할 수 있습니다. 양쪽이 같은 언어를 알고 있기 때문에 Rails나 Unicorn이 상대방에 대해 전혀 알지 않고도 Rails가 Unicorn 및 Unicorn to Rails와 대화할 수 있음을 의미합니다.
그들은 어떻게 관련되어 있습니까?
그렇다면 이 모든 것이 어떻게 조화를 이룰까요?
이 중 웹 요청이 먼저 웹 서버에 도달합니다. 요청이 Rails가 처리할 수 있는 것이라면 웹 서버는 요청에 대해 일부 처리를 수행하고 앱 서버에 전달합니다. 앱 서버는 Rack을 사용하여 Rails 앱과 통신합니다. 앱에서 요청이 완료되면 Rails 앱은 앱 서버와 웹 서버를 통해 앱을 사용하는 사람에게 응답을 다시 보냅니다.
보다 구체적으로 Nginx는 요청을 Unicorn에 전달할 수 있습니다. Unicorn은 요청을 Rack에 제공하고 Rails 라우터는 이를 올바른 컨트롤러에 제공합니다. 그러면 응답이 다른 방향으로 되돌아갑니다.
이 개요는 단순화될 수 있습니다. 그러나 이러한 범주를 아는 것만으로도 실행하는 소프트웨어를 올바른 정신적 버킷에 넣는 데 도움이 됩니다.
앱 서버와 웹 서버가 어떻게 조화를 이루는지 이해하고 나면 서버 문제가 있을 때 디버깅하기가 훨씬 쉬워집니다. 당신은 당신이 볼 수있는 모든 다른 장소와 그들이 상호 작용하는 방식을 알게 될 것입니다. 그리고 다음 흥미로운 앱 서버가 도착하면 교체하기가 훨씬 쉬워집니다!
Rails가 웹과 상호 작용하는 방식에 대해 자세히 알아보려면 Rails 세션 작동 방식 문서를 확인하세요.