﻿# 介紹好用工具：FastCGI Extension for IIS6.0

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

以下是安裝 [FastCGI Extension for IIS6.0](http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1521) + [PHP](http://www.php.net/) 的心得分享：

### 安裝FastCGI Extension for IIS6.0

1\. 先下載 [FastCGI Extension for Internet Information Services 6.0](https://web.archive.org/web/20100118003939/http://www.microsoft.com:80/downloads/details.aspx?FamilyID=2d481579-9a7c-4632-b6e6-dee9097f9dc5&displaylang=en) 安裝檔

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

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

![網際網路資訊服務(IIS)管理員 的 網頁延伸服務，這裡會多出一個 FastCGI Handler 網頁服務延伸模組](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/cdfac1beb870707482e3-image_3.png)

### 安裝 PHP

1\. [下載 PHP 最新版](http://www.php.net/downloads.php) ( 今天的最新版為 [PHP 5.2.6 zip package](https://museum.php.net/php5/php-5.2.6-Win32.zip) )

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](https://web.archive.org/web/20100118003939/http://www.microsoft.com:80/downloads/details.aspx?FamilyID=2d481579-9a7c-4632-b6e6-dee9097f9dc5&displaylang=en) 提供的一個 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 參數，首先必須先查出該網站的 "識別元" 編號([可參考這張圖片](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f66aa25b525bc793c640-image_9.png))，再輸入以下指令：

```
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](http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx) 查看 IIS 的 w3wp.exe Process 發現確實有 php-cgi.exe 執行起來了!

 ![用 Process Explorer 查看 IIS 的 w3wp.exe Process ](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/8c294e26a7a6d2301fef-image_12.png)

FastCGI 可以微調的設定還有一些，例如 MaxInstances (最多可同時執行幾個程序) 或 InstanceMaxRequests (設定最多執行幾次後自動回收該程序)，若各位有興趣可以自行參考 [Configuring FastCGI Extension for IIS 6.0](https://web.archive.org/web/20090420054032/http://learn.iis.net:80/page.aspx/248/configuring-fastcgi-extension-for-iis60/) 文件，裡面有蠻詳細的說明。

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

**相關連結**

-   [FastCGI Extension for IIS6.0 - RTM](http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1521)
-   [Configuring FastCGI Extension for IIS 6.0](https://web.archive.org/web/20090420054032/http://learn.iis.net:80/page.aspx/248/configuring-fastcgi-extension-for-iis60/)
-   [FastCGI for IIS7](http://www.iis.net/downloads/default.aspx?tabid=34&i=1299&g=6)
