2013-04-18 4 views
1

CGI와 ERB를 사용하여 웹 사이트를 만들려고했지만 웹에서 검색 할 때 항상 CGI을 사용하지 않아야한다고 말하는 사람들을 볼 수 있으며 항상 Rack을 사용합니다.왜 CGI 사용을 피해야합니까?

나는 CGI가 많은 Ruby 프로세스를 포크하게 될 것이라는 것을 알고 있지만, FastCGI을 사용하면 하나의 영구 프로세스가 생성되고 PHP 웹 사이트에서도 채택됩니다. 플러스 FastCGI 인터페이스는 하나의 요청에 대해 하나의 객체만을 생성하며, 동시에 7 개의 객체를 생성하는 랙과는 달리 매우 우수한 성능을 제공합니다.

CGI를 사용하지 않아야하는 구체적인 이유가 있습니까? 아니면 단지 잘못된 가정이며 CGI/FastCGI를 사용하는 것이 좋습니다.

답변

1

CGI는 인터페이스와 공용 프로그래밍 라이브러리 및 그 관행을 의미하며 다른 시간에 작성되었습니다. 환경 변수 및 표준 I/O 스트림을 통해 웹 서버에 연결된 별개의 프로세스 인 요청 처리기를 볼 수 있습니다.

오늘날 우리가 생각하는 것처럼 "웹 프레임 워크"와 "임베디드 서버 모듈"이 없었던 시대에 최첨단 기술이었습니다. 따라서 ...

CGI는

다시 느린 경향의 CGI 모델은 연결 당 하나 개의 새로운 프로세스를 생성합니다. 그 자체가 인 프로세스를 생성하는 동안 요즘에는 무거운 웹 앱 초기화 - 모듈 점수 읽기 및 구문 분석, 데이터베이스 연결 만들기 등이 매우 비쌉니다.

CGI가 다시 너무 낮은 수준 (IMHO) 디자인

향해 경향은 CGI 모델 명시 적 요청 핸들러 사이의 인터페이스로서 환경 변수 및 표준 입력을 언급한다. 하지만 ... 누가 신경 쓰냐? 이는 앱 디자이너가 일반적으로 생각해야 할 수준보다 훨씬 낮은 수준입니다. CGI를 기반으로하는 라이브러리와 코드를 살펴보면 폼 파싱과 HTML 생성과 함께 "비즈니스 로직"을 조장 할 수 있다는 것을 알 수 있습니다. 이는 현재 위험의 혼합으로 널리 인식되고 있습니다.

Rack :: Builder와는 대조적으로, 바로 코더가 네임 스페이스를 동작에 매핑하는 것을 생각하고 있으며, 이는 광범위한 웹 애플리케이션을 의미합니다. (사용자가 제공 한 입력을 기반으로 라디오 버튼을 생성 할 생각이 없으므로 갑자기 우리는 시맨틱 웹과 REST 덕분에 논쟁의 여지가 없다.)

그래, Rack :: Builder와 같은 것은 CGI 위에 구현 될 수 있지만 그게 중요한 부분입니다. CGI 위에는 추상화 계층 인 이 있어야합니다.

CGI는 냉소하여 CGI가 간단하고 널리 이해에도 불구하고, 물론 그 한계 내에서 완벽하게 작동에도 불구하고

을 기각하는 경향이, CGI는 종종 손에서 그라운드를 떠납니다. 당신도 CGI가 당신이 아는 한 손에 닿지 않을 수 있습니다.

1

CGI를 사용하지 마십시오. 부디. 그것은 가치가 없어. 1990 년대에 아무도 잘 모르는 사람이라면 좋은 생각처럼 보였지만 스크립트가 드문 경우 였고 양식 제출을 처리하고 전체 사이트를 운전하지 않는 것과 같은 특별한 경우에 사용되었습니다.

FastCGI는 "더 나은 CGI"를 사용하려는 시도이지만, FastCGI 작업자 프로세스를 관리해야하기 때문에 여러 가지 방법으로 여전히 결함이 있습니다.

랙이 훨씬 뛰어난 시스템이며 잘 작동합니다. Rack을 사용하는 경우 선택할 수있는 다양한 호스팅 시스템이 있으며 심지어 매우 간단하고 신뢰할 수있는 Passenger입니다.

어떻게 든 실행중인 7 개의 랙 프로세스가 있거나 구현시 실수를 한 것이 아니라면 Rack에서 "한 번에 7 개의 객체"를 생성 할 때 어떤 의미인지 알 수 없습니다.

CGI가 랙과 동등한 단일 인스턴스를 생각할 수 없습니다.

+0

+1 좋은 답변이지만 랙 + 승객은 cgi보다 간단합니다. 나에게 아파치를 사용하고 있다면, cgi는 그것이 얻는만큼 간단하다는 것. – pguardiario

+0

정말 랙 + 승객보다 간단하지 않습니다. 'VirtualHost' 엔트리를 만들고, config.ru 파일을 가지고 있고, 기본적으로 끝났습니다. 그것은 필요할 때 시작하고 실행 * 매우 * 빠른 수행합니다. 왜 CGI를 사용하는 데 당신은 그렇게 붙어 있습니까? 이런 종류의 일을 처리하는 가장 효율적인 방법 중 하나입니다. "모든 사람들이 USB 드라이브를 사용하는 이유는 무엇입니까? 플로피 디스크의 문제점은 무엇입니까?"라고 묻는 것과 같습니다. – tadman

0

CGI, Rack 등이 실제로 무엇에 관한 것인지 많은 혼란이 있습니다. here을 설명 할 때, Rack은 API이고 FastCGI는 프로토콜입니다. CGI는 프로토콜이기는하지만 좁은 의미로는 구현이며, 여러분이 말하는 것은 FastCGI와 똑같은 것이 아닙니다. 먼저 배경부터 시작하겠습니다.

웹 서버는 90 년대 초반에 디스크에서 파일 (HTML, 이미지 등)을 읽은 다음 클라이언트에게 보냈습니다. 사람들은 요청시에 약간의 처리를하기를 원했고, 나온 초기 해결책은 단지 파일을 읽는 것보다 결과를 클라이언트에게 되돌려 보내는 프로그램을 실행하는 것이 었습니다. 이것에 대한 "프로토콜"은 웹 서버가 프로그램 (예 : /cgi-bin/my-script)으로 실행되도록 구성된 URL을 제공하는 것이며 웹 서버는 요청에 대한 다양한 정보가있는 환경 변수 세트를 설정합니다 표준 입력에 대한 요청 본문을 사용하여 프로그램을 실행하십시오. 이를 "Common Gateway Interface"이라고합니다.

모든 요청에 ​​대해 새로운 프로세스를 포크하는 경우 분명히 비효율적이며 대용량 웹 사이트에서이 스타일의 동적 요청 처리를 사용하지 않으려 고합니다. (완전히 새로운 프로세스를 시작하는 것은 계산 리소스가 상대적으로 비쌉니다.)

새 프로세스를 시작하는 대신 이미 실행중인 기존 프로세스로 요청 정보를 보냅니다. 이것은 FastCGI의 모든 것입니다. CGI와 매우 유사한 인터페이스를 유지합니다 (대부분의 요청 정보가있는 변수 세트와 요청 본문에 대한 데이터 스트림이 있습니다). 그러나 실제 Unix 환경 변수를 설정하고 본문을 사용하여 새로운 프로세스를 시작하는 대신 stdin에서 HTTP 요청과 비슷한 요청을 시스템에서 이미 실행중인 FCGI 서버에 보내고 여기서이 변수 및 요청 본문 내용의 값을 지정합니다 .

웹 서버가 프로그램 코드를 어떻게 든 포함 할 수 있다면 코드 자체 만 실행되기 때문에 더욱 효율적입니다. 이 작업을 수행하는 방법의 두 가지 고전적인 예는 다음과 같습니다

  • 유무 PHP가 아파치에 포함 된 "아파치 서버 코드는"그냥 "PHP 서버 코드"그 같은 과정의 일부 호출하는 단계;

  • Apache를 전혀 실행하지 않지만 웹 서버를 Ruby (또는 Python 등)로 작성하고 요청을 처리하기 위해 사용자 정의 작성된 Ruby 코드를 추가로 실행하십시오.

그렇다면 랙은 어디로 들어 옵니까? Rack은 API이며 웹 요청을 처리하는 코드는 웹 서버와 상관없이 일반적인 방식으로 수신합니다.그래서 랙 API를 사용하는 요청을 처리하기 위해 일부 루비 코드를 부여, 웹 서버 수도 :

  • 단순히 함수가로드 랙 호환 코드 자체 프로세스에서 호출을 만드는 루비 웹 서버를해야합니다;
  • FastCGI 프로토콜을 사용하여 요청을 처리하는 Rack 호환 코드에 대한 기능 호출을하는 FastCGI 서버 코드로 다른 프로세스와 통신하는 웹 서버 (모든 언어로 작성)입니다. 또는
  • 전달 된 CGI 환경 변수와 표준 입력을 해석하고 완전히 Rack 호환 코드를 호출하는 새로운 프로세스를 시작하는 서버가되어야합니다.

그래서 CGI, FastCGI, 다른 프로세스 간 프로토콜 또는 내부 프로세스 프로토콜을 사용하든 상관 없습니다. 서버가 서버를 알고 있거나 CGI, FastCGI 등을 이해할 수있는 프로세스와 대화하고있는 한 Rack을 사용하여 Rack을 사용할 수 있습니다.

그래서 :

성능 확장을 위해

, 당신은 확실히 CGI를 사용하여 싶지 않아; FastCGI, 비슷한 프로토콜 (예 : Tomcat 코드) 또는 코드의 직접적인 프로세스 호출을 사용하려고합니다.

Rack API를 사용하는 경우 랙과 같은 API의 전체적인 점은 나중에 변경할 수 있기 때문에 초기 단계에서 웹 서버와 프로그램간에 어떤 프로토콜을 사용할지 걱정할 필요가 없습니다 .

관련 문제