Windows에서 PHP를 구동하기 위한 FastCgi 베스트 프랙티스

몇 가지 고려사항이 있습니다.

첫째, PHP 웹사이트의 보안을 위해 다른 사이트와 격리 시켜야 합니다.
. 웹사이트 마다 어플리케이션 풀을 각자 할당
. 어플리케이션 풀 아이덴티티에 사용자 계정 사용
. 어플리케이션 풀 아이덴티티를 사용하기 위해 Anonymous 사용자 설정
. FastCGI의 impersonation 설정 확인 (fastcgi.impersonate = 1)

둘째, PHP 프로세스를 재활용 하세요 .
네이티브 PHP 리사이클링이 시작되기 전에, php-cgi.exe가 항상 리사이클 되도록 하는 것이 좋습니다. FastCGI의 프로세스 리사이클링은 instanceMaxRequests라는 파라미터에 의해 결정됩니다. 리사이클 되기 전에 몇개의 FastCGI 프로세스를 처리할 것인지를 설정하는 역할을 하죠. 이 파라미터 이외에도 PHP 자체적으로 프로세스 리사이클링을 담당하는 파라미터가 있는데, PHP_FCGI_MAX_REQUESTS가 바로 그거죠. instanceMaxRequest 값을 PHP_FCGI_MAX_REQUESTS 값보다 작거나 같게 하면 PHP의 네이티브 리사이클링은 절대 발생하지 않겠죠? 아래와 같이 설정하면 됩니다.
C:\>%windir%\system32\inetsrv\appcmd set config -section:system.webServer/fastCgi /[fullPath='c:\{php_folder}\php-cgi.exe'].instanceMaxRequests:10000

C:\>%windir%\system32\inetsrv\appcmd set config -section:system.webServer/fastCgi /+[fullPath='c:\{php_folder}\php-cgi.exe'].environmentVariables.[name=’PHP_FCGI_MAX_REQUESTS’, value='10000']
※ 미리 값을 설정하지 않으면 기본 설정값은 instanceMaxRequest=200, PHP_FCGI_MAX_REQUESTS=500 으로 할당됩니다.

셋째, PHP의 버전
. PHP 어플리케이션은 주로 특정 버전의 PHP의 기능 및 특징을 이용하여 개발되죠. 웹호스팅 환경에서, 또는 기업에서 사용하는 PHP 어플리케이션이 다양한 버전의 PHP를 사용한다면, 한대의 서버에서 여러개의 PHP를 지원하는 것은 필수겠지요. IIS7의 FastCGI 핸들러는 여러 버전의 PHP를 지원합니다. PHP4.4.8, PHP5.2.1, PHP5.2.5 non thread-safe 버전이 모두 필요하다면 PHP컴파일러를 파일 시스템에 각각 다운 받아야 합니다. (c:\php4.4.8, c:\php5.2.1, c:\php525nts)를 설치한 후 각 버전의 어플리케이션 풀을 생성합니다.
C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='c:\php448\php.exe']
C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='c:\php521\php-cgi.exe']
C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='c:\php525nts\php-cgi.exe'] site1, site2, site3의 3개의 웹사이트가 있고 각 사이트가 별도의 버전 PHP를 사용한다면 아래와 같이 설정할 수 있을 겁니다.
C:\>%windir%\system32\inetsrv\appcmd set config site1 –section:system.webServer/handlers /+”..[name=’PHP448_via_FastCGI’,path=’*.php’,verb=’*’,modules=’FastCgiModule’,scriptProcessor=’c:\php448\php.exe’,resourceType=’Either’]
C:\>%windir%\system32\inetsrv\appcmd set config site2 –section:system.webServer/handlers /+”..[name=’PHP521_via_FastCGI’,path=’*.php’,verb=’*’,modules=’FastCgiModule’,scriptProcessor=’c:\php521\php-cgi.exe’,resourceType=’Either’]
C:\>%windir%\system32\inetsrv\appcmd set config site3 –section:system.webServer/handlers /+”..[name=’PHP525nts_via_FastCGI’,path=’*.php’,verb=’*’,modules=’FastCgiModule’,scriptProcessor=’c:\php525nts\php-cgi.exe’,resourceType=’Either’]

넷째, PHP 보안강화를 위한 추천 항목

  1. Disable remote URL's for file handling functions:
    . Set allow_url_fopen=Off
    . Set allow_url_include=Off
  2. Disable register_globals:
    . register_globals=Off
  3. Restrict where PHP can read and write on a file system, e.g.:
    . open_basedir="c:\inetpub\"
  4. sable safe mode:
    . safe_mode=Off
    . safe_mode_gid=Off
  5. Limit script execution time:
    . max_execution_time=30
    . max_input_time=60
  6. Limit memory usage and file sizes:
    . memory_limit=16M
    . upload_max_filesize=2M
    . post_max_size=8M
    . max_input_nesting_levels=64
  7. Configure error messages and logging:
    . display_errors=Off
    . log_errors=On
    . error_log="C:\path\of\your\choice"
  8. Hide presence of PHP:
    . expose_php=Off

감사합니다.