这篇文章是 linux下用源代码编译apache+mysql+php应用环境 的一部分,文章的其它部分请参考:
linux下用源代码编译apache+mysql+php应用环境
linux下用源代码编译mysql(基本步骤)
linux下用源代码编译mysql(完整步骤)
linux下用源代码编译php
apache-httpd部分。apache-httpd源代码的版本是:httpd-2.2.10.tar.gz

apache的编译安装与mysql大同小异,可能许多朋友已经开始跃跃欲试了,请稍微冷静一下,哪怕你以前曾经编译过apache,也最好在新版本编译之前查看一下configure 脚本的参数,有助于你及时了解新版本是否包含了新的功能,以及在参数选项上是否有变化:

./configure --help 

为了安全起见,apache服务同样需要以特定的用户身份去运行。在不同的linux发行版中,apache特定用户的名字并不一致,有可能是www,httpd,或者apache,查找你的系统中是否有apache的用户存在,一个简单的grep命令就可以做到:

grep -in "www\|httpd\|apache" /etc/passwd /etc/group

参数说明如下:
-i 忽略大小写 -n 输出行号 
"www\|httpd\|apache" 同时搜索包含这三个单词的行。单词之间用\|分隔,并且两端要加引号。
/etc/passwd /etc/group 同时在这两个文件中检索,并列出全部结果。

如果结果中有输出(用户名+组),那么不需要创建,没有,则需要创建。

groupadd -r -p apache22 apache
useradd -c "apache daemon" -r -s /bin/false -d /srv/local -g apache -p apache22 apache 

接下来,开始我们对apache的编译,在正式开始之前,我们还需要介绍一些有关的概念。

使用apache源码中自带的apr(Apache可移植运行库)和apr-util(apu):apr和apr-util包含在Apache-httpd的发行源代码中,并且在绝大多数情况下使用都不会出现问题。当然,如果apr或apr-util的1.0或1.1版本已经安装在你的系统中了,则必须将你的apr/apr-util升级到1.2版本,或者将httpd单独分开编译。要使用发行源代码中自带的apr/apr-util源代码进行安装,你必须手动完成,假设当前路径在apache源代码展开的 httpd-2.2.10目录下:

编译和安装 apr
cd srclib/apr
./configure –prefix=/usr/local/apr-httpd/ &&make &&make install

编译和安装 apr-util
cd ../apr-util
./configure --prefix=/usr/local/apr-util-httpd/ --with-apr=/usr/local/apr-httpd/
make &&make install

配置 httpd
cd ../../
./configure --with-apr=/usr/local/apr-httpd/ --with-apr-util=/usr/local/apr-util-httpd/

注*:以上方法摘自apache2.2手册,其中的编译指令我已经一一确认过。

关于DSO:apache对DSO(Dynamic Shared Objects,动态共享对象)的支持是通过mod_so模块来实现的,按apache手册中的介绍,mod_so模块必须被静态编译到apache内部,否则apache的DSO支持将无法实现。被编译成DSO的模块可以在apache的配置文件httpd.conf中通过LoadModule指令加载。

./configure --enable-so

使用DSO支持可以方便你灵活的定制apache,在基本编译中,只需要编译core,mod_so等少数几个模块即可,当以后需要启用apache模块时,可以在不重新构建apache的情况下,对DSO模块单独编译。但是,必须注意的是,DSO模块的使用,将使apache服务器的启动速度慢20%,因为加载器要做标志解析。而服务器运行时的速度也要慢5%左右。

关于apxs:
apache2.2手册中有这样的介绍:“apxs(APache eXtenSion)可以在Apache源代码树之外编译基于DSO的模块,从而简化了Apache DSO模块的建立过程。”简而言之,apxs提供了一种方便自行编译第三方apache模块的工具,可以使你在不需要重新构建apache的情况下,对第三方模块进行编译。
但是,需要特别指出的是,使用apxs的前提条件为,apache安装要具备include目录,否则会编译失败。并且,由于apxs采用的是perl脚本,所以,如果想让apxs能够正常使用,你的系统需要包含perl的安装(不过除非某些特别的系统,考虑到perl与linux的“亲密性”,perl总会被默认安装)

DSO模块的编译方法:我再次声明,如果需要使用DSO模块,你需要在编译apache时使用—enable-so参数把DSO支持静态编译到apache,否则可能不会得到预期的结果。
不过,如果你明确指定一个模块使用DSO的形式加载,即,使用:

./configure –enable-module_name=shared      //-module_name用真实模块名替代

类似参数的话,那么编译时会自动将DSO支持静态编译进httpd(apache服务守护进程文件)。
下面介绍编译DSO模块的几种方法:

1. 编译并安装已发布的Apache模块,比如编译mod_foo.c为mod_foo.so的DSO模块:
./configure --prefix=/path/to/install –enable-foo=shared

2. 编译并安装第三方模块,比如编译mod_foo.c为mod_foo.so的DSO模块:
./configure --add-module=module_type:/path/to/3rdparty/mod_foo.c –enable-foo=shared

3. 配置Apache以便以后安装共享模块:
./configure –enable-so

4. 用apxs在Apache源码树以外编译安装第三方模块,比如编译mod_foo.c为mod_foo.so的DSO模块:
cd /path/to/3rdparty
apxs -c mod_foo.c
apxs -i -a -n foo mod_foo.la

共享模块编译完毕后,必须在httpd.conf中用LoadModule指令使Apache启用该模块。

关于模块类型:
apache模块有三种类型-基本模块、扩展模块和实验模块,有关模块的具体分类请查阅apache手册中有关configure 脚本介绍部分,需要注意的是,基本模块是默认包含的,使用参数

./configure --enable-modules=most \
            --enable-shared=all \
            --disable-MODULE_NAME

这条指令把基本模块静态编译到httpd,启用了对扩展模块实验模块的支持,并且可以明确指定要禁用的基本模块。虽然—disable-MODULE_NAME只对基本模块有效,但是由于只是启用了对扩展模块和实验模块的支持,并没有实际编译他们。以后需要用到那些扩展和实验模块时,可以再行编译。

./configure --enable-modules=MODULE-LIST
./configure --enable-MODULE_NAME=static
./configure --enable-MODULE_NAME=shared

这些指令比较灵活,可以根据需要搭配,除了特别指定的模块外,基本模块默认会静态编译到httpd。
--enable-modules=MODULE-LIST指令中可以设置一个“用引号界定并且用空格分隔的 MODULE-LIST 模块名列表”例如: 'deflate rewrite echo' ,位于列表中的模块会被静态编译到httpd,提供了对DSO的支持。
通过—enable-module_name=shared参数明确指定把哪些基本模块编译成DSO。
通过—enable-MODULE_NAME=static指定把哪些扩展模块和实验模块静态编译到httpd中。

./configure --enable-mods-shared=all 

这条指令是最简单的,参数会把core,prefork,http_core,mod_so静态编译到httpd,其它所有模块都编译成DSO。

以上几种方法各有所长,前两个都是把模块静态编译到httpd核心,只是第二种方法在编译时就已经指定了需要使用的模块,灵活性方面可能要差一些,不过,完全静态化的服务器运行速度是最快的。第三种可以非常灵活的配置你的apache-httpd,但是这种方法编译的服务器运行速度也是最慢的。

按下来我们开始对apache-httpd进行编译,过程如下:

cd /local/localsoft/websrv/apache/httpd/
tar xvf httpd-2.2.10.tar.gz
cd httpd-2.2.10/

apache默认的安装位置是/usr/local/apache2,本文采用第三种方法编译(编译时间约需3分钟):

./configure --enable-mods-shared=all \
            --with-mpm=worker \
            --enable-nonportable-atomics=yes \
            --enable-static-support &&make &&make install

参数解释如下:
--with-mpm=worker:多路处理模块使用worker。linux下apache默认的MPM模块是prefork。有关worker和prefork模块的介绍请查阅apache2.2手册中有关MPM的部分。
注意:尽管使用worker这种线程模块可以优化apache的性能,但是php手册中介绍说,这样也会给php程序的运行增加风险。因此,把安全放在第一位的朋友请谨慎使用。

--enable-nonportable-atomics=yes:apache手册中介绍说“若只打算在486以上的CPU上运行Apache ,那么使用该选项可以启用更加高效的基于互斥执行的原子操作”,哦这个,我的机器比486还算要先进一些的。并且启用这个参数也优化了worker模块的性能。

--enable-static-support:使用静态连接编译所有二进制支持程序,比默认的动态连接要快一些。

注意:如果你熟悉apache每一个模块的作用,十字推荐用第二种方法,尽管很麻烦,但是却可以获得最优化的编译结果。如果你不愿意编译所有的模块,那么使用第一种方法也是很好的选择,基本模块己经提供了绝大多数的apache功能,正常情况下不会遇到问题,并且,apache的配置文件httpd.conf中,也只集成了基本模块的配置,有些扩展模块和实验模块不仅需要编译,并需要经过配置才能起作用,典型的如mod_rewrite,mod_deflate等。

使用自定义的路径编译apache。apache被安装到/usr/local:

./configure --prefix=/usr/local \ 
            --bindir=/usr/local/bin \ 
            --sbindir=/usr/local/sbin \ 
            --libdir=/usr/local/lib/apache \ 
            --libexecdir=/usr/local/lib/apache/modules \ 
            --sysconfdir=/usr/local/etc/apache \ 
            --includedir=/usr/local/include/apache \ 
            --localstatedir=/usr/local/var \ 
            --datadir=/usr/local/var/lib/www \ 
            --enable-mods-shared=all \ 
            --with-mpm=worker \ 
            --enable-nonportable-atomics=yes \ 
            --enable-static-support &&make &&make install

如果你需要自定义apache各个部分的位置,那么以上所列出的各个路径是必须要指定的,否则编译之后的apache目录结构看起来会非常乱。

使用apache的目录布局文件:如果你嫌一一指定apache路径比较麻烦,而寻找一种更便捷的方式,那么,自定义apache的目录布局文件的方法也许更适合你。在解压缩的apache的目录下,有一个config.layout的文件,这个文件就是apache的目录布局文件。目录布局的定义,就保存在……的字段中。在默认的情况下,编译apache使用“Apache”布局,即使你在编译选项里更改了个别的目录设置,其它你没有指定的设置仍然遵照默认布局的设定。你可以重新自定义自己喜欢的布局路径,将这些设定保存在……的字段中,然后在配置编译选项时,使用:

./configure –enable-layout=LAYOUT

指令使用你预先设置的布局。你可能会在目录布局文件中看到类似:

sysconfdir:    ${prefix}/etc+

这样的设置,该设置表示,在你指定的${prefix}/etc目录下,另行创建一个单独的目录来保存这些文件。比如,如果没有这个“+”号,那么httpd.conf将保存在etc目录下,如果有这个“+”号,安装程序将在etc目录下创建apache2目录,并把所有的文件保存在这个新创建的apache2目录下。

目录布局文件和自定义的安装路径可以混合使用,比如,如果你想使用默认的GNU布局,而仅仅需要修改libexecdir、datadir、localstatedir等路径,可以使用类似下面的编译参数:

./configure --enable-layout=GNU \ 
            --libexecdir=/usr/local/lib/modules \ 
            --datadir=/usr/local/var/lib/www \ 
            --localstatedir=/usr/local/var \ 
            --enable-mods-shared=all \ 
            --with-mpm=worker \ 
            --enable-nonportable-atomics=yes \ 
            --enable-static-support &&make &&make install

以上的编译的apache比较符合linux的目录结构,美中不足的是,该编译参数会在/usr/local/var/目录下创建apache2目录并把.pid和log文件放在该目录下,你需要对布局中将localstatedir: ${prefix}/var+后面的“+”号去掉。

下面我们启动apache,
使用/usr/local/apache2/bin/apachectl start 命令启动apache。

现在如果打开浏览器,在地址栏内输入http://localhost/,如果你看到It works!的字样,则说明apache启动成功。

注意:尽管此前apache的用户已经添加,但是如果没有修改apache的配置文件,编译后的apache默认会使用daemon用户而不是apache用户,daemon用户的主目录为/sbin,而apache的主进程是以root的权限启动的,因此,很容易带来安全方面的问题。

使用下面的命令进行修改:

cd /usr/local/apache2/conf
sed -i -e "s/User daemon/User apache/" -e "s/Group daemon/Group apache/" httpd.conf

这条命令会将httpd.conf中:
User daemon
Group daemon

这两行替换成:
User apache
Group apache

如果你使用了不同的用户/组,请参考进行修改。当然,我们也可以稍后编辑apache的配置文件来改变这一情况,如果你当前apache已经启动,那么请先把apache停止。

/usr/local/apache2/bin/apachectl stop 

接下来我们要删除httpd文件中的调试符号,就如同mysqld那样。

cd /usr/local/apache2/bin
cp httpd httpd.old
strip httpd

/usr/local/apache2/bin目录下的apachectl文件可以用来控制apache的启动,他同样也可以做为apache的启动脚本复制到/etc/init.d/目录下从而配置apache服务:

cp /usr/local/apache2/bin/apachectl /etc/init.d/apache2
chkconfig --add apache2
chkconfig --list apache2 apache服务默认在运行级3,5启动

现在,你已经可以通过service apache2 start 命令来启动你的apache了,但是,由于后面的php部分还没有完成,而且,php编译成功后还需要修改apache的配置文件,所以暂时先不启动apache。如果当前你的apache服务已经启动,请关掉apache服务:

service apache2 stop

注意:php编译完成后,需要对apache做进一步的设置,有关那部分的介绍,请查询《linux 下用源代码编译php》
   结尾分。