源码编译安装http2.4

来源:互联网 发布:淘宝编辑图片软件 编辑:程序博客网 时间:2024/06/01 15:52

0 目录

  • 目录
  • 环境
  • 编译安装步骤
    • 1 aprapr-util
    • 2 安装httpd24
      • 21 configure常用选项
      • 22 常见错误
  • 各目录内容
  • 服务脚本修改
  • 与httpd22部分特性对比

1 环境

本篇是在CentOS 6.8编译安装httpd2.4。
由于在 http://blog.csdn.net/wangzhenyu177/article/details/69808141 中已经说明编译安装步骤,本文不再赘述。主要是编译httpd2.4过程中需要注意的。

2 编译安装步骤

编译安装需要先安装开发包组”Development tools”和”Server Platform”和gcc。
httpd2.4源码在 http://httpd.apache.org 下载。

2.1 apr、apr-util

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 aprapr-1.3.9-5.el6_2.x86_64[root@node1 ~]% rpm -q apr-utilapr-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

2.2 安装httpd2.4

2.2.1 configure常用选项

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。

2.2.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,因为是编译安装,所以没有欢迎页,但访问时会显示已启动:

这里写图片描述

3 各目录内容

编译完成后所生成的各目录:

[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" \"$@"
  • error,记录了各错误页面内容。404等错误页面就放在这里,报错时显示的就是这些页面内容。
  • htdocs,网页文件放置位置。因为是编译安装的,网页文件没有放在/var下3。
  • man,man手册
  • manual,官方文档
  • modules,各模块
  • logs,日志。httpd的pid文件也在此目录

因为编译时,通过–sysconfdir选项指定了配置文件路径为/etc/httpd_24,否则配置文件也在/usr/local/httpd_24:

[root@node1 httpd_24]% ls /etc/httpd_24extra  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.confhttpd-dav.conf        httpd-languages.conf  httpd-multilang-errordoc.conf  httpd-vhosts.confhttpd-default.conf    httpd-manual.conf     httpd-ssl.conf                 proxy-html.conf

CentOS 7上的httpd的其他配置文件,是在/etc/conf.d/*和/etc/conf.modules.d/*。

4 服务脚本修改

编译安装的程序一般没有服务脚本,不过httpd自带有启动脚本apachectl:

[root@node1 httpd_24]% ls /usr/local/httpd_24/binab         apu-1-config  checkgid   envvars      fcgistarter   htdbm     htpasswd  httxt2dbm   rotatelogsapachectl  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/httpdfi

2、修改apachectl、httpd的文件路径,修改pid文件、锁文件:

apachectl=/usr/sbin/apachectlhttpd=${HTTPD-/usr/sbin/httpd}prog=httpdpidfile=${PIDFILE-/var/run/httpd/httpd.pid}lockfile=${LOCKFILE-/var/lock/subsys/httpd}

修改为:

apachectl=/usr/local/httpd_24/bin/apachectlhttpd=${HTTPD-/usr/local/httpd_24/bin/httpd}prog=httpdpidfile=${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 startStarting 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_24httpd_24        0:off   1:off   2:off   3:off   4:off   5:off   6:off

5 与httpd2.2部分特性对比

MPM在2.4已经是一个可动态装载、卸载的模块,prefork、worker、event模式的切换可通过配置文件调整;而httpd2.2中的MPM是静态模块,只能一同编译,不能动态装载卸载:

[root@node1 ~]% httpd -lCompiled in modules:  core.c  prefork.c  http_core.c  mod_so.c[root@node1 ~]% /usr/local/httpd_24/bin/httpd -lCompiled in modules:  core.c  mod_so.c  http_core.c

可以看到2.2默认使用的是prefork4,并且是和httpd一并编译的。而httpd2.4的编译的模块就不再有prefork。

(完)


  1. 在httpd2.4中,prefork、worker、event作为模块,可使用配置文件切换。2.2中则不能作为动态模块,只能和httpd一块编译。CentOS6默认是将3者都编译了,对应不同的应用程序/usr/bin/httpd、/usr/bin/httpd.worker、/usr/bin/httpd.event。 ↩
  2. 还可使用disable、without,显式地指定禁用哪些功能、不依赖哪些程序包等。 ↩
  3. 包括运行httpd的user、group也变成了daemon而不是apache。
    编译安装配置和yum安装的配置很多不一样,可在配置文件看到,此处不赘述了 ↩
  4. 所以CentOS 6为了用户可使用prefork、worker、event三种模式,把三种都分别编译了。默认使用prefork,另外两模式对应的程序为/usr/bin/httpd.worker和/usr/bin/httpd.event。服务脚本自动启动的是prefork,这是在服务脚本配置文件/etc/sysconfig/httpd中定义的 ↩
原创粉丝点击