The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

介紹好用工具:FastCGI Extension for IIS6.0

我最早接觸 FastCGI 大約是在 10 年前吧,當時的互動式網頁大多是在 CGI 的架構下開發,但 CGI 最大的缺點就是每次 Request 網頁都需要重新啟動一次 Process,而啟動 Process 卻是個十分耗費資源的動作,尤其是同一支程式明明一直要提供服務卻還必須要不斷的啟動、執行、關閉,不像是 Daemon 或 Service 的方式比較有效率,而 FastCGI 就是用來解決此問題,印象中微軟好像去年才提供 FastCGI for IIS 的支援。

以下是安裝 FastCGI Extension for IIS6.0 + PHP 的心得分享:

安裝FastCGI Extension for IIS6.0

1. 先下載 FastCGI Extension for Internet Information Services 6.0 安裝檔

2. 執行安裝程式 ( fcgisetup32.msi ) 一直按下一步就完成了

3. 檢查是否成功安裝,開啟網際網路資訊服務(IIS)管理員網頁延伸服務,這裡會多出一個 FastCGI Handler 網頁服務延伸模組。

網際網路資訊服務(IIS)管理員 的 網頁延伸服務,這裡會多出一個 FastCGI Handler 網頁服務延伸模組

安裝 PHP

1. 下載 PHP 最新版 ( 今天的最新版為 PHP 5.2.6 zip package )

2. 將下載的 php-5.2.6-Win32.zip 解壓縮到 C:\php 目錄下

3. 將 C:\php\php.ini-recommended 複製到 C:\php 或 C:\WINDOWS 目錄下皆可,但檔名要改成 php.ini

設定 FastCGI 與 IIS

首先必須先修改 php.ini 檔,需調整以下三個設定參數,以支援 FastCGI 的運作!

cgi.force_redirect = 0

cgi.fix_pathinfo=1

fastcgi.impersonate = 1

接著就要將 *.php 註冊到 IIS 與 FastCGI 的設定檔中,而這部分可以使用 FastCGI Extension for Internet Information Services 6.0 提供的一個 cscript 指令檔協助設定,一行指令就搞定了。

若要查詢指令碼的用法,可以用以下指令查詢:

C:\WINDOWS\system32\inetsrv>cscript fcgiconfig.js
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Usage:
    List settings:
        fcgiconfig.js -list [-section:"foo"]
    Set/Delete setting:
        fcgiconfig.js -set -section:"foo" -<property>[:value]
    Get setting:
        fcgiconfig.js -get -section:"foo" -<property>
    Add new script mapping:
        fcgiconfig.js -add -section:"foo" -extension:"bar" -path:"<path>" [-site:NNN]
    Remove a script mapping:
        fcgiconfig.js -remove -section:"foo"
    Apply pre-existing ini settings to metabase:
        fcgiconfig.js -syncini

若要安裝 PHP for FastCGI 到所有網站,可以直接輸入以下指令:

C:\WINDOWS\system32\inetsrv>cscript fcgiconfig.js -add -section:"PHP-All" -exten
sion:php -path:"C:\php\php-cgi.exe"
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

INI successfully written.

不過執行這行通常沒用,因為只有在日後「新增網站」時才會繼承這裡的設定,現有的網站都不會套用這個設定喔!若要套用到現有的網站,必須指定 -site:NNN 參數,首先必須先查出該網站的 "識別元" 編號(可參考這張圖片),再輸入以下指令:

C:\WINDOWS\system32\inetsrv>cscript fcgiconfig.js -add -section:"PHP" -extension
:php -path:"C:\php\php-cgi.exe" -site:3334782
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

INI successfully written.

這些的設定都是寫入到 %WINDIR%\system32\inetsrv\fcgiext.ini 設定檔中,並幫你註冊 IIS 中的應用程式對應。

安裝好之後,記得要重新啟動該網站應用程式集區,才能讓新的設定生效。(不需要重新啟動整個IIS)

執行起來後,我用 Process Explorer 查看 IIS 的 w3wp.exe Process 發現確實有 php-cgi.exe 執行起來了!

 用 Process Explorer 查看 IIS 的 w3wp.exe Process

FastCGI 可以微調的設定還有一些,例如 MaxInstances (最多可同時執行幾個程序) 或 InstanceMaxRequests (設定最多執行幾次後自動回收該程序),若各位有興趣可以自行參考 Configuring FastCGI Extension for IIS 6.0 文件,裡面有蠻詳細的說明。

額外說明一點,因為早期的 CGI 常會有 Memory Leak 的問題,所以為了避免 CGI 出問題導致系統不穩,通常 FastCGI 會讓 CGI 執行特定次數後自動回收,而這個設定參數就是 InstanceMaxRequests,在 FastCGI for IIS 中預設值為 1,000 次。假設你可能有些 CGI 沒有原始檔或無法修改,且 CGI 程式每次執行完都會累積記憶體用量而降不下來,你就可以將這個參數調小一點,並強迫 FastCGI 在執行特定次數後自動回收該程式。

相關連結