【apache的工作模式】
银行开门营业,银行需要有工作人员,去处理客户的问题
银行还得打开处理业务的窗口
1号窗口
窗口内的工作人员,是干活的,解决客户问题
2号窗口
窗口内的工作人员,是干活的,解决客户问题
银行:linux操作系统,apache主程序
客户的问题:linux接收到的用户请求,用户通过浏览器发来的访问请求
apache主程序再打开一个进程去处理用户的请求(开通一个银行窗口)
干活的其实是该进程,创建的线程(线程就好比银行窗口内的工作人员)
apache提供了3种工作模式
【prefork】
是在apache,httpd服务刚启动的时候,就预先fork一些进程,并且这些进程等待用户的请求(银行的窗口,等待客户来办
业务),这么做事为了减少,频繁的创建和销毁进程,带来的额外系统开销
该prefork模式下,一个进程只有一个线程,一个时间内,只能处理一个请求(一个窗口只有一个业务员,只能办理一个客户
的问题)
优点:成熟稳定,兼容所有的Apache模块,并且不用更担心线程冲突问题
缺点:多个进程占用较多的系统资源,消耗了较多的内容,并且该模式,不是和并发场景
(银行无论业务是否繁忙,都得预先开通很多个窗口,造成了人员、场地的浪费,无法处理业务高峰期)
【worker】
使用多进程+多线程的混合模式,也是预先打开多个进程(数量少一些),每个子进程,都会创建一些线程。同时还会有
一个监听线程,每个请求来了之后,会分配给一个线程去处理。
线程单位比起进程单位,是消耗较少的内存,在高并发场景下,适合worker模式
(银行多个窗口,每个窗口有多个工作人员)
优点:worker模式,占用更少的内存
缺点:需要考虑多现充,资源抢夺的问题
【event】
和worker模式还是比较相似,解决了TCP的keep-alived长连接的问题,当请求来了之后,交给一个子线程去处理,如
果该TCP长连接,长时间占用线程资源,对系统开销较大,,那么event模式会默认开启一个监听线程,检测到当子线程处理完毕
请求之后,会释放该线程,减轻服务器的压力
检查默认的apache工作模式
[root@backup html]# httpd -V|grep -i "server mpm"
AH00558: httpd: Could not reliably determine the server‘s fully qualified domain name, using 172.16.1.41. Set the ‘ServerName‘ directive globally to suppress this message
Server MPM: prefork
在默认prefork模式下,刚启动apache,httpd服务的时候就会打开的进程查看