介紹好用工具: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 在執行特定次數後自動回收該程式。

相關連結

  

此文章由 will 發表於 2008/11/1 下午 06:27:12

永久連結 | 評論 (9) | 此文章的RSSRSS comment feed |

分類: IIS | PHP | 介紹好用工具 | 系統管理

標籤: , ,

收藏:

相關文章

評論

十一月 1. 2008 19:28

A`Vai Poitsonu

感覺上, IIS 好像己經可以完全取代 Apache 了, 而且介面操作上又這麼的友善 ... Smile

A`Vai Poitsonu tw

十一月 2. 2008 00:11

tomexou

免費的apache還是有一定影響力及不可取代的地方的。

tomexou tw

十一月 24. 2008 19:48

joejoe

使用 fastcgi後沒辦法連 mssql ㄟ...

joejoe tw

十一月 24. 2008 21:08

will

沒辦法連 MSSQL 跟 FastCGI 無關吧!
FastCGI 只是一個「介面」而已,又不負責跟資料庫連線。

will tw

十一月 25. 2008 07:01

joejoe

大大可以試試看,是不是這樣的狀況,我什麼都不動,將fastcgi 改跑回 isapi,連接 mssql 2000 一切都正常,再換fastcgi 就不行,抓封包發現根本沒有去連1433,都在連 339 & 445,不知道是什麼原因,改用 sql 2005 driver(sqlsrv_connect) 錯誤一直顯示ODBC錯誤,"找不到資料來源名稱且未指定預設的驅動程式"。

joejoe tw

十一月 25. 2008 12:26

will

會不會是防火牆的問題呢?

will tw

十一月 25. 2008 17:04

joejoe

不,已經試出來了,只要跑FastCGI模式,mssql這個函數就無法使用了,改跑isapi模式就OK,目前FastCGI 搭配 MS 的 SQL 2005 DRIVER FOR PHP 使用,改用sqlsrv函數就都ok了,但要灌Native Client才能用.

joejoe tw

十月 28. 2009 15:06

木屐

大大請問一下使用FastCGI執行php上傳檔案時,
我把上傳存放檔案的目錄設了權限,
並讓目錄底下的檔案去繼承上層目錄的權限,
圖片就可以顯示出來,但是我再上傳新的圖,
圖的權限一樣就是有問題?就像大大說的沒有順利被繼承,
可是我又沒有找到大大所說的upload temp的目錄?
可以煩請大大指導一下嗎?

木屐 tw

十月 28. 2009 23:55

Will 保哥

該目錄必須也要有 "匿名存取身份識別 ( IUSR_MachineName )" 的讀取權限,否則 IIS 會讀不到圖片。

Will 保哥 tw

新增評論


(將顯示您的Gravatar圖示)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]



線上預覽

二月 9. 2010 13:32