废话不多说直接上图:
prefork模型
<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模型
<IfModule worker.c> StartServers 4 # 默认启动的工作进程数; MaxClients 300 # 并发请求的最大数; MinSpareThreads 25 # 最小空闲线程数; MaxSpareThreads 75 #最大空闲线程数; ThreadsPerChild 25 # 每个子进程可生成的线程数; MaxRequestsPerChild 0 #每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定; </IfModule>
worker 模型相对于prefork模型来说就相对没那么稳定了,因为worker是基于线程工作的,在线程的环境下,如下图所示:同一个进程的中的多个线程的资源是共享的,如果用户请求的资源,由一个线程回应,如果这个线程奔溃了,那么这个进程中共享资源的线程就全军覆没啦.
切换为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 event一个线程响应多个请求,event-driven: 事件驱动,主要目的在于实现单线程响应多个请求;event,为什么能够一个线程能够详细多个用户请求呢?它其实是基于网络I/O模型中的I/O复用去实现的,什么是网络I/O复用?这里比较复杂,所以我们会专门写一篇关于网络I/O模型,以及磁盘I/O模型的博客.在httpd2.4.9中开始正式采用这种基于事件的模型.所以想用最新的特性,最新的功能就必须编译安装,你懂得; event每一个进程占用内存的空间很大.使用场景比如说淘宝,百度每天的请求都是海量的.你懂的,前两种模型就不是很适合这种高并发请求的应用场景.
httpd-2.4 编译安装
依赖于更高版本的apr和apr-util。apr全称为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