Apache工作模式

1.prefork.c模块(一个非线程型的、预派生的MPM)
2.worker.c模块(支持混合的多线程多进程的多路处理模块)
Apache配置文件路径是/etc/httpd/conf/,在这个路径下面vi httpd.conf,将以下内容添加到httpd.conf文件的最后,保存并退出,然后重启Apache服务(service httpd restart),最后在浏览器中输入192.168.0.99/server-status

<Location /server-status>
Order allow,deny
Deny from nothing
Allow from all
SetHandler server-status
</Location>
ExtendedStatus On
<Location /server-info>  # server-info是配置apache监听的
SetHandler server-info
Order allow,deny
Deny from nothing
Allow from all
</Location>

prefork MPM使用多个子进程,每个子进程只有一个线程,每个进程在某个确定的时间只能维持一个连接,在大多数平台上,Prefork MPM比Worker MPM效率高,但要消耗更多的内存,prefork的无线程设计在某些情况下比worker更有优势:他能够使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,他也更容易调试一些,模式是以进程为主的模式,速度比较快,比较稳定,但不支持大并发,起太多进程操作系统接受不了,造成了prefork模式稳定,高效,无法支持大并发,prefork工作模式适用于石油系统,没有什么并发

Apache工作模式之prefork模式
ServerLimit 2000
默认的MaxClient最大是256个线程,假如想配置更大的值,就得加上ServerLimit这个参数,20000是ServerLimit这个参数的最大值,加入需要更大,则必须编译apache,此前都是无需重新编译Apache生效前提:必须放在其他指令的前面
MaxClients
限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认是256,任何超过MaxClients限制的请求都将进入等候队列,一旦一个连接被释放,队列中的请求将得到服务,要增大这个值,必须同时增大ServerLimit
StartServers 5
指定服务器启动时建立的子进程数量,prefork默认为5
MinSpareServers 5
指定空闲子进程的最小数量,默认为5,假如当前空闲子进程数少于MinSpareServers,那么Apache将以最大一秒一个的速度产生新的子进程,此参数不要设的太大
MaxSpareServers 10
配置空闲子进程的最大数量,默认为10,加入当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程,此参数不要设的太大,假如将该指令的值配置的比MinSpareServers小,Apache将会自动将其修改成MinSpareServers+1
MaxRequestsPerChild 10000
每个子进程再其存活期内允许伺服的最大请求数量,默认为10000,到达MaxRequestsPerChild的限制后,子进程将会结束,假如MaxRequestsPerChild为0,子进程将永远不会结束

将MaxRequestsPerChild配置成非零值有两个好处:
a.能够防止(偶然的)内存泄漏无限进行,从而耗尽内存
b.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量

将以下内容添加到httpd.conf文件的最后,保存并退出,然后重启Apache服务(service httpd restart),最后在浏览器中刷新192.168.0.99/server-status这个网页
<IfModule mpm_prefork_module>
StartServers 5   # Apache启动时默认初始化5个进程
MinSpareServers 5   # 最小空闲进程
MaxSpareServers 10   # 最大空闲进程
MaxClients 150   # 客户端最大接入请求的数量
MaxRequestsPerChild 0   # 生命周期,0表示永远不结束
</IfModule>

Apache工作模式之worker模式
worker MPM使用多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的http服务器上,worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多,但worker MPM也有不完善的地方,假如一个线程崩溃,整个进程就会连同其任何线程一起"死掉",由于线程共享内存空间,所以一个程序在运行时必须被系统识别为"每个线程都是安全的"

worker模式是一种多进程多线程的工作模式,它会起多个进程,但是每个进程下面有多个线程,线程很多,进程很少,worker工作模式支持的并发会大一些,在互联网使用大并发基本都使用worker模式
这两种工作模式都是预派生,预派生会事先把进程和线程准备好
在性能测试过程中一般把最大和最小的创建成一致,减少大量的创建和销毁,减少资源的浪费

ServerLimit 50
服务器允许配置的进程数上限,值必须大于等于MaxClients/ThreadsPerChild,这个指令和ThreadLimit结合使用配置了MaxClients最大允许配置的数值
ThreadLimit 200
每个子进程可配置的线程数上限,这个指令配置了每个子进程可配置的线程数ThreadsPerChild上限,该值应该跟ThreadsPerChild可能达到的最大值保持一致,ThreadLimit >=ThreadsPerChild
StartServers 5
服务器启动时建立的子进程数
MinSpareThreads 25
最小空闲线程数,这个MPM将基于整个服务器监控空闲线程数,假如服务器中总的空闲线程数太少,子进程将产生新的空闲线程
MaxSpareThreads 500
最大空闲线程数,这个MPM将基于整个服务器监控空闲线程数,假如服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程
MaxClients 5000
允许同时伺服的最大接入请求数量(最大线程数量),任何超过MaxClients限制的请求都将进入等候队列,因此要增加MaxClients的时候,必须同时增加ServerLimit的值
ThreadsPerChild 100
每个子进程建立的常驻的执行线程数,子进程在启动时建立这些线程后就不再建立新的线程了
MaxRequestsPerChild 0
配置每个子进程在其生存期间允许伺服的最大请求数量,到达MaxRequestsPerChild的限制后,子进程将会结束,假如MaxRequestsPerChild为"0",子进程将永远不会结束

安装worker模式
第一步:
进入/usr/sbin目录,cd /usr/sbin
第二步:
将当前的prefork模式启动文件改名,mv httpd httpd.prefork
第三步:
将worker模式的启动文件改名,mv httpd.worker httpd,重启httpd会报错,yum install php-zts,重启Apache服务,/etc/init.d/httpd restart就会成功了,刷新页面看变化
第四步:
修改配置文件 vi /etc/httpd/conf/httpd.conf
找到里面的如下内容,可适当修改负载等参数:
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25//每个进程下的常驻线程数
MaxRequestsPerChild 0
</IfModule>
不管MinSpareThreads和MaxSpareThreads怎么变都是进程+1,-1的过程,优先满足MinSpareThreads,MinSpareThreads满足后再满足MaxSpareThreads,如果MaxSpareThreads小于等于MinSpareThreads,MaxSpareThreads失效

把之前的prefork模式注释掉,如上图
第五步:
重新启动服务,/etc/init.d/httpd restart

-enable-file-cache提供文件描述符缓存支持,从而提升Apache性能

原文地址:https://www.cnblogs.com/laosun0204/p/14504287.html