这里介绍windows下apache配置fastcgi方式的php.

在以前的文章和培训视频中介绍的是以php5_module加载php目录dll文件方式支持php.

windows下apache配置php: http://docs.waterbear.pw/534.html

apache虚拟主机配置注意事项:http://docs.waterbear.pw/537.html

apache安全要点:http://docs.waterbear.pw/541.html

以上内容涵盖了配置php和虚拟主机参考,相同的内容这里不再做介绍。

为什么会用到fastcgi运行php?

1.不同站点使用不同php版本需求

2.php>5.2加载Zend Guard Loader.

对于需求1.如果用mod方式加载php模块,每个站点是不能单独再重新加载的(php的dll只能加载一次),所以同一个apache下不同站点的php设置是一样的,这样就不能满足不同站点使用不同php版本。

对于需求2:php>5.2时Zend Guard Loader只能用到非线程安全php,所以在以前用php5_module加载线程安全的php就不能配置加载zend扩展。

在本文中使用mod_fcgid(http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html)模块来支持php.
apache默认是没有这个模块的,下载后进行加载即可。

apache2.4和mod_fcgid2.3.9可以到https://www.apachelounge.com/download/下载
我这里使用apche2.2+mod_fcgid-2.3.6. 下载地址:http://kmsoft.landui.com:81/apache/

安装完apache后解压mod_fcgid复制modules中文件到apache目录下modules中。

修改apache配置文件加载mod_fcgid.so。为了方便管理和维护,我这里直接写一个单独的配置文件并在httpd.conf中包含该文件。我这里在conf\extra新增一个php.conf文件内容如下:

#加载mod_fcgid
LoadModule fcgid_module modules/mod_fcgid.so
#设置apache如何处理php文件
AddHandler fcgid-script .fcgi .php
#实例最大请求
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
#每个进程的最大请求数
FcgidMaxRequestsPerProcess 1000
#启动的最大进程数
FcgidMaxProcesses 15
#进程超时时间
FcgidIOTimeout  120
FcgidIdleTimeout  120
#添加mime支持php
AddType application/x-httpd-php .php
#php配置文件路径
FcgidInitialEnv PHPRC "C:/php/5.3"
#php-cgi.exe路径
FcgidWrapper "C:/php/5.3/php-cgi.exe" .php

其中php配置文件路径和php-cgi.exe路径根据自己实际位置填写即可。

1.jpg

增加后在httpd.conf进行包含。一般都需要启用虚拟主机支持,所以直接搜索httpd-vhosts.conf取消其前面的注释并在上方包含php配置过来。如下图:

2.jpg


如果不启用多站点虚拟主机支持,那么就直接加加载php配置文件的设置即可。然后在默认站点测试是否能支持php了。

加载后修改httpd.conf中<Directory />到</Directory>内容,  Options项增加ExecCGI

修改后如下图:

3.jpg

4.jpg


这里需要演示不同站点不同php版本、目录隔离。所以本文中建立两个站点(apache建立多个站点在文档库有专门文章,这里不再赘述)。

修改conf\extra目录下httpd-vhosts.conf增加两个站点设置。如下图建立了www.milworm.cn和2.milworm.cn两个站点:

5.jpg

完成后重启apache使配置生效。访问测试:

6.jpg


不同站点用不同php版本。

把上面的php.conf中以下内容注释或删除:

#php配置文件路径
FcgidInitialEnv PHPRC "C:/php/5.3"
#php-cgi.exe路径
FcgidWrapper "C:/php/5.3/php-cgi.exe" .php

在站点的配置文件中单独设置php配置文件路径和php-cgi.exe进程路径。如下图,一个站点使用php5.3另外一个使用php5.4(类似IIS上使用phpmanager设置全局php版本与单个站点设置php版本):

7.jpg

访问测试:

8.jpg

9.jpg


到这里fastcgi配置php和不同站点使用不同php已经完成。


需要考虑的内容,fastcgi方式如何限制每个站点目录防止跨站。


在http://docs.landui.com/archives/137.html中我们使用在apache配置文件中直接定义php_admin_value open_basedir来限制跨站。由于这里php是单独的进程,不能再直接从apache配置文件修改而是需要从php配置文件修改,如果是每个站点一个php配置文件,那么我们直接修改该配置文件增加open_basedir设置,但是更多的情况下,我们都是多个站点共用一个php配置文件,所以需要每个站点加载一个自己的配置。如何实现呢?

从php5.3开始cgi/fastcgi方式运行的php将会加载站点目录下.user.ini的设置。官方说明:

http://php.net/manual/zh/configuration.file.per-user.php

10.jpg

所以这里我们直接在站点目录下建立一个.user.ini的文件,内容为:

open_basedir="D:\wwwroot\milworm.cn;C:\Windows\Temp;"

其中D:\wwwroot\milworm.cn更改为你当前站点的实际目录即可。

在设置好后修改.user.ini的权限为只读,并去掉apcche运行账户的删除、写入权限(如果apache运行账户可以随意修改这个文件,那么黑客就能直接修改或者删除该文件达到去除目录限制的目的)

11.jpg

下图分别为加.user.ini和不加.user.ini限制跨站情况下通过webshell对服务器资源的访问情况:

12.jpg

13.jpg

14.jpg

如上图,milworm.cn加了限制,只能列出自己站点目录,而2.milworm.cn没有限制,把C、D、E都完整列出了。

apache安全设置三个要点:

1.对apache服务降权。

2.修改php.ini中disable_functions对危险函数禁用

3.open_basedir限制站点目录防止跨站

本文apache配置文件:fastcgi-conf.zip

fastcgi的php如果由于需要加载zend的原因,使用非线程安全版本:http://kmsoft.landui.com:81/php/PHP5.2-5.6.rar