编译安装httpd-2.4

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                   :::*

wKiom1WUC3Kxc10xAACQLGtRMqM940.jpg

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 



你可能感兴趣的:(httpd,2.4,httpd-2.4,http新特性)