CGI, Rack 등이 실제로 무엇에 관한 것인지 많은 혼란이 있습니다. here을 설명 할 때, Rack은 API이고 FastCGI는 프로토콜입니다. CGI는 프로토콜이기는하지만 좁은 의미로는 구현이며, 여러분이 말하는 것은 FastCGI와 똑같은 것이 아닙니다. 먼저 배경부터 시작하겠습니다.
웹 서버는 90 년대 초반에 디스크에서 파일 (HTML, 이미지 등)을 읽은 다음 클라이언트에게 보냈습니다. 사람들은 요청시에 약간의 처리를하기를 원했고, 나온 초기 해결책은 단지 파일을 읽는 것보다 결과를 클라이언트에게 되돌려 보내는 프로그램을 실행하는 것이 었습니다. 이것에 대한 "프로토콜"은 웹 서버가 프로그램 (예 : /cgi-bin/my-script
)으로 실행되도록 구성된 URL을 제공하는 것이며 웹 서버는 요청에 대한 다양한 정보가있는 환경 변수 세트를 설정합니다 표준 입력에 대한 요청 본문을 사용하여 프로그램을 실행하십시오. 이를 "Common Gateway Interface"이라고합니다.
모든 요청에 대해 새로운 프로세스를 포크하는 경우 분명히 비효율적이며 대용량 웹 사이트에서이 스타일의 동적 요청 처리를 사용하지 않으려 고합니다. (완전히 새로운 프로세스를 시작하는 것은 계산 리소스가 상대적으로 비쌉니다.)
새 프로세스를 시작하는 대신 이미 실행중인 기존 프로세스로 요청 정보를 보냅니다. 이것은 FastCGI의 모든 것입니다. CGI와 매우 유사한 인터페이스를 유지합니다 (대부분의 요청 정보가있는 변수 세트와 요청 본문에 대한 데이터 스트림이 있습니다). 그러나 실제 Unix 환경 변수를 설정하고 본문을 사용하여 새로운 프로세스를 시작하는 대신 stdin
에서 HTTP 요청과 비슷한 요청을 시스템에서 이미 실행중인 FCGI 서버에 보내고 여기서이 변수 및 요청 본문 내용의 값을 지정합니다 .
웹 서버가 프로그램 코드를 어떻게 든 포함 할 수 있다면 코드 자체 만 실행되기 때문에 더욱 효율적입니다. 이 작업을 수행하는 방법의 두 가지 고전적인 예는 다음과 같습니다
그렇다면 랙은 어디로 들어 옵니까? Rack은 API이며 웹 요청을 처리하는 코드는 웹 서버와 상관없이 일반적인 방식으로 수신합니다.그래서 랙 API를 사용하는 요청을 처리하기 위해 일부 루비 코드를 부여, 웹 서버 수도 :
- 단순히 함수가로드 랙 호환 코드 자체 프로세스에서 호출을 만드는 루비 웹 서버를해야합니다;
- FastCGI 프로토콜을 사용하여 요청을 처리하는 Rack 호환 코드에 대한 기능 호출을하는 FastCGI 서버 코드로 다른 프로세스와 통신하는 웹 서버 (모든 언어로 작성)입니다. 또는
- 전달 된 CGI 환경 변수와 표준 입력을 해석하고 완전히 Rack 호환 코드를 호출하는 새로운 프로세스를 시작하는 서버가되어야합니다.
그래서 CGI, FastCGI, 다른 프로세스 간 프로토콜 또는 내부 프로세스 프로토콜을 사용하든 상관 없습니다. 서버가 서버를 알고 있거나 CGI, FastCGI 등을 이해할 수있는 프로세스와 대화하고있는 한 Rack을 사용하여 Rack을 사용할 수 있습니다.
그래서 :
성능 확장을 위해
, 당신은 확실히 CGI를 사용하여 싶지 않아; FastCGI, 비슷한 프로토콜 (예 : Tomcat 코드) 또는 코드의 직접적인 프로세스 호출을 사용하려고합니다.
Rack API를 사용하는 경우 랙과 같은 API의 전체적인 점은 나중에 변경할 수 있기 때문에 초기 단계에서 웹 서버와 프로그램간에 어떤 프로토콜을 사용할지 걱정할 필요가 없습니다 .
+1 좋은 답변이지만 랙 + 승객은 cgi보다 간단합니다. 나에게 아파치를 사용하고 있다면, cgi는 그것이 얻는만큼 간단하다는 것. – pguardiario
정말 랙 + 승객보다 간단하지 않습니다. 'VirtualHost' 엔트리를 만들고, config.ru 파일을 가지고 있고, 기본적으로 끝났습니다. 그것은 필요할 때 시작하고 실행 * 매우 * 빠른 수행합니다. 왜 CGI를 사용하는 데 당신은 그렇게 붙어 있습니까? 이런 종류의 일을 처리하는 가장 효율적인 방법 중 하나입니다. "모든 사람들이 USB 드라이브를 사용하는 이유는 무엇입니까? 플로피 디스크의 문제점은 무엇입니까?"라고 묻는 것과 같습니다. – tadman