从源码安装apache httpd,并加载对php的支持

来源:互联网 发布:php ext skel 编辑:程序博客网 时间:2024/05/17 00:56
要完成如题所述目标,分两步走:首先从源码安装apache httpd,然后加载对php的支持。
一、从源码安装apache httpd
1、首先下载最新的httpd包,这里使用的是httpd-2.4.16.tar.gz
2、解压下载的httpd包,进入解压后目录

3、根据[1],要安装httpd包,首先需要解决3个依赖:APR,APR-Util和PCRE。

1)首先解决APR依赖。下载最新的APR包,将其解压得到一个目录,将该目录重命名为apr。将apr目录整个移入httpd解压后目录的srclib子目录中。[1]

2)其次解决APR-Util依赖。下载最新的APR-Util包,将其解压得到一个目录,将该目录重命名为apr-util。将apr-util目录整个移入httpd解压后目录的srclib子目录中。[1]
3)最后解决PCRE依赖。下载最新的PCRE包,假如PCRE包最终的“安装到目录”为"/home/dsl/usr",那么执行以下命令安装PCRE包
prefix=/home/dsl/usrexec_prefix=/home/dsl/usroldincludedir=$prefix/oldinclude./configure --prefix=$prefix --exec-prefix=$exec_prefix --oldincludedir=$oldincludedirmakemake install
在执行以上命令后,在"/home/dsl/usr/bin"中有个"pcre-config"程序。修改PATH环境变量为:PATH=$PATH:/home/dsl/usr/bin,那么在安装httpd的时候就能够找到这个"pcre-config"程序,从而解决了对PCRE的依赖。
4、假如httpd包最终的“安装到目录”为"/home/dsl/usr",那么执行以下命令,安装httpd
prefix=/home/dsl/usrexec_prefix=/home/dsl/usroldincludedir=$prefix/oldinclude./configure --prefix=$prefix --exec-prefix=$exec_prefix --oldincludedir=$oldincludedirmakemake install


二、加载对php的支持

2.1、加载php模块
本文使用的是php5,具体的php5模块路径为"/usr/lib/apache2/modules/libphp5.so",使用"LoadModule"指令加载php5模块的具体命令是:
LoadModule php5_module /usr/lib/apache2/modules/libphp5.so
在httpd.conf文件中加入以上语句即可。
2.2、使得识别php文件
要使得httpd可以识别php文件,可以在httpd.conf中加入如下内容(摘自网上)。
<FilesMatch ".+\.ph(p[345]?|t|tml)$">    SetHandler application/x-httpd-php</FilesMatch><FilesMatch ".+\.phps$">    SetHandler application/x-httpd-php-source    # Deny access to raw php sources by default    # To re-enable it's recommended to enable access to the files    # only in specific virtual host or directory    Order Deny,Allow    Deny from all</FilesMatch># Deny access to files without filename (e.g. '.php')<FilesMatch "^\.ph(p[345]?|t|tml|ps)$">    Order Deny,Allow    Deny from all</FilesMatch># Running PHP scripts in user directories is disabled by default# # To re-enable PHP in user directories comment the following lines# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it# prevents .htaccess files from disabling it.<IfModule mod_userdir.c>    <Directory /home/*/public_html>        php_admin_flag engine Off    </Directory></IfModule>
备注:以上需要加到httpd.conf文件中的内容可以单独放置到文件中,然后再在httpd.conf文件中通过"IncludeOptional"指令进行相应文件的导入。


三、排错

运行安装得到的httpd的方式一般是通过使用安装得到的apachectl脚本,使用该脚本可以设置好运行httpd运行所需要用到的环境变量。运行httpd的命令如下:
apachectl start
3.1、PHP模块不支持多线程
运行"apachectl start",发现出现如图1错误。

                                                                                                     图1


根据[2][3],MPM是Apache加载的一个模块,它主要用来处理并发多请求问题。有很多种MPM实现:worker,event,prefork,winnt等。worker MPM使用多线程的方式来解决并发多请求问题,prefork MPM使用多进程的方式来解决并发多请求问题。安装httpd的时候默认配置使用worker MPM。PHP分为支持多线程的PHP版本和不支持多线程的PHP版本,当前安装的PHP为不支持多线程的版本,因此报出以上错误。
有两种解决方案:用支持多线程的PHP版本替换当前版本,而由于即便是支持多线程的PHP版本对多线程的支持也不是很好,因而不选用这种方案[4]。第2种方案是在安装httpd的时候配置使用prefork MPM,具体是在运行httpd的configure脚本时,加上"--with-mpm=prefork"参数。
根据第2种方式重新安装httpd,再次运行"apachectl start",不再出现图1错误。
3.2、访问某个目录,不会自动访问该目录下的主页文件
现有一个PHP项目目录,名称为ganglia,将其复制到apache的Web项目目录下,通过访问"http://localhost/ganglia",出现如图2的结果,即并没有自动加载该项目下的"index.php"文件。
                                                            图2


要解决以上问题,需要设置httpd.conf中的两处地方:
1)加载mod_dir.so模块
要解决以上问题,需要mod_dir.so模块的支持,通过以下命令,加载mod_dir.so模块。
LoadModule dir_module modules/mod_dir.so
2)扩展主页文件的名称集合

默认配置中,只认为名称为"index.html"的才为主页文件,现在需要增加"index.php"名称。具体是配置如下片段:

#如果原先存在,在原先基础上修改<IfModule dir_module>    DirectoryIndex index.html index.php</IfModule>

以上实践中,程序以root用户身份运行,如果想以普通用户身份运行,可参考《以普通用户运行Ganglia监控框架》。


参考文献:
[1]http://httpd.apache.org/docs/2.4/install.html
[2]https://httpd.apache.org/docs/2.2/mpm.html

[3]https://httpd.apache.org/docs/2.2/mod/

[4]http://stackoverflow.com/questions/1623914/what-is-thread-safe-or-non-thread-safe-in-php

[5]http://blog.csdn.net/dslztx/article/details/49097977

0 0
原创粉丝点击