달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31


APACHE + FCGI 연동 , 예제   ( apache2 - fast cgi - 2006 06)

http://suite.tistory.com/ fs


0. 준비
 - 소스 다운로드
  apache : http://www.apache.org
  fcgi   : http://www.fastcgi.com

  사이트에서 검색? 하여 소스를 다운 받는다.
 
  httpd-2.0.54.tar.gz , mod_fastcgi-2.4.2.tar.tar,fcgi-2.4.0.tar
  참고로 httpd-2.2.2 버전은 fcgi 모듈 설치시 헤더파일 없다는 문제 발생
  되도록 httpd-2.0XX 버전을 다운 받는다. (httpd-2.1XX 테스트 안해봄)

 - 설치 계정: 설치 계정 생성
     ex) $>useradd fs
        - 설치 디렉토리 : /home/fs/apmz
     ex) fs$> mkdir apmz

 * 데비안 리눅스 3.0 에서 설치 한 문서

1. apache 설치


      가. 해당 소스를 압축을 푼 디렉토리에서 configure 수행
      
        ./configure --prefix=/home/fs/apmz/apache2 --enable-mods-shared=most --enable-modules=so --with-mpm=worker
 
       옵션 설명: 
      --prefix= 설치 디렉토리 디렉토리
      --enable-mods-shared=most --enable-modules=so  DSO 방식으로 PHP 모듈을 끼워 넣을 수 있도록 아파치를 컴파일하기 위해 옵션을 반드시 사용합니다.
     --with-mpm=worker 옵션은 아파치 설정 파일에서 살펴보겠지만 다중 프로세서 모듈(MPM) 중 worker 모듈을 지원할 수 있도록 하는 옵션입니다.
          이 옵션을 추가하지 않으면 아파치 2.x 버전에서는 기본적으로 perfork 모듈을 지원합니다.
        
     *오류 발생시 리플
       http://cafe.naver.com/linuxmaster.cafe 


      나.  컴파일
          ./make
         *오류 발생시 리플
             http://cafe.naver.com/linuxmaster.cafe 


      다. 설치
    ./make install
    ls /home/fs/apmz/apache2 실행하여 설치되었는지 확인해본다.


       라. LD_LIBRARY_PATH 설정
          아파치가 SO 모듈을 찾을수 있도록 사용자 쉘에 모듈 디렉토리 위치를 설정해둔다.
           mysql 디렉토리 뒤에 apache2/lib , apache2/modules 두개 추가 해준다
          ex) bash 쉘경우
          vi 홈디렉토리/.bash_profile
         export LD_LIBRARY_PATH=/home/fs/apmz/apache2/lib:/home/fs/apmz/apache2/modules
         source  .bash_profile 를 실행하여 바로 현 쉘에 적용


      바. 실행
   
         /home/fs/apmz/apache2/bin/apachectl start
        실행 후 에러가 없으면 완료
         이미 사용하는 포트라는 메시가 나올경우 http.conf 파일에서 수정 할 것


2.  FCGI 모듈 설치
       
    가. fcgi 모듈  


     mod_fastcgi-2.4.2.tar 압축 푼 디렉 토리에서
     Makefile.AP2  파일에서 top_dir=/home/fs/apmz/apache2/fcgi2 을 설치된 fcgi 경로 지정 
     cp  Makefile.AP2 Makefile
     make 
     make install
     설치후 httpd.conf 에 아래 사항을 추가한다 .
       ================================================================================================
      # 아래 모듈 추가 라인이 없다면 httpd.conf에 써준다  
     LoadModule fastcgi_module modules/mod_fastcgi.so
     <IfModule mod_fastcgi.c>
         Alias /fcgi-bin/ "/home/fs/apmz/apache2/fcgi-bin/"
        <Directory "/home/fs/apmz/apache2/fcgi-bin">
            SetHandler fastcgi-script
             Options +ExecCGI
         </Directory>
          # 확장자가 fcgi경우 fast-cgi 동작
       AddHandler fastcgi-script .fcgi .fpl
         
       # 아래 주석으로 해둔 사항은 선택 사항임
       # fast-cgi 프로세스 최대 생성 갯수 값등 설정 (ps -ef 확인)
       FastCgiConfig -initial-env PATH=/home/fs/apmz/apache2/fcgi-bin -maxClassProcesses 3 -startDelay 1
       # 아파치 시작시 이미 fcgi 프로세스를 실행해 둘 경우 설정 (ps -ef 확인)
       # FastCgiServer fcgi-bin/fcgi_example.fcgi -processes 3
       # 보다 자세한 설정사항은 http://www.fastcgi.com   -.-^
    </IfModule>
   ====================================================================================================
 
    나. fcgi C 개발 킷(라이브러리) 설치


      fcgi-2.4.0.tar 압축 푼디렉토리 
     ./configure --prefix=/home/fs/apmz/apache2/fcgi2
      make
      make install
   
3. C 예제 printf("FCGI_Accept()");
  
   fast-cgi 동작원리를 설명하기에는 필자 역시 명확하게는 모르기 때문에 -.-;;
   간단하게 설명하면  일반 CGI 경우 한번 실행할때 마다 프로세스를 생성하여 동작을 해주는데
   fcgi 경우 실행하고 끝나는게 아니고 무한 루프를 돌며 서버형태로 지속적으로 동작 해준다.
   fcgi와 아파치 사이의 프로세스 통신은 UDS(unix domain socket) 기반으로 UDS은 TCP/IP 어플리케이션 계층에서
   TCP 계층까지만 메시지가 전달되고, 다시 곧바로 어플리케이션 계층으로 메시지가 올라가게 된다.
   아무튼 우리가 FCGI를 사용한다면 FCGI_Accept()  API안에다만 적어주면 알아서? 동작하게된다.

   가. 소스
 
   /**********************
     fcgi_example.c 
   ************************/
  
   #include <stdio.h>
   #include "/home/fs/apmz/apache2/fcgi2/include/fcgi_stdio.h"
   int main()
   {

        int cnt=0;
      
        /* fastcgi 시작 부분 이 안에 루프 돌면서 할 작업을 넣어 둔다. **/
        while (FCGI_Accept() >= 0) {

                printf("Content-type: text/html; charset=euc-kr\n\n");
                printf(" Process FCGI_Accept() Cnt:%d",cnt++);
             
        }

        return 0;
    }


    나.  컴파일(정적) libfcgi.a 위치가 /home/fs/apmz/apache2/fcgi2/lib경우 
  
    gcc -o fcgi_example.fcgi fcgi_example.c /home/fs/apmz/apache2/fcgi2/lib/libfcgi.a
  
    fcgi-bin 디렉토리로 복사
    cp fcgi_example.fcgi /home/fs/apmz/apache2/fcgi-bin/


    다.  확인
    아파치 재시작
    /home/fs/apmz/apache2/bin/apachectl  restart
    http://localhost:8244/fcgi-bin/fcgi_example.fcgi
     
   Process FCGI_Accept() Cnt:0
   Process FCGI_Accept() Cnt:1
   Process FCGI_Accept() Cnt:2
           .
            .
           .
   Process FCGI_Accept() Cnt:20

   이처럼 Cnt가 초기화가 되는게 아니라 올라가는걸 볼수있다


   여러 파일을 열어서 자주 사용하는 cgi 프로그램있다면    FCGI_Accept()  함수 위에

   미리 사용할 파일을 미리 열어둔다면 한번만 실행되기 때문에   관련된 소비시간을 많이 줄여

   실용적인 fcgi를 사용할 수 있을것이다.

   
네이버 리눅스 마스터  카페


*  추가 설정 참조

FastCgiConfig -maxProcesses 20 -minProcesses 8 -maxClassProcesses 8 -killInterval 36000 -updateInterval 36000 -idle-timeout 15000 -appConnTimeout 15000 -listen-queue-depth 500 -singleThreshhold 1

AppClass /home/fs/fcgi-bin/fs.fcgi -processes 4 -listen-queue-depth 50 -idle-timeout 3600 -appConnTimeout 2000 -initial-env LD_LIBRARY_PATH=/home/fs/flib

 

:
Posted by mastar