一、httpd-2.4的新特性

1)MPM支持在运行时装载;

    --enable-mpms-shared=all --with-mpm={prefork|worker|event}

2)支持event mpm

3)异步读写

4)在每模块及每目录分别使用不同的日志级别

5)每请求的配置;,

6)增强版的表达式分析器

7)毫秒级的keep alive的timeout

8)基于FQDN的虚拟主机不再需要NameVirtualHost指令;

9)支持用户使用自定义变量

10)新增了一些模块:mod_proxy_fcgi, mode_ratelimit, mod_request, mod_remoteip

11)修改了一些配置机制。不再支持使用order, allow, deny定义基于ip的访问控制,改为require

二、安装配置开始

1、解决依赖关系    
安装 apr    

[root@server ~]# cd apr-1.5.0     
[root@server apr-1.5.0]# ./configure --prefix=/usr/local/apr     
[root@server apr-1.5.0]# make && make install

安装 apr-util    

[root@server ~]# tar  xf apr-util-1.5.3.tar.bz2     
[root@server ~]# cd apr-util-1.5.3     
[root@server apr-util-1.5.3]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/     
[root@server apr-util-1.5.3]#  make && make install

安装其他依赖关系,使用yum 就可以解决。这一过程可在安装httpd时候根据提示具体解决。

2、安装 http 2.4.9    

[root@server ~]# tar xf httpd-2.4.9.tar.bz2     
[root@server ~]# cd httpd-2.4.9     
[root@server httpd-2.4.9]# ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --enable-modules=most --enable-so  --enable-deflate --enable-ssl --enable-cgi --enable-rewrite  --with-apr=/usr/local/apr/ --with-apr-util=/usr/local/apr-util/ --with-mpm=event  --enable-mpms-shared=all
# --prefix 指明安装目录
# --sysconfdir 指明配置文件目录
# --enable-modules=most 启用大多数的模块
# --enable-so 允许动态加载模块
# --enable-deflate 允许使用压缩传输
# --enable-ssl  允许使用 SSL
# --enable-cgi 允许使用CGI
# --enable-rewrite 允许使用重写
# --with-apr --with-apr-util 指明 apr 和apr-util安装目录
# --with-mpm=event MPM为event
# --enable-mpms-shared=all 将所有的 MPM 编译从动态模块 

#########################构建MPM为静态模块#################################
在全部平台中,MPM都可以构建为静态模块。在构建时选择一种MPM,链接到服务器中。如果要改变MPM,必须重新构建。为了使用指定的MPM,请在执行configure脚本时,使用参数 --with-mpm=NAME。NAME是指定的MPM名称。编译完成后,可以使用 ./httpd -l 来确定选择的MPM。 此命令会列出编译到服务器程序中的所有模块,包括 MPM。

#########################构建 MPM 为动态模块############################
在Unix或类似平台中,MPM可以构建为动态模块,与其它动态模块一样在运行时加载。 构建 MPM 为动态模块允许通过修改LoadModule指令内容来改变MPM,而不用重新构建服务器程序。在执行configure脚本时,使用--enable-mpms-shared选项即可启用此特性。当给出的参数为all时,所有此平台支持的MPM模块都会被安装。还可以在参数中给出模块列表。默认MPM,可以自动选择或者在执行configure脚本时通过--with-mpm选项来指定,然后出现在生成的服务器配置文件中。编辑LoadModule指令内容可以选择不同的MPM。
[root@server httpd-2.4.9]# make && make install

3、导出二进制文件和帮助手册    

vim /etc/profile.d/apache.sh   
PATH=/usr/local/apache24/bin:$PATH     
. /etc/profile.d/apache.sh

vim /etc/man.config    
MANPATH /usr/local/apache24/man

4、提供服控制动脚本:    

[root@server httpd24]# cat /etc/init.d/httpd24     
#!/bin/bash     
#     
# httpd24        Startup script for the Apache HTTP Server     
#     
# chkconfig: - 85 15
# Source function library.    
. /etc/rc.d/init.d/functions
HTTPD_LANG=${HTTPD_LANG-"C"}    
INITLOG_ARGS=""     
apachectl=/usr/local/apache24/bin/apachectl     
httpd=${HTTPD-/usr/local/apache24/bin/httpd}    
prog=httpd     
pidfile=${PIDFILE-/usr/local/apache24/logs/httpd.pid}     
lockfile=${LOCKFILE-/var/lock/subsys/httpd}     
RETVAL=0    
STOP_TIMEOUT=${STOP_TIMEOUT-10}

start() {
        echo -n $"Starting $prog: "
        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}

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
}

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


5、虚拟主机 和 SSL 的实现 

虚拟主机:

vim /etc/http24/http.conf:
注释:DocumentRoot "/usr/local/apache24/htdocs"    
开启:Include "extra/httpd-vhosts.conf"

vim /etc/http24/extra/httpd-vhosts.conf
    
    ServerAdmin [email protected]     
    DocumentRoot "/web/vhosts/www1"     
    ServerName www1.guoting.com     
         
        Require all granted     
         
    ErrorLog "logs/www1.guoting.com.error_log"     
    CustomLog "logs/www1.guoting.com.access_log" common     

    
    ServerAdmin [email protected]     
    DocumentRoot "/web/vhosts/www2"     
    ServerName www2.guoting.com     
         
        Require all granted     
         
    ErrorLog "logs/www2.guoting.com.error_log"     
    CustomLog "logs/www2.guoting.com.access_log" common     

在上一步的基础上实现ssl:     

##########################加载模块读取配置文件############################   
vim /etc/http24/http.conf
开启:Include "extra/httpd-ssl.conf"    
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so     
LoadModule ssl_module modules/mod_ssl.so
当然可以动态添加 MPM 的方式:(选择添加)    
LoadModule mpm_event_module modules/mod_mpm_event.so

##############################制作证书#######################################  
在服务端:     
(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)     
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 1000     
touch index.txt     
echo "01" > serial
在客户端:    
(umask 077;openssl genrsa -out /etc/httpd24/httpd.key 2048)     
openssl req -new -key /etc/httpd24/httpd.key -out /etc/httpd24/httpd.csr     
将 httpd.csr 传到服务端签名:
在服务端:    
openssl ca -in /root/httpd.csr -out /root/httpd.crt -days 1000     
将签好的证书,httpd.crt 传回到客户端,放到 etc/httpd24/ 目录下

#############################修改配置文件#############################
vim /etc/http24/extra/httpd-ssl.conf
# 添加:    
     
    DocumentRoot "/web/vhosts/www1"     
         
        Options none     
        Require all granted     
         
    ServerName www1.guoting.com:443     
    ServerAdmin [email protected]     
    ErrorLog "/web/vhosts/www1/logs/error_log"     
    TransferLog "/web/vhosts/www1/logs/access_log"     
    SSLEngine on     
    SSLCertificateFile "/etc/httpd24/httpd.crt"     
    SSLCertificateKeyFile "/etc/httpd24/httpd.key"     
  
    
    DocumentRoot "/web/vhosts/www2"     
         
        Options none     
        Require all granted     
         
    ServerName www2.guoting.com:443     
    ServerAdmin [email protected]     
    ErrorLog "/web/vhosts/www2/logs/error_log"     
    TransferLog "/web/vhosts/www2/logs/access_log"     
    SSLEngine on     
    SSLCertificateFile "/etc/httpd24/httpd.crt"     
    SSLCertificateKeyFile "/etc/httpd24/httpd.key"     

#######################创建日志目录############################    
mkdir /web/vhosts/www1/logs -p     
mkdir /web/vhosts/www2/logs -p

###################测试###################################
在浏览器中输入测试,以 Linux 为例:
输入:https://www1.guoting.com,导入证书即可访问。