废话不多说直接上图:

   prefork模型

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

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

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

apache Worker模型

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

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

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

# vim /etc/sysconfig/httpd# grep '^HTTPD' /etc/sysconfig/httpdHTTPD=/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.worker5 S apache    2723  2720  0  80   0 - 132187 pipe_w 3288   0 08:12 ?        00:00:00     /usr/sbin/httpd.worker5 S apache    2724  2720  0  80   0 - 132187 pipe_w 3292   0 08:12 ?        00:00:00     /usr/sbin/httpd.worker5 S apache    2726  2720  0  80   0 - 132187 pipe_w 3296   0 08:12 ?        00:00:00     /usr/sbin/httpd.worker

Apache event 模型;

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;

# lsextra  httpd.conf  magic  mime.types  original

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