티스토리 뷰

728x90
반응형

본 포스팅은 WebtoB Fast CGI 설명 및 예제를 다루어 보겠습니다.


Fast CGI 란 웹 서버의 응용 프로그램 언어인 공통 게이트웨어 인터페이스(CGI)에서 하나의 프로세스가 다중 CGI 요청을 처리하도록 하여 속도를 향상시킨 웹 서버 플러그 인 프로그램이다. CGI에서는 요청 시마다 서비스를 제어하고 수행하는 프로세스를 새롭게 열고 닫아야 하지만, Fast CGI는 모든 프로세스 요청이 하나의 프로세스를 공유하기 때문에 많은 프로그램 명령이 절약되어 처리 속도가 빠르다. Open Market, Inc.에서 개발된 공개 프로그램이다.

 

Fast-CGI는 CGI프로그램의 많은 한계를 없애버렸다. (FastCGI is removes a lot of the limitations of CGI programs.) 그럼 CGI프로그램의 문제(한계)는 무엇인가? 가장 일반적으로 생각되는것이 실행 방법 이다.


* CGI프로그램처리순서

메모리 로딩 -> 처리 -> 종료

 

CGI는 항상 위와 같은 방법으로 호출이 된다. 우리가 JAVA의 FOR문, C의 LOOP문등을 반복적으로 사용할 경우 발생할 수 있는 이슈와 어느정보 비슷하다고 보면될 듯하다.

호출 할때마다 위와 같은 방식으로 반복 호출이 된다면, 이는 간단한 프로그램이야 문제가 안될지 모르지만, 복잡하고 자원을 많이 필요로 하는 프로그램의 경우 사용자가 많아질 수록 급격히 느려지고, 자원의 소모가 많이 된다. (병목현상 발생)

일반적으로 쉽게 비교하는것이
CGI는 프로세스 프로그램(fork())으로 Fast-CGI는 쓰레드 프로그램으로 비교할 수 있다.
fork와 쓰레드의 비교는 오랜기간 많이 되었으므로 따로 설명할 필요가 없을것 같다.

 

사용 가능 버전

WebtoB 4.1.3.0 부터 기능이 추가되었다. SvrType CGI일 경우만 동작한다.

 

Fast CGI 다운로드 및 설치

http://www.fastcgi.com 에서 모듈을 다운(fcgi-2.4.0.tar.gz )받아 압축을 해제 입니다.

./configure 를 실행 후 make를 실행한다. 

[configure 실행]

[nrson@infrasvr fcgi-2.4.0]$ ./configure

checking for a BSD compatible install... /usr/bin/install -c

checking whether build environment is sane... yes

checking for mawk... no

checking for gawk... gawk

checking whether make sets ${MAKE}... yes

checking for gcc... gcc

checking for C compiler default output... a.out

 --------------- 생략 ------------------------

 

[make 실행]

[nrson@infrasvr fcgi-2.4.0]$ make

cd . \

          && CONFIG_FILES= CONFIG_HEADERS=fcgi_config.h \

             /bin/sh ./config.status

config.status: creating fcgi_config.h

config.status: fcgi_config.h is unchanged

make  all-recursive

make[1]: Entering directory `/user/nrson/webapp/fcgi-2.4.0'

Making all in libfcgi

make[2]: Entering directory `/user/nrson/webapp/fcgi-2.4.0/libfcgi'

    --------------- 생략 ------------------------

 

설정 방법

WebtoB 설정 파일인 http.m 파일 fast cgi를 설정한다.

*SVRGROUP

 htmlg    SVRTYPE = HTML

 cgig      SVRTYPE = CGI

 

* SERVER

 html      SVGNAME = htmlg, MinProc = 10, MaxProc = 10

 fcgi       SVGNAME=CGI, MinProc=10, MaxProc=10

 

* URI

 Fcgi      Uri = "/", SvrType = CGI, CFGI = Y, SvrName = "fcgi"

 

* EXT

 htm       MimeType = "text/html", SvrType = HTML

 fcgi       MimeType="text/html", SvrType=CGI, FCGI=Y

- FCGI = Y 옵션은 SvrType = CGI인 경우, 요청이 Fast CGI인지 설정한다. 기본값은 N으로 Y로 설정하면 요청을 Fast CGI 방식으로 처리한다.

 

예제 파일 작성 및 컴파일

[fcgi.c 파일 작성]

#include <stdio.h>

#include "/user/nrson/webapp/fcgi-2.4.0/include/fcgi_stdio.h"

 

   int main()

   {

        int cnt=0;

        while (FCGI_Accept() >= 0) {

                printf("Content-type: text/html; charset=euc-kr\n\n");

                printf(" Process FCGI_Accept() Cnt:%d",cnt++);

        }

        return 0;

    }

- fcgi_stdio.h 파일은 fast cgi 모듈을 압축을 푼 디렉토리에 존재하므로 fcgi.c파일에 해당 경로를 맞춰준다.

 

[fcgi.c 컴파일]

gcc -o test_fcgi.fcgi fcgi.c /user/nrson/webapp/fcgi-2.4.0/libfcgi/.libs/libfcgi.a

- libfcgi.a 파일은 make후 생성되며, fast cgi의 압축푼 경로의 ./libfcgi/.libs/ 경로에 생성된다.

 

6. 실행결과

[hosts www.testcfgi.com을 등록하여 실행한 결과]



- 실행을 하고 반복적으로 새로고침을 해보면 Cnt가 초기화가 되는게 아니라 올라가는것을 확인할 수 있다. 여러 파일을 열어서 자주 사용하는 cgi 프로그램이 있다면 FCGI_Accept() 함수 위에 미리 사용할 파일을 미리 열어둔다면 한번만 실행되기 때문에 관련된 부하 및 소비시간을 많이 줄이는 Fast CGI를 구현할 수 있다.

 

CGI를 하나의 개발 방식으로 구현하는데 도움이 되었으면 합니다.

고맙습니다.

728x90
반응형