这里介绍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路径根据自己实际位置填写即可。
增加后在httpd.conf进行包含。一般都需要启用虚拟主机支持,所以直接搜索httpd-vhosts.conf取消其前面的注释并在上方包含php配置过来。如下图:
如果不启用多站点虚拟主机支持,那么就直接加加载php配置文件的设置即可。然后在默认站点测试是否能支持php了。
加载后修改httpd.conf中<Directory />到</Directory>内容, Options项增加ExecCGI
修改后如下图:
这里需要演示不同站点不同php版本、目录隔离。所以本文中建立两个站点(apache建立多个站点在文档库有专门文章,这里不再赘述)。
修改conf\extra目录下httpd-vhosts.conf增加两个站点设置。如下图建立了www.milworm.cn和2.milworm.cn两个站点:
完成后重启apache使配置生效。访问测试:
不同站点用不同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版本):
访问测试:
到这里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
所以这里我们直接在站点目录下建立一个.user.ini的文件,内容为:
open_basedir="D:\wwwroot\milworm.cn;C:\Windows\Temp;"
其中D:\wwwroot\milworm.cn更改为你当前站点的实际目录即可。
在设置好后修改.user.ini的权限为只读,并去掉apcche运行账户的删除、写入权限(如果apache运行账户可以随意修改这个文件,那么黑客就能直接修改或者删除该文件达到去除目录限制的目的)
下图分别为加.user.ini和不加.user.ini限制跨站情况下通过webshell对服务器资源的访问情况:
如上图,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