• 欢迎访问水熊虫网站,这里是我个人的工作博客,内容大多是遇到问题完善后,会在这里进行总结归纳内容! QQ群
  • 网站导航中的友情链接专栏上线,更新的都是自己这三年整理的一些东西,感兴趣可以看看!
  • 你所浪费的今天,是昨天死去的人奢望的明天。你所厌恶的现在,是未来的你回不去的曾经!

♡winodws+apache+fastcgi_php环境搭建

整理归纳 WaterBear 3年前 (2017-08-14) 413次浏览 已收录 扫描二维码

winodws+apache+fastcgi_php环境搭建(fastcgi_php指apache使用mod_fcgid.so模块加载php目录下php-cgi.exe文件方式支持php)

请注意环境搭建要求与版本环境支持:

Apache 2.2 win32  VC10 和mod_fcgid模块压缩包下载 :http://www.apachelounge.com/download/win32/

Apache 2.2 win64  VC10 和mod_fcgid模块压缩包下载 :http://www.apachelounge.com/download/win64/

VC10 需要Visual C++ 2010 支持:https://www.microsoft.com/en-us/download/details.aspx?id=13523

Apache 2.4 binaries VC11和mod_fcgid模块压缩包下载 :http://www.apachelounge.com/download/VC11/

Apache 2.4 binaries VC14和mod_fcgid模块压缩包下载 :http://www.apachelounge.com/download/

VC11需要Visual C++ Redistributable for Visual Studio 2012 支持 :https://www.microsoft.com/en-us/download/details.aspx?id=30679

VC14需要Visual C++ Redistributable for Visual Studio 2015 支持 :https://www.microsoft.com/en-us/download/details.aspx?id=53840

前言:为什么会用到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.

安装前的准备:

我这里使用apche2.2+mod_fcgid-2.3.6. 下载地址:http://kmsoft.landui.com:81/apache/     备用地址:http://archive.apache.org/dist/httpd/binaries/win32/

下载文件名为:httpd-2.2.25-win32-x86-no_ssl.msi、mod_fcgid-2.3.6-win32-x86.zip。

apache2.4和mod_fcgid2.3.9可以到https://www.apachelounge.com/download/下载,请注意apache版本、VC版本、32/64bit的区别下载对应mod_fcgid组件。如下图所示:

①中需要注意VC10需要Visual C++ 2010运行库的支持。如下图所示使用的是apache2.2 Win64 VC10,你未安装需要先安装Visual C++ 2010 64bit。

②中下载时请在apache对因下载页面下载配套相同位数、相同VC运行库版本编译组件进行安装,如果不配套,可能加载mod_fcgid模块后apache启动会引起版本不配套或不兼容的报错。

♡winodws+apache+fastcgi_php环境搭建

一、Apache安装:(此处使用apache2.2安装包作为演示)

apache2.2有安装包和压缩包,可直接安装使用.或手动配置。Apache2.4是压缩包,需要注册服务。

1.解压后找到conf/http.ini文件中的Define SRVROOT修改路径如:(安装包跳过此步骤)
ServerRoot "D:/Apache2.2"
2.可以在Apache安装目录的bin子目录下,使用如下命令将Apache安装为Windows NT服务:(安装包跳过此步骤)
httpd -k install  #安装
httpd -k install -n "服务名"   #指定服务名称的安装
httpd -k install -n "服务名" -f "c:\files\my.conf"    #指定服务名称和配置文件的安装

Apache服务常用命令

httpd -n "服务名" -t   #检查指定服务名称的配置文件的正确性
httpd -k stop     #停止
httpd -k start     #启动
httpd -k restart   #重启
httpd -k uninstall  #卸载

也可使用控制台命令:(不限定文件路径,但需要服务已注册)

net start apache2.2      #启动服务
net stop apache2.2      #停止服务
net restart apache2.2      #重启服务

3.测试apache是否正常运行

cmd命令:service.msc    查看Apache服务是否正常启用
cmd命令:netstat -an | find “80”    查看80端口是否监听
添加Apache程序 防火墙例外
打开浏览器访问http://localhost  是否显示:It's Work。

二、Apache下PHP模块配置
步骤一、apache安装成功后,将mod_fcgid的压缩包解压,将压缩包中modules文件夹内的文件复制apache目录下modules中。并在apache的conf\extra文件夹内创建一个httpd-mod_fcgid.conf文件,用于存放apache加载mod_fcgid模块和PHP的配置。(httpd-mod_fcgid.conf文件名可自定义)

httpd-mod_fcgid.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 "D:/PHP_NTS/5.2"
#php-cgi.exe路径
FcgidWrapper "D:/PHP_NTS/5.2/php-cgi.exe" .php

 

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

步骤二:修改http.conf文件,将httpd.conf中<Directory />到</Directory>内容,  Options项增加ExecCGI,Deny from all修改为Allow from all。

如果没有增加ExcecCGI,将会出现403错误,即没有权限访问。

<Directory />
    Options FollowSymLinks ExecCGI
    AllowOverride None
    Order deny,allow
    Allow from all
</Directory>
<Directory "D:/Apache2.2/htdocs">
    Options Indexes FollowSymLinks ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<IfModule dir_module>
         DirectoryIndex index.php index.html index.htm
</IfModule>

步骤三:增加配置文件。

在httpd.conf添加包含php mod_fcgid配置文件,这里包含之前配制好的httpd-mod_fcgid.conf文件。

#php mod_fcgid的加载文件
Include conf/extra/httpd-mod_fcgid.conf
步骤四:修改php.ini文件设置

[v_organge]1、时区设置:[/v_organge]

date.timezone = Asia/Shanghai

[v_organge]2、禁用函数:[/v_organge]

disable_functions =exec,system,passthru,popen,pclose,shell_exec,proc_open,dl,chmod

[v_organge]3、常用扩展开启[/v_organge]

;以下常用组件取消分号注释(开始)
extension=php_bz2.dll
extension=php_curl.dll
extension=php_gd2.dll
extension=php_mbstring.dll
extension=php_mcrypt.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_openssl.dll
extension=php_zip.dll

[v_organge]4、其他设置[/v_organge]

short_open_tag = On ;短标签开启
extension_dir = "D:\PHP_NTS\5.2\ext" ;组件存放路径更改
post_max_size = 20M  ;POST发送最大数据包限制更改,且必须post_max_size ≥ upload_max_filesize 根据具体情况修改大小
upload_max_filesize = 20M  ;上传文件大小限制更改,根据具体情况修改大小
三、Apache下建立虚拟主机配置

引入apache虚拟主机配置文件,这里单独建立vhost文件夹为每个站点独立创建一个配置文件(便于后期维护)。

#虚拟主机站点配置文件加载
Include conf/vhost/*.conf

[v_organge]其中windows下虚拟主机配置模板如下:(longtao1为站点根目录文件夹)[/v_organge]

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot "D:\wwwroot\longtao1"
    ServerName host1.longtao.pro
    ServerAlias www.host1.longtao.pro
    ErrorLog "logs/host1.longtao.pro-error.log"
    CustomLog "logs/host1.longtao.pro-access.log" common
</VirtualHost>

[v_organge]不同站点使用不同php版本。需要把上面的httpd-mod_fcgid.conf文件中以下内容注释或删除:[/v_organge]

#php配置文件路径
FcgidInitialEnv PHPRC "D:/PHP_NTS/5.2"
#php-cgi.exe路径
FcgidWrapper "D:/PHP_NTS/5.2/php-cgi.exe" .php
同时在虚拟主机配置模板中增加内容后,完整模板如下:
NameVirtualHost *:80
<VirtualHost *:80>
    #php配置文件路径
    FcgidInitialEnv PHPRC "D:/PHP_NTS/5.2"
    #php-cgi.exe路径
    FcgidWrapper "D:/PHP_NTS/5.2/php-cgi.exe" .php
      
    ServerAdmin [email protected]
    DocumentRoot "D:\wwwroot\longtao3"
    ServerName host3.longtao.pro
    ErrorLog "logs/dummy-host3.longtao.pro-error.log"
    CustomLog "logs/dummy-host3.longtao.pro-access.log" common
</VirtualHost>

[v_organge]添加.user.ini 文件限制跨站访问。[/v_organge]
.user.ini 的文件内容如下:

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

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

在设置好后修改.user.ini的权限为只读,并去掉apcche运行账户的删除、写入权限

四、Apache服务降权(权限设置仅供参考)

步骤一、使用cmd创建apache用户名

net user apache apache_password /add
net localgroup users apache /del

 

设置添加的用户属性为密码永不过期。

♡winodws+apache+fastcgi_php环境搭建

步骤二、更改服务启动用户名为apache用户。

♡winodws+apache+fastcgi_php环境搭建

步骤三、添加apache程序对应的启动用户apache及权限设置。

安装apache的D盘,apache用户仅仅需要读取权限

D:\Apache2.2作为apache的安装根目录需要“列出文件夹内容、读取”的权限

bin、cgi-bin、modules目录为:“列出文件夹内容、读取和执行、读取”的权限

conf、error、htdocs、icons、manual目录为:“列出文件夹内容、读取”的权限

logs目录为:“列出文件夹内容、读取、写入”的权限

D:\wwwroot为网站存放目录,apache用户需要“读取、写入”的权限。(如果需要不定时上传文件就需要写入权限,如果长期不上传可删除写入权限)

目录结构如图:

♡winodws+apache+fastcgi_php环境搭建

步骤四、重启apache服务,测试服务是否正常启动。

修改apache程序启动用户为apache后,如启动失败需要重新检测apache程序目录配置权限是否不够或遗漏配置的的情况。

具体无法正常启动可通过计算机管理的日志查看器进行检查。(如下图)

♡winodws+apache+fastcgi_php环境搭建

需要注意的问题:常见问题2和问题4

常见问题
1:Invalid command 'Order', perhaps misspelled or defined by a module not included in the server configuration。

是因为LoadModule authz_host_module modules/mod_authz_host.so这个模块没有加载

2:Invalid command 'php_admin_value', perhaps misspelled or defined by a module not included in the server configuration

原因:配置文件里面没有LoadModule php5_module   modules/libphp5.so,而虚拟主机的配置文件中加载php_admin_value open_basedir /usr/vhome/x/y/z/xyz.com/:/usr/vhome/tmp 的设置。

3:过滤某个时间段的日志:例如我想过滤01:57—02:18的日志

cat access.log   | grep -P '(01:5[7-9]|02:0[0-9]|02:1[0-8])'

4:apache重启报错,事件查看器错误描述如下:

Wrapper C:/Program cannot be accessed: (720002)\xcf\xb5\xcd\xb3\xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xce\xc4\xbc\xfe\xa1\xa3
FcgidWrapper "C:/Program Files/PHPServer/Bin/PHP/php-cgi.exe"导致了这个错误的发生。

原因:如果FcgidWrapper 后面的路径有空格,会导致路径被截取到第1个空格的位置,从而无法正常运行。Apache 以fastcgi mod_fcgid方式PHP时出现 Wrapper D:/Program cannot be accessed: (720002)\xcf\xb5\xcd\xb3\xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xce\xc4\xbc\xfe\xa1\xa3 是因为PHP的安装路径中包含空格,如D:\Program Files\PHPServer\Bin\PHP,这是Apache fastcgi mod_fcgid的一个Bug,只要将PHP安装到一个路径没有空格的目录即可,如F:\Web\PHPServer\Bin\PHP,也可以在每个空格前加反斜线\,如"C:\Program\ Files\php\php-cgi.exe",如果路径包含中文字符等非英文字符,那么必须将配置文件转码为utf-8,否则也会出错。详见:Apache facgid FcgidWrapper Wrapper cannot be accessed.

总结一下该问题注意事项:

PHP安装路径如果包含空格,需要在每个空格前加一个\符号。(已实际测试该办法无效,强烈建议使用无空格的路径)

路径中的非英文字符时必须转码为utf-8。

原则上建议路径不要包含空格或中文字符。(强烈建议使用英文路径,本人使用英文路径,中文未尝试过)

请将以下配置中的路径修改为你电脑上面正确的路径。

参考文章:http://www.51-n.com/t-4335-1-1.html


WaterBear , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:♡winodws+apache+fastcgi_php环境搭建
喜欢 (0)
[[email protected]]
分享 (0)