2009년 7월 16일 목요일

Windows Server/IIS에서 PHP 구동 최적화, FastCGI

http://hsshin.isblog.net/blog_post_101.aspx 쿨가이님 홈피에서 업어온거
image

CGI(Common Gateway Interface)라는 단어는 웹이 유행하기 시작할 즈음부터, 많이 들렸던 단어입니다. 특정 클라이언트가 서버에 요청을 보냈을 때, 해당 요청을 처리하기 위해 응용 프로그램이 필요할 수 있습니다. 이 때 서버와 응용 프로그램 사이에 메시지를 주고 받기 위한 인터페이스를 CGI라고 표현합니다.

IIS 6.0 시절 응용 프로그램을 통해서 서비스해야 했던 대표적인 것이 바로 PHP입니다. PHP 모듈을 다운로드받아, 설치하고, PHP에 대한 요청시 이를 PHP 모듈과 연결하여서 서비스하는 형태를 취해야 했습니다. PHP라고 하면, Linux + Apache 서버를 많이 생각하시게 되는데, IIS에서도 이를 서비스를 아예 못했던 것은 아닙니다. Microsoft의 기술은 항상 이기종 및 공존 환경에서도 최적의 솔루션이 될 수 있도록 생각하고, 이를 기술화시키고 있습니다.

그렇지만 IIS 6.0 + PHP는 서비스라는 가치를 제공하긴 했지만, 약간의 부족함이 보였습니다. 바로 성능적인 이슈입니다. PHP를 처리하기 위한 프로세스인 PHP-CGI.EXE의 프로세스가 한개 이상 생성이 안되었었고, 또한 요청시 프로세스 생성, 요청 처리 완료시 프로세스 종료를 시키는 형태였기 때문에, 대용량 & 많은 요청시 서버에서는 프로세스 생성, 종료를 위한 추가적인 부하가 걸렸었습니다. 이러한 부하가 대용량 처리에 한계에 이르렀고, PHP를 서비스하기 위해서는 IIS는 아니라는 생각을 가지게된 계기가 되었다고 생각합니다.

IIS 7.0에서는 FastCGI라는 새로운 컨셉을 제공합니다. IIS 7.0뿐만 아니라 IIS 5.1, IIS 6.0에서도 이제 PHP를 Apache보다 더 나은 성능으로 제공합니다. 먼저 FastCGI라는 기술을 설명드리면, ZEND라는 회사에서 개발을 하였고, IIS 팀과의 긴밀한 협조속에 IIS 에서도 이를 마음껏 사용할 수 되었습니다. 원리는 간단히 이렇습니다.

1. 기존에 부하가 걸렸던 프로세스 생성/종료 문제를 해결하기 위해, IIS Worker Process와 마찬가지로, 요청시 생성되고, 바로 종료되지 않고 일정시간 대기 후, 요청이 없는 경우, 종료합니다.
2. 하나의 프로세스로 모든 걸 처리하려고 했던 아키텍쳐에서 요청 급증시 멀티 프로세스 모델로 변경

image

FastCGI를 사용하는 방법은 기존 IIS 6.0과 동일합니다. PHP 모듈을 다운로드받습니다. PHP 예제 샘플은 이미지 뷰어 공개 샘플인 QDIG을 사용하게 됩니다.


  1. PHP 모듈의 압축을 해제합니다.
  2. PHP.INI-RECOMMENDED 파일을 PHP.INI로 복사합니다. 
  3. 메모장을 이용하여 PHP.INI 파일을 엽니다.
  4. 예제 프로그램인 QDIG 응용 프로그램을 동작시키기 위해, 아래와 같이 수정합니다.
    변경: register_long_arrays = on
    변경: extension_dir = "C:\PHP\ext"
    추가: extension=php_gd.dll
  5. PHP.INI 파일을 저장하고, 메모장을 닫습니다.

이제 PHP를 FastCGI내 처리기 매핑 처리를 해줘야 합니다. 사이트내 처리기 매핑에서 모듈 매핑 추가를 클릭합니다. 그런 후 나오는 창에서, 이 포스팅 가장 상단 그림의 내용을 입력합니다. 그러면 셋팅 끝입니다. :)

image image

기본 문서에서 Index.PHP를 기본 문서로 잡는 것도 필요하겠죠.

image

IIS는 .NET을 구동시키기 위한 최상의 플랫폼임과 동시에, 조직내 이기종 환경에서도 이를 지원하는 최적화 플랫폼입니다. 이를 뒷받침하는 좋은 기술 중 하나가 바로 FastCGI가 되게 됩니다.

감사합니다.

댓글 없음:

댓글 쓰기