服务器环境筹建系列 II - PHP在IIS6.0中部署

服务器环境搭建系列 II - PHP在IIS6.0中部署

场景


需要在客户服务器上进行项目部署实施:
  • 客户提供的服务器只有Windows平台;
  • 客户可提供的二级域名有限,或无法提供二级域名;
  • 服务器所在网络监管很严格,一般只开放80服务端口(如需开放其他端口则需要较长审批流程),无法通过VPN或FTP方式进行后期系统维护;
客户服务器环境为:
  • Windows 2003
  • IIS 6.0(.Net Frameworks 2.0+)
项目部署环境要求:
  • PHP 5.3.13
  • MySQL
  • 微博(记事狗)
  • 论坛(Discuz!)
解决方案

1.准备工作

    A. 通过Google搜索解决方案(得出参考文献如后面所列)。
  • 2种可选方案 - ISAPI和FastCGI;
  • 最终选择FastCGI - 由于文章中指出“ISAPI方式稳定性不佳,经常会导致整个Web Server Crash,所以微软特别针对IIS开发了FastCGI模组(IIS7已内建),据说效能及稳定性都有较大改善”。
    B. 在本地搭建模拟部署实施环境 - IIS上搭建项目部署所需环境准备工作如下:
  • 下载 PHP 包( 使用 php-5.3.13-Win32-VC9-x86.zip 线程安全版 ) - 最好安装于非系统盘,与项目系统处于同一文件夹且需是英文目录路径(暂时不考虑IO问题)。
  • 下载 FastCGI for IIS 包并安装 - 默认安装于 %windir%\system32\inetsrv 目录下,包含fcgiext.dll、fcgiext.ini、fcgiconfig.js等几个文件。
2.模拟环境搭建

    按照参考文章中所列,逐步修改相关配置。开始确实摸不着头脑,实际上这几个 ini 配置文件中对于其中配置条目都有相关说明,比如php.ini中对默认使用什么值、建议在Windows平台上打开或关闭配置项等,fcgiext.ini 中非常详细地举例说明了多种php处理方式。

2.1 PHP.ini 相关配置变更

1. 首先开启『扩展目录』配置项
服务器环境筹建系列 II - PHP在IIS6.0中部署

然后修改 PHP.ini 配置文件中如下3个配置项(IIS 的辅助配置):
cgi.force_redirect = 0 cgi.fix_pathinfo=1 fastcgi.impersonate = 1

2. 同时,需要开启MySQL相关配置(在如下图所示配置节)
服务器环境筹建系列 II - PHP在IIS6.0中部署
具体应该只开启 MySQL 对应动态链接库配置项
服务器环境筹建系列 II - PHP在IIS6.0中部署


3. 需开启下面设置项,以避免 Discuz! 出现 PHP 不能进行 script 解释的问题。
服务器环境筹建系列 II - PHP在IIS6.0中部署

4. 部署时需打开 log 相关选项(如下图所示的 ini 配置节)
服务器环境筹建系列 II - PHP在IIS6.0中部署
如下图需打开『显示启动时错误信息』选项,一般按照 PHP.ini 文件配置相应说明进行对应修改即可。
服务器环境筹建系列 II - PHP在IIS6.0中部署

 进入实际生产环境时需关闭 log 并开启文件 log
服务器环境筹建系列 II - PHP在IIS6.0中部署

5. PHP 按照上述配置后可以先放置 phpinfo.php 检查 PHP运行环境是否 OK,如果提示有自动区域设置(Locale)问题,可以通过修改下图所示配置项完成:
服务器环境筹建系列 II - PHP在IIS6.0中部署
记得删除 phpinfo.php

2.2 fcgiext.ini 配置文件变更

修改 fcgiext.ini 配置文件 - 指定fcigext.dll需要处理的IIS站点及相关配置
服务器环境筹建系列 II - PHP在IIS6.0中部署

一般需指定 fcgiext.dll 对应处理的 IIS 站点编号(如下图所示),避免客户服务器环境多系统间影响。
服务器环境筹建系列 II - PHP在IIS6.0中部署

并在 [Types] 中进行设定,其中:
php:823433=PHP ;小写php为指定处理.php后缀的url请求,冒号后面数字标识对应IIS站点编号,等号右边的大写PHP表示对应的具体处理节[PHP]
[PHP]节中定义对应用于FAST CGI方式的PHP环境,这个方括号[PHP]内的PHP可以自定义,只需与[Types]中描述对应即可。

此外,须将下面两个时间设长些,因Discuz!中对 UCenter 的处理时间相当长(登录大概要10多秒钟):
RequestTimeout=50
ActivityTimeout=90

2.3 IIS 相关配置变更
这一步骤主要参考《IIS6+PHP5 (FastCGI) 安裝攻略》文章相关内容
假设PHP安装路径在 C:\PHP5,但从客户服务器环境及系统更新维护角度讲不建议这样做。

對 C:\PHP5 目錄增加 IIS_WPG 群組的讀取及執行權限。
(沒加這個就會跑出 FastCGI Error)
服务器环境筹建系列 II - PHP在IIS6.0中部署

5. 加入系統環境變數 (讓 extension 及 php.ini 能順利被找到)。
Path=C:\PHP5;
PHPRC=C:\PHP5
服务器环境筹建系列 II - PHP在IIS6.0中部署

6. 開啟 IIS 管理員,如下圖設定。
服务器环境筹建系列 II - PHP在IIS6.0中部署

7. 增加預設首頁 index.php
服务器环境筹建系列 II - PHP在IIS6.0中部署

8. 檢查網頁服務延伸。
(正常的話應該會有這一項,若沒有請自行加入 C:\WINDOWS\system32\inetsrv\fcgiext.dll)
服务器环境筹建系列 II - PHP在IIS6.0中部署


主要需注意:
A. PHP.exe所在目录的可执行权限设定 - 需注意保障客户服务器安全,除非必要不要开启 IIS_WPG 系统默认用户组除了文件夹浏览、读取、执行权限外其他任何权限,特别不能为了简单直接开启系统的 Everyone 权限。
B. 尽量不使用fcgiext.js进行配置,而是直接修改fcgiext.ini配置文件 - 因为客户服务器有时会出于安全考虑关闭了本地cscript脚本的执行服务。


存在(遗留)问题

1. PHP 的文件 log 好像不能启动;

2. PHP 相关优化配置工作没有进行 - 数据库缓存设置、进程内存使用大小限制、上传文件限制等;

3. fcgiext 相关优化配置工作没有进行;

4. 未进行压力测试,需进一步对系统瓶颈进行考察 - 通过Google搜索或压力测试


建议

1. 最好将 Discuz! 和 微博(记事狗)分别放置于不同的应用程序池 - 如BBS和Weibo,以避免同一个w3wp.exe进程内执行的相互影响。
2. 最好将各站点除.php外地其他所有对应处理扩展都删除。
3. 将 IIS 相关优化整理出来。


参考

  1. IIS6+PHP5 (FastCGI) 安裝攻略 -  http://blog.linym.net/archives/264
  2. IIS6+PHP5(ISAPI)安装攻略 -  http://blog.linym.net/archives/240
  3. PHP 配置相关链接

工具

  • PHP -  http://windows.php.net/download/
  • FastCGI for IIS - http://www.iis.net/download/FastCGI