PHP,三win7使用IIS7-8作为PHP运行环境

在Windows Server 2008或2012环境中,nginx和apache都不是最好的web容器。windows自带的IIS才是最好用的WEB容器。这就意味着,如果我们使用windows server作为WEB服务器的操作系统,应该使用IIS作为运行php应用的容器。

1、安装前的准备

请确认服务器Apache服务已被关闭,且无其他服务或程序占用HTTP 80端口。

已安装了PHP。

2、安装IIS服务

(1)打开控制面板选择程序和功能

PHP,三win7使用IIS7-8作为PHP运行环境

(2)选择打开或关闭windows功能

PHP,三win7使用IIS7-8作为PHP运行环境

(5)按照下面的图片,勾选必要功能。出于安全性考虑,建议不要勾选其他非必要功能!!

PHP,三win7使用IIS7-8作为PHP运行环境

PHP,三win7使用IIS7-8作为PHP运行环境

PHP,三win7使用IIS7-8作为PHP运行环境

PHP,三win7使用IIS7-8作为PHP运行环境

3、配置IIS全局参数

(1)打开IIS管理器,开始配置全局参数。

PHP,三win7使用IIS7-8作为PHP运行环境

PHP,三win7使用IIS7-8作为PHP运行环境

(2)网站可以覆盖全局设置中的同名参数,若网站未覆盖全局设置参数,则默认使用全局设置参数。

(3)双击FastCGI 设置,配置FastCgi参数。在IIS7或8中,默认已附带了FastCgi模块,不需另外安装。你自己在网上找的FastCgi模块是给IIS6用的,性能太差!

PHP,三win7使用IIS7-8作为PHP运行环境

(4)IIS支持多个php版本共存,你可以重复下面的步骤,创建多个php版本使用FastCGI模块管理。

(5)在FastCGI 设置界面,点击右侧导航的添加应用程序按钮。

PHP,三win7使用IIS7-8作为PHP运行环境

(6)设置FastCGI管理的应用程序

完整路径:选择或填写php-cgi.exe的存储绝对路径,该文件就在php安装根目录中。此设置完成FastCGI与php CGI对接。

点击环境变量后面的...按钮,设置参数

Name: PHP_FCGI_MAX_REQUESTS ,phpfastcgi最大处理请求数。

Value: 10000 ,表示phpfastcgi最大处理请求数为10000。设置成10000其实是不想让php自己回收线程。

实例最大请求数:指每个php-cgi.exe进程,最多可以处理的请求总数。当一个php-cgi.exe进程累计处理了这个数量的请求,IIS将对其进行回收。

最大实例数:指最多允许有多少个php-cgi.exe进程,默认是4个,对于生产环境是太少了!

如何设置PHP_FCGI_MAX_REQUESTS实例最大请求数最大实例数三个参数才能有效提升性能?

实例最大请求数:必须小于或等于PHP_FCGI_MAX_REQUESTS,只有这样,才能阻止php自主回收php-cgi.exe进程。

最大实例数:每个php-cgi.exe大约使用7-15M内存,按照你的内存分配情况,设置最大实例数

实例最大请求数:指每个php-cgi.exe进程,最多可以处理的请求总数。当一个php-cgi.exe进程累计处理了这个数量的请求,IIS将对其进行回收,所以此值不要设置的过大,几百到五千均可,还是看服务器压力情况决定。

PHP,三win7使用IIS7-8作为PHP运行环境

(7)设置默认页面。

若不添加index.php作为默认页面,那么当你的目录中有index.php时,也必须按照http(s)?/domain.name.com/directory/index.php的方式才能被访问到。如果你的URL没有包含index.php,那么就是404找不到文件。

PHP,三win7使用IIS7-8作为PHP运行环境

添加“index.php”。

PHP,三win7使用IIS7-8作为PHP运行环境

4、网站设置

4.1、默认网站的配置

IIS默认有一个默认网站,这个默认网站是指与所有网站都匹配不上,则对外提供默认网站。按照下图的指示进行配置。

PHP,三win7使用IIS7-8作为PHP运行环境

物理路径:默认网站源码的存储位置

4.2、多网站配置:同IP同端口配置多个域名

多个域名,按照下图指示重复操作。

PHP,三win7使用IIS7-8作为PHP运行环境

网站名称:便于你记忆的名称。建议就是网站主机名或域名

物理路径:网站源码的存储位置

网站主机名:域名。如www.test.com或secondary.name.test.com

4.3 网站的PHP设置

IIS支持多个网站使用不同的PHP版本。比如A网站使用PHP5.4,B网站使用PHP5.6,C网站使用PHP7.X。这给我们带来了极大的便利,既能充分使用最新的PHP技术以提高性能,又能兼容古老的PHP版本。

配置之前,请注意:你必须已经按照“3、配置IIS全局参数”的相关步骤,将php-cgi.exe注册给了FastCGI模块!

默认网站与新建的网站配置方式相同。按照下图的指示进行配置。

(1)选中要配置的网站,双击“处理程序映射”。

PHP,三win7使用IIS7-8作为PHP运行环境

(2)按照下图的指示完成配置

PHP,三win7使用IIS7-8作为PHP运行环境

请求路径:*.php,表示所有php文件都使用此处理程序执行处理。

模块:选择FastCgiModule,表明使用FastCGI模块处理此类程序。

可执行文件:选择php-cgi.exe的存储路径(在php安装目录根目录下)。如果你在目录中看不到,注意右下角有个文件过滤,默认是*.dll,改成*.exe即可。指明FastCgi模块的挂接程序。这里你选择的是那个版本的php-cgi.exe,那么这个网站就是哪个版本的php进行解析处理。

名称:填写一个容易识别的名称,在列表中显示,容易找到。推荐写php版本:如php-5.4或php-7.1等

5、系统环境变量

我们不再使用apache作为PHP的容器,所以要删除apache服务。

现在IIS通过fastcgi调用php的php-cgi.exe进行网络请求处理,在php-cgi.exe执行处理时,php-cgi.exe需要使用其所依赖的其他动态链接库(dll),这样就要求我们将php所依赖的动态链接库放入php的根目录(与php-cgi.exe在同一个目录)下,主要包括oracle客户端的dll,sqlserver客户端的dll等,不含php的扩展(php扩展放在php的扩展文件夹中,扩展文件夹在php.ini中设置)。

6、正式环境下的IIS用户权限管理

在生产环境下,我们决不能向IIS提供管理员权限。安装IIS后,会自动建立一个IUSER用户和IIS_IUSRS用户组。

首先,我们要确认IIS使用的用户是否为Administrator(不能使用Administrator作为IIS的用户,只能使用IUSER作为IIS的用户)。

6.1 更改IIS的默认用户。

在全局参数设置和网站(含默认网站)设置中的方式是一致的。只不过全局设置应用于所有网站,网站设置覆盖全局设置,用于本网站。

(1)双击“身份验证”

PHP,三win7使用IIS7-8作为PHP运行环境

(2)按照下图指示,修改“已启用”的“匿名身份认证”,查看是否为IUSR,若非IUSR,在用户名处填入IUSR,密码留空,确认保存。

PHP,三win7使用IIS7-8作为PHP运行环境

7、PHP配置

修改php.ini文件,打开cgi功能,按照如下指示修改(本文未介绍与cgi功能无关的其他设置)。

;cgi.force_redirect = 1取消注释,并将值修改为0,即cgi.force_redirect = 0

;cgi.fix_pathinfo=1取消注释,即cgi.fix_pathinfo=1

;fastcgi.impersonate = 1取消注释,即fastcgi.impersonate = 1

PHP文件上传临时存储路径:将upload_tmp_dir = /tmp修改为一个合适的路径,此路径是php上传文件的临时存储路径,如upload_tmp_dir = d:/PHPUPLOADTEMP

若PHP使用文件形式存储Session信息,则需要修改PHP Session设置。

session.save_handler = files,使用文件存储Session信息。

session.save_path =Session文件的存储位置,如session.save_path = "D:/php_session"

若使用文件记录PHP日志,则需要修改PHP的日志配置

error_log 修改为 error_log = d:/php_log/error.log,设置日志文件的存储位置

log_errors 修改为 log_errors = On,设置日志开启

error_reporting按照实际需要修改,正式环境修改为error_reporting = E_ALL,设置错误报告级别。

8、NTFS权限

向IUSR用户及IIS_IUSRS用户组授予以下目录的列出文件夹内容读取2项权限,其他权限均不得赋予!!!

IIS网站的物理目录(见 4、网站设置)

程序上传文件的存储目录(由php程序指定)

PHP上传文件的临时存储目录(见 7、PHP配置)

向IUSR用户及IIS_IUSRS用户组授予以下目录的列出文件夹内容读取写入3项权限,其他权限均不得赋予!!!

PHP的Session文件存储目录(见 7、PHP配置)

PHP的日志文件存储目录(见 7、PHP配置)

9、关闭IIS中的无用但可能有漏洞的内容

删除经典ASP程序池,按照下图的指示操作:

PHP,三win7使用IIS7-8作为PHP运行环境

将所有PHP程序池的.net framework版本修改为无托管代码,如下图所示:

PHP,三win7使用IIS7-8作为PHP运行环境

10、已知的问题

PHP使用FastCGI无法正确处理 分块请求 (请求头中包含:transfer-encoding: chunked) ,导致超时。

Request #51191 Request body is 0-size when chunked requests are used

#50210 apache: PHP won’t parse multipart/form-data if it was originally chunk encoded.

更多(打开http://bugs.php.net,搜索 chunked fastcgi)