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)打开控制面板选择程序和功能
(2)选择打开或关闭windows功能
(5)按照下面的图片,勾选必要功能。出于安全性考虑,建议不要勾选其他非必要功能!!
3、配置IIS全局参数
(1)打开IIS管理器,开始配置全局参数。
(2)网站可以覆盖全局设置中的同名参数,若网站未覆盖全局设置参数,则默认使用全局设置参数。
(3)双击FastCGI
设置,配置FastCgi参数。在IIS7或8中,默认已附带了FastCgi模块,不需另外安装。你自己在网上找的FastCgi模块是给IIS6用的,性能太差!
(4)IIS支持多个php版本共存,你可以重复下面的步骤,创建多个php版本使用FastCGI模块管理。
(5)在FastCGI
设置界面,点击右侧导航的添加应用程
序按钮。
(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将对其进行回收,所以此值不要设置的过大,几百到五千均可,还是看服务器压力情况决定。
(7)设置默认页面。
若不添加index.php
作为默认页面,那么当你的目录中有index.php时,也必须按照http(s)?/domain.name.com/directory/index.php的方式才能被访问到。如果你的URL没有包含index.php,那么就是404找不到文件。
添加“index.php”。
4、网站设置
4.1、默认网站的配置
IIS默认有一个默认网站,这个默认网站是指与所有网站都匹配不上,则对外提供默认网站。按照下图的指示进行配置。
物理路径:默认网站源码的存储位置
4.2、多网站配置:同IP同端口配置多个域名
多个域名,按照下图指示重复操作。
网站名称:便于你记忆的名称。建议就是网站主机名或域名
物理路径:网站源码的存储位置
网站主机名:域名。如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)选中要配置的网站,双击“处理程序映射”。
(2)按照下图的指示完成配置
请求路径:*.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)双击“身份验证”
(2)按照下图指示,修改“已启用”的“匿名身份认证”,查看是否为IUSR
,若非IUSR
,在用户名处填入IUSR
,密码留空,确认保存。
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程序池的.net framework
版本修改为无托管代码
,如下图所示:
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.