废话不多说直接上图:

   prefork模型

Apache  Multipath Processing Module _apache   Multip


<IfModule prefork.c>
StartServers       8   # 默认启动的工作进程数;
MinSpareServers    5  # 最少空闲进程数;
MaxSpareServers   20  # 最大空闲进程数;
ServerLimit      256   # 最大活动进程数;
MaxClients       256  # 并发请求的最大数;
MaxRequestsPerChild  4000 # 每个子进程在生命周期内所能够服务的最多请求个数;
</IfModule>


   prefork采用的是预派生子进程方式,用子进程处理不同的请求, 每个请求对应一个子进程,进程之间是彼此独立的。当apache启动后会先启动StartServers个子进程,等待1秒后会再创建两个,再等待1秒后创建4,再一秒后创建8个这样直到创建满MinSpareServers个子进程为止,那么此时MinSpareServers个子进程会待命,这种待命模式不必在新请求到来时重新创建, 一定程度上加快了进程的响应速度。每个子进程占用内存25M内存,如果我记得没有错的话,特点以: 稳定著称

# service httpd start
# ps -elHF | grep httpd
1 S root      2635     1  0  80   0 - 46071 poll_s  3840   0 07:55 ?        00:00:00   /usr/sbin/httpd
5 S apache    2638  2635  0  80   0 - 46071 inet_c  2436   0 07:55 ?        00:00:00     /usr/sbin/httpd
5 S apache    2639  2635  0  80   0 - 46071 inet_c  2436   0 07:55 ?        00:00:00     /usr/sbin/httpd
5 S apache    2640  2635  0  80   0 - 46071 inet_c  2436   0 07:55 ?        00:00:00     /usr/sbin/httpd
5 S apache    2641  2635  0  80   0 - 46071 inet_c  2436   0 07:55 ?        00:00:00     /usr/sbin/httpd
5 S apache    2642  2635  0  80   0 - 46071 inet_c  2436   0 07:55 ?        00:00:00     /usr/sbin/httpd
5 S apache    2643  2635  0  80   0 - 46071 inet_c  2436   0 07:55 ?        00:00:00     /usr/sbin/httpd
5 S apache    2644  2635  0  80   0 - 46071 inet_c  2436   0 07:55 ?        00:00:00     /usr/sbin/httpd
5 S apache    2645  2635  0  80   0 - 46071 inet_c  2436   0 07:55 ?        00:00:00     /usr/sbin/httpd


apache Worker模型

Apache  Multipath Processing Module _apache   Multip_02

<IfModule worker.c>
StartServers         4   # 默认启动的工作进程数;                           
MaxClients         300  #  并发请求的最大数;                
MinSpareThreads     25  #  最小空闲线程数;
MaxSpareThreads     75  #最大空闲线程数;
ThreadsPerChild     25  #  每个子进程可生成的线程数;
MaxRequestsPerChild  0  #每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定;
</IfModule>

               worker 模型相对于prefork模型来说就相对没那么稳定了,因为worker是基于线程工作的,在线程的环境下,如下图所示:同一个进程的中的多个线程的资源是共享的,如果用户请求的资源,由一个线程回应,如果这个线程奔溃了,那么这个进程中共享资源的线程就全军覆没啦.

Apache  Multipath Processing Module _apache   Multip_03

切换为worker模型:这里为什么是三个呢?因为这是红帽特别设置的,也许红帽认为这样设置更适合现在的应用场景吧!

# vim /etc/sysconfig/httpd
# grep '^HTTPD' /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
# ps -elHF | grep httpd

1 S root      2720     1  0  80   0 - 46122 poll_s  4044   0 08:12 ?        00:00:00   /usr/sbin/httpd.worker
5 S apache    2723  2720  0  80   0 - 132187 pipe_w 3288   0 08:12 ?        00:00:00     /usr/sbin/httpd.worker
5 S apache    2724  2720  0  80   0 - 132187 pipe_w 3292   0 08:12 ?        00:00:00     /usr/sbin/httpd.worker
5 S apache    2726  2720  0  80   0 - 132187 pipe_w 3296   0 08:12 ?        00:00:00     /usr/sbin/httpd.worker


Apache event 模型;

Apache  Multipath Processing Module _apache   Multip_04

Apache event一个线程响应多个请求,event-driven: 事件驱动,主要目的在于实现单线程响应多个请求;event,为什么能够一个线程能够详细多个用户请求呢?它其实是基于网络I/O模型中的I/O复用去实现的,什么是网络I/O复用?这里比较复杂,所以我们会专门写一篇关于网络I/O模型,以及磁盘I/O模型的博客.httpd2.4.9中开始正式采用这种基于事件的模型.所以想用最新的特性,最新的功能就必须编译安装,你懂得; event每一个进程占用内存的空间很大.使用场景比如说淘宝,百度每天的请求都是海量的.你懂的,前两种模型就不是很适合这种高并发请求的应用场景.


httpd-2.4 编译安装

依赖于更高版本的aprapr-utilapr全称为apache portable runtime

(1) 解决依赖关系,(2) 编译安装apr-1.5.0 (3) 编译安装apr-util-1.5.2 (4) httpd编译安装 --with-mpm=event

#yum -y install pcre-devel

#tar xf apr-1.5.0.tar.bz2
#cd apr-1.5.0
#./configure --prefix=/usr/local/apr
#make && make install
#tar xf apr-util-1.5.2.tar.bz2
#cd apr-util-1.5.2
#./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
#make && make install

# tar xf httpd-2.4.9.tar.bz2
# cd httpd-2.4.9
# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=event
# make && make install

  Apache 2.4.9 配置文件采用的是模块化分散的机制;httpd编译安装默认的用户就是daemon;

# ls
extra  httpd.conf  magic  mime.types  original

[root@localhost extra]# ls
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
<IfModule mpm_event_module>
    StartServers             3 :# 启动的子进程的个数
    MinSpareThreads         75 :# 最小空闲线程数
    MaxSpareThreads        250 : # 最大空闲线程数
    ThreadsPerChild         25 :# 每个子进程可生成的线程数
    MaxRequestWorkers      400 :# 最大数量的工作线程数
    MaxConnectionsPerChild  0 :# 每个子进程能够处理的最大连接数,0表示不限定;
</IfModule>
# ps -elFH | grep httpd
1 S root      1604     1  0  80   0 - 19241 poll_s  2380   0 10:21 ?        00:00:01   /usr/local/apache/bin/httpd
5 S daemon    1606  1604  0  80   0 - 105306 pipe_w 2244   0 10:21 ?        00:00:03     /usr/local/apache/bin/httpd
5 S daemon    1608  1604  0  80   0 - 105306 pipe_w 2244   0 10:21 ?        00:00:03     /usr/local/apache/bin/httpd
5 S daemon    1609  1604  0  80   0 - 105306 pipe_w 2248   0 10:21 ?        00:00:04     /usr/local/apache/bin/httpd