httpd-2.4的安装
实验环境为centOS6.5,由于centOS6上的库文件及开发工具等不适合安装httpd-2.4,所以需要手动安装这两个包apr和apr-util,httpd-2.4依赖1.4版本以上的apr和apr-util。下面简单介绍一下apr。
apr简介
apr(apache portable runtime),即apache的可移植运行环境,由于底层环境的不同,apache应用程序需要根据不同的平台来开发,而apr消除了底层平台的差异,apr能够为大多数的平台提供所有的apr特性支持,包括BeOS,UNIX,Linux等等,apr为这些大部分的平台提供了一个公共的统一操作函数接口,使得不同平台上的apache应用程序执行的接口基本都是统一一致的。
编译安装
下载源码包
-rw-r--r-- 1 root root 813976 Jul 1 09:09 apr-1.5.0.tar.bz2 -rw-r--r-- 1 root root 695303 Jul 1 09:09 apr-util-1.5.3.tar.bz2 -rw-r--r-- 1 root root 4994460 Jul 1 09:09 httpd-2.4.9.tar.bz2
1)编译安装apr-1.5.0
[root@www ~]# tar xf apr-1.5.0.tar.bz2 [root@www ~]# cd apr-1.5.0 [root@www apr-1.5.0]# ./configure --prefix=/usr/local/apr-1.5.0 checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking target system type... x86_64-unknown-linux-gnu Configuring APR library ............. [root@www apr-1.5.0]# make && make install
2)编译安装apr-util-1.5.3
[root@www ~]# tar xf apr-util-1.5.3.tar.bz2 [root@www ~]# cd apr-util-1.5.3 [root@www apr-util-1.5.3]# ./configure --prefix=/usr/local/apr-util-1.5.3/ --with-apr=/usr/local/apr-1.5.0/ checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking target system type... x86_64-unknown-linux-gnu checking for a BSD-compatible install... /usr/bin/install -c checking for working mkdir -p... yes .............. [root@www apr-util-1.5.3]# make && make install
由于apr-util依赖apr所以在安装apr-util时需要通过“--with-apr”指定已安装的apr。
httpd还依赖pcre的开发库pcre-devel,PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。这个也需要安装一下。
[root@CentOS6 yum.repos.d]# yum install pcre-devel -y
2)编译安装httpd-2.4.9
[root@www ~]# tar xf httpd-2.4.9.tar.bz2 [root@www ~]# cd httpd-2.4.9 [root@www httpd-2.4.9]# ./configure --prefix=/usr/local/apache2.4.9 --sysconfdir=/etc/http d --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/ usr/local/apr-1.5.0 --with-apr-util=/usr/local/apr-util-1.5.3 --enable-mpms-shared=all --with -mpm=event --enable-modules=most ........... [root@www httpd-2.4.9]# make && make install
简单介绍一下涉及到的各参数:
--prefix=/usr/local/apache2.4.9 #应用程序安装路径
--sysconfdir=/etc/httpd #配置文件的安装路径
--enable-so #支持DSO动态装载模块
--enable-ssl #要编译启用ssl模块(前提是需要安装openssl-devel)
--enable-cgi #启用CGI模块(默认就启用)
--enable-rewrite #URL重写(把用户访问的URL由服务器自动的改成另外一个URL,这是一个非常有用的机
#制)
--with-zlib #这是一个压缩库(专用于网络传输)
--with-pcre #使用增强的perl正则表达式分析工具(使用这项需要安装pcre-devel,pcre:正则表达式分
#析器)
--with-apr=/usr/local/apr #指明apr的目录(若apr在特殊路径下)
--with-apr-util=/usr/local/apr-util/ #指明apr-util路径(若apr-util在特殊路径下)
--enable-mpms-shared=all #把所有的mpm模块都编译进来而且是共享模块
--with-mpm=event #默认使用的mpm模块
--enable-modules=most|all #还有很多其他模块,其他的动态可装载模块需要编译哪些
#(all:所有都编译,most:编译一些常用的模块)
[root@www profile.d]# vim /etc/profile.d/apache.sh export PATH=/usr/local/apache2.4.9/bin:$PATH [root@www profile.d]# . /etc/profile.d/apache.sh
导出头文件和man帮助文档
[root@CentOS6 extra]# ln -sv /usr/local/apache-2.4.9/include/ /usr/include/httpd-2.4 `/usr/include/httpd-2.4' -> `/usr/local/apache-2.4.9/include/' [root@CentOS6 extra]# vim /etc/man.config MANPATH /usr/local/apache-2.4.9/man
将apache应用程序bin目录添加到path环境变量中。由于是编译安装,所以在/etc/init.d目录下没有对应的脚本文件,需要自己编写,就不编写了,直接将rpm包安装后自动生成的脚本文件httpd复制过来吧,改一下其中的几个参数。
#!/bin/bash # # httpd Startup script for the Apache HTTP Server # # chkconfig: - 85 15 # description: The Apache HTTP Server is an efficient and extensible \ # server implementing the current HTTP standards. # processname: httpd # config: /etc/httpd/httpd.conf # pidfile: /usr/local/apache2.4.9/logs/httpd.pid # ### BEGIN INIT INFO # Provides: httpd # Required-Start: $local_fs $remote_fs $network $named # Required-Stop: $local_fs $remote_fs $network # Should-Start: distcache # Short-Description: start and stop Apache HTTP Server # Description: The Apache HTTP Server is an extensible server # implementing the current HTTP standards. ### END INIT INFO # Source function library. . /etc/rc.d/init.d/functions #if [ -f /etc/sysconfig/httpd ]; then # . /etc/sysconfig/httpd #fi # Start httpd in the C locale by default. HTTPD_LANG=${HTTPD_LANG-"C"} # This will prevent initlog from swallowing up a pass-phrase prompt if # mod_ssl needs a pass-phrase from the user. INITLOG_ARGS="" # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server # with the thread-based "worker" MPM; BE WARNED that some modules may not # work correctly with a thread-based MPM; notably PHP will refuse to start. # Path to the apachectl script, server binary, and short-form for messages. apachectl=/usr/local/apache2.4.9/bin/apachectl httpd=${HTTPD-/usr/local/apache2.4.9/bin/httpd} prog=httpd pidfile=${PIDFILE-/usr/local/apache2.4.9/logs/httpd.pid} lockfile=${LOCKFILE-/var/lock/subsys/httpd} RETVAL=0 STOP_TIMEOUT=${STOP_TIMEOUT-10} # The semantics of these two functions differ from the way apachectl does # things -- attempting to start while running is a failure, and shutdown # when not running is also a failure. So we just do it the way init scripts # are expected to behave here. start() { echo -n $"Starting $prog: " LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL } # When stopping httpd, a delay (of default 10 second) is required # before SIGKILLing the httpd parent; this gives enough time for the # httpd parent to SIGKILL any errant children. stop() { echo -n $"Stopping $prog: " killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} } reload() { echo -n $"Reloading $prog: " if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then RETVAL=6 echo $"not reloading due to configuration syntax error" failure $"not reloading $httpd due to configuration syntax error" else # Force LSB behaviour from killproc LSB=1 killproc -p ${pidfile} $httpd -HUP RETVAL=$? if [ $RETVAL -eq 7 ]; then failure $"httpd shutdown" fi fi echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $httpd RETVAL=$? ;; restart) stop start ;; condrestart|try-restart) if status -p ${pidfile} $httpd >&/dev/null; then stop start fi ;; force-reload|reload) reload ;; graceful|help|configtest|fullstatus) $apachectl $@ RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}" RETVAL=2 esac exit $RETVAL
apachectl=/usr/local/apache2.4.9/bin/apachectl
httpd=${HTTPD-/usr/local/apache2.4.9/bin/httpd}
pidfile=${PIDFILE-/usr/local/apache2.4.9/logs/httpd.pid}
修改了上面几个参数,这里编译安装的应用程序将pidfile放置在/usr/local/apache2.4.9/logs/,可以通过在主配置文件中通过PidFile参数修改pid文件的放置位置。
PidFile "/var/run/httpd/httpd.pid"
[root@www bin]# chkconfig --add /etc/init.d/httpd [root@www bin]# chkconfig --list httpd httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
启动服务
[root@www logs]# service httpd start Starting httpd: [ OK ] [root@www logs]# ss -tuln | grep 80 tcp LISTEN 0 128 :::80 :::*
ok......
目录介绍
[root@www httpd]# tree /etc/httpd /etc/httpd #配置文件目录 ├── extra │ ├── httpd-autoindex.conf │ ├── httpd-dav.conf │ ├── httpd-default.conf #默认配置文件(包括keep-alive的配置) │ ├── httpd-info.conf #server-status页面配置 │ ├── httpd-languages.conf #为主机设置不同的语言 │ ├── httpd-manual.conf #访问控制配置文件 │ ├── httpd-mpm.conf #MPM配置文件 │ ├── httpd-multilang-errordoc.conf │ ├── httpd-ssl.conf #ssl配置文件 │ ├── httpd-userdir.conf #用户目录配置文件 │ ├── httpd-vhosts.conf #虚拟主机配置文件 │ └── proxy-html.conf ├── httpd.conf #主配置文件,包含了extra目录下的所有文件 ├── magic ├── mime.types └── original .......
区别于httpd-2.2,这里对配置文件做了分离。
mpm模块介绍
MPM(Multipath Processing Module),即多道模块处理,通过增加服务进程数量是服务器能够同时处理多个用户请求。mpm的实现方式有3种:
prefork:每个进程响应一个用户请求,预先生成多个空闲进程;
worker:启动多个进程,每个进程生成多个线程,每个线程响应一个用户请求;
event:基于事件驱动,启动多个线程,每个线程响应多个请求;(event在httpd2.2中是实验性版本,httpd2.4中正式引入)
构建MPM模块
(1)构建MPM为静态模块
在全部平台中,MPM都可以构建为静态模块。在构建时选择一种MPM,链接到服务器中。如果要改变MPM,必须重新构建。为了使用指定的MPM,请在执行configure脚本 时,使用参数 --with-mpm=NAME。NAME是指定的MPM名称。编译完成后,可以使用 ./httpd -l 来确定选择的MPM。 此命令会列出编译到服务器程序中的所有模块,包括 MPM。
(2)构建 MPM 为动态模块
在Unix或类似平台中,MPM可以构建为动态模块,与其它动态模块一样在运行时加载。 构建 MPM 为动态模块允许通过修改LoadModule指令内容来改变MPM,而不用重新构建服务器程序。在执行configure脚本时,使用--enable-mpms-shared选项即可启用此特性。当给出的参数为all时,所有此平台支持的MPM模块都会被安装。还可以在参数中给出模块列表。默认MPM,可以自动选择或者在执行configure脚本时通过--with-mpm选项来指定,然后出现在生成的服务器配置文件中。编辑LoadModule指令内容可以选择不同的MPM。
配置这3种MPM
在编译安装时,--enable-mpms-shared=all即可将3种模块都编译到应用程序目录下的modules目录中,通过 --with-mpm=mpm指定使用哪个mpm。通过httpd -l或httpd -D DUMP_MODULES查看当前已加载的模块。
[root@www ~]# httpd -D DUMP_MODULES | grep mpm mpm_event_module (shared)
当前加载的mpm模块是event,若要动态的切换,需要修改主配置文件/etc/httpd/httpd.conf,用如下的格式加载modules目录下对应的mpm模块即可。
LoadModule mpm_event_module modules/mod_mpm_event.so
关于mpm模块的具体参数在/etc/httpd/extra/httpd-mpm.conf文件中,需要在/etc/httpd/httpd.conf中包含该文件方可生效。
Include /etc/httpd/extra/httpd-mpm.conf
简单介绍下3种MPM的参数
# prefork MPM
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 250 MaxConnectionsPerChild 0 </IfModule>
# IfModule表示判断模块是否存在,若存在启动后面的参数。
# StartServers:在服务启动时就创建的用于响应用户的进程(空闲进程)
# MinSpareServers:最少空闲进程数
# MaxSpareServers:最大空闲进程数(这个数字不应该小于StartServers)
# MaxRequestWorkers:允许同时开启的最大服务进程数量
# MaxConnectionsPerChild:一个进程最多允许的响应数量(然后销毁进程)
# worker MPM
<IfModule mpm_worker_module> StartServers 3 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 0 </IfModule>
# StartServers: 服务启动时就创建的用于响应用户的进程
# MinSpareThreads: 最少空闲线程数
# MaxSpareThreads: 最大空闲线程数
# ThreadsPerChild: 每个子进程可以启动多少个线程
# MaxRequestWorkers: 允许最大数量的工作线程(最大并发用户请求数)
# MaxConnectionsPerChild: 每个线程最多允许处理多少个请求(0表示不限定)
# event MPM
<IfModule mpm_event_module> StartServers 3 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 0 </IfModule>
# 各参数的意义与worker相同!
httpd-2.4的新特性
1)MPM支持在运行时装载;
--enable-mpms-shared=all #把所有的mpm模块都编译进来而且是共享模块
--with-mpm={prefork|worker|event} #默认使用的mpm模块
2)支持event mpm
3)异步读写
4)在每模块及每目录分别使用不同的日志级别
5)每请求的配置;<If>,<Elseif>
6)增强版的表达式分析器
7)毫秒级的keep alive的timeout
8)基于FQDN的虚拟主机不再需要NameVirtualHost指令;
9)支持用户使用自定义变量
新增了一些模块:mod_proxy_fcgi(支持使用fast CGI协议的方式连接后端的PHP服务),
mode_ratelimit(速率限定,限定用户访问时传输的限定),
mod_request(对用户的请求做更强大的过滤功能)
mod_remoteip(对客户端请求的ip地址作更强大的控制能力)
修改的一些配置机制:不再支持使用order, allow, deny定义基于ip的访问控制;改为require