废话不多说直接上图:
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 编译安装
依赖于更高版本的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;
# 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