本篇是在CentOS 6.8编译安装httpd2.4。
由于在 http://blog.csdn.net/wangzhenyu177/article/details/69808141 中已经说明编译安装步骤,本文不再赘述。主要是编译httpd2.4过程中需要注意的。
编译安装需要先安装开发包组”Development tools”和”Server Platform”和gcc。
httpd2.4源码在 http://httpd.apache.org 下载。
httpd可在windows、linux、unix等多种平台部署,而并不需要为每种平台都编写不同的代码实现。因为有apr、apr-util。
apr:apache portable runtime,类似于虚拟机,为apache提供运行环境。针对不同平台有不同的apr。httpd通过不同的apr,就可运行于不同的平台之上了。
CentOS 6安装的apr和apr-util版本是1.4以前的:
[root@node1 ~]% rpm -q apr
apr-1.3.9-5.el6_2.x86_64
[root@node1 ~]% rpm -q apr-util
apr-util-1.3.9-3.el6_0.1.x86_64
而httpd2.4需要apr、apr-util在1.4以上版本(apr和apr-util版本号可不一致),所以要先编译安装这两工具。
可在 http://apr.apache.org 下载。
由于apr-util依赖于apr,所以先编译安装apr,在解压后的apr目录下,执行:
[root@node1 apr-1.6.3]% ./configure --prefix=/usr/local/apr
……
[root@node1 apr-1.6.3]% make && make install
……
查看指定目录有内容,一般就正常了:
[root@node1 apr-1.6.3]% ls /usr/local/apr/
bin build-1 include lib
apr-util类似,不过要指定依赖的apr的位置:
[root@node1 apr-util-1.6.1]% ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
之后也是make,make install。但make时报了个错
error: expat.h: No such file or directory
没有找到expat.h头文件。这个文件在expat-devel包,默认没装,装上就ok了:
[root@node1 apr-util-1.6.1]% rpm -ql expat-devel
/usr/include/expat.h
……
[root@node1 apr-util-1.6.1]% ls /usr/local/apr-util/
bin include lib
httpd的./configure的常用选项:
选项 | 意义 |
---|---|
–enable-so | 启用动态装载模块功能 |
–enable-ssl | 启用ssl功能。注意要先安装 |
–enable-cgi | 启用cgi功能 |
–enable-rewrite | 启用URL重定向功能 |
–enable-modules=[all | most | ……] | 指定启用哪些模块。可指定具体的模块名,也可使用all表示启用所有模块,most表示启用大多数常用模块。一般使用most即可 |
–enable-mpms-shared=[prefork | worker | event | all] | 指定编译哪些MPM模块1。可使用all表示全编译 |
–with-mpm=[prefork | worker | event] | 如3种MPM模块都编译了,则通过此项指定默认使用哪种 |
–with-zlib | 依赖zlib库用于页面压缩 |
–with-pcre | 依赖pcre库用于解决正则表达式问题。 |
–with-apr=PATH | 指定依赖的apr路径。注意必须指明路径,否则编译时会自动去找/usr下的apr,而不是编译的高版本apr,下同 |
–with-apr-util=PATH | 指定依赖的apr-util路径 |
–sysconfdir=PATH | 指定配置文件在安装在哪个路径。如不指定,配置文件就在程序安装的目录;如指定/etc目录,注意起个别的名字,不要覆盖httpd2.2的 |
可以看到enable类的一般用于指定启用哪些功能,with类的一般表示依赖于哪些2。
默认没有安装pcre-devel包。在./configure时报如下错误:
configure: error: pcre-config for libpcre not found
默认没有安装openssl-devel包。在./configure时报如下错误:
configure: error: mod_ssl has been requested but can not be built due to prerequisite failures
笔者最开始使用的apr-util是1.6以上的,make时报如下错误:
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_ParserCreate'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_GetErrorCode'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetUserData'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_ErrorString'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetEntityDeclHandler'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_ParserFree'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetElementHandler'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_StopParser'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_Parse'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetCharacterDataHandler'
apr-util使用低于1.6版本的,恢复正常。
据说在CentOS 7上使用apr-utl1.6以上的没有问题。看来在CentOS 6编译安装,apr-util的版本既不能低于1.4,也不能高于1.6。
将上述错误一一修正后,编译安装完成。
该主机IP为192.168.0.106,因为是编译安装,所以没有欢迎页,但访问时会显示已启动:
编译完成后所生成的各目录:
[root@node1 httpd_24]% ls /usr/local/httpd_24/
bin build cgi-bin error htdocs icons include lib logs man manual modules
大部分目录见名知意,其中:
build目录存放的是编译过程中产生的文件,其中文件config.nice记录了configure时指定的选项:
[root@node1 httpd_24]% ls build/
config.nice config_vars.mk instdso.sh library.mk ltlib.mk mkdir.sh program.mk rules.mk special.mk
[root@node1 httpd_24]% cat build/config.nice
#! /bin/sh
#
# Created by configure
"./configure" \
"--prefix=/usr/local/httpd_24" \
"--sysconfdir=/etc/httpd_24" \
"--enable-so" \
"--enable-ssl" \
"--enable-cgi" \
"--enable-rewrite" \
"--enable-modules=most" \
"--enable-mpms-shared=all" \
"--with-mpm=prefork" \
"--with-zlib" \
"--with-pcre" \
"--with-apr=/usr/local/apr" \
"--with-apr-util=/usr/local/apr-util" \
"$@"
因为编译时,通过–sysconfdir选项指定了配置文件路径为/etc/httpd_24,否则配置文件也在/usr/local/httpd_24:
[root@node1 httpd_24]% ls /etc/httpd_24
extra httpd.conf magic mime.types original
除了主配置文件httpd.conf,其他配置文件都在extra目录:
[root@node1 httpd_24]% ls /etc/httpd_24/extra/
httpd-autoindex.conf httpd-info.conf httpd-mpm.conf httpd-userdir.conf
httpd-dav.conf httpd-languages.conf httpd-multilang-errordoc.conf httpd-vhosts.conf
httpd-default.conf httpd-manual.conf httpd-ssl.conf proxy-html.conf
CentOS 7上的httpd的其他配置文件,是在/etc/conf.d/*和/etc/conf.modules.d/*。
编译安装的程序一般没有服务脚本,不过httpd自带有启动脚本apachectl:
[root@node1 httpd_24]% ls /usr/local/httpd_24/bin
ab apu-1-config checkgid envvars fcgistarter htdbm htpasswd httxt2dbm rotatelogs
apachectl apxs dbmmanage envvars-std htcacheclean htdigest httpd logresolve
可以看到命令httpd也在此目录。把该路径添加至PATH就可以使用了,否则要使用绝对路径。
不过即便把该路径添加至PATH,仍不能使用service来控制,可以把系统上httpd2.2的服务脚本做些修改作为2.4的服务脚本:
[root@node1 init.d]% cd /etc/rc.d/init.d/
[root@node1 init.d]% cp httpd httpd_24
修改httpd_24中的部分内容:
1、把其中读取httpd服务脚本配置文件/etc/sysconfig/httpd的语句删除。这是为避免httpd2.2的服务脚本配置文件影响到httpd_24(虽然一般httpd的服务脚本配置文件也都是注释信息):
if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi
2、修改apachectl、httpd的文件路径,修改pid文件、锁文件:
apachectl=/usr/sbin/apachectl
httpd=${HTTPD-/usr/sbin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
修改为:
apachectl=/usr/local/httpd_24/bin/apachectl
httpd=${HTTPD-/usr/local/httpd_24/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/usr/local/httpd_24/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd_24}
apachectl和httpd改为httpd2.4对应的路径;
锁文件改个名就行;
pid文件也可不修改,如果不修改则httpd2.2和httpd2.4不能同时启动,因为pid文件相同。这里把pid文件也改了。编译安装的pid文件是/usr/local/httpd_24/logs/httpd.pid。
这样就可以通过服务脚本httpd_24控制了:
[root@node1 ~]% service httpd_24 start
Starting httpd: [ OK ]
[root@node1 ~]% curl 192.168.0.106
<html><body><h1>It works!h1>body>html>
加入至chkconfig,令chkconfig管理其开机是否启动:
[root@node1 ~]% chkconfig --add httpd_24
[root@node1 ~]% chkconfig --list httpd_24
httpd_24 0:off 1:off 2:off 3:off 4:off 5:off 6:off
MPM在2.4已经是一个可动态装载、卸载的模块,prefork、worker、event模式的切换可通过配置文件调整;而httpd2.2中的MPM是静态模块,只能一同编译,不能动态装载卸载:
[root@node1 ~]% httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
[root@node1 ~]% /usr/local/httpd_24/bin/httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
可以看到2.2默认使用的是prefork4,并且是和httpd一并编译的。而httpd2.4的编译的模块就不再有prefork。
(完)