Apache有三种稳定的工作模式,称为多进程处理模块MPM
1.Prefork工作模式
apache在启动之初,就预先派生一些子进程,然后等待请求过来;每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
优点:成熟稳定,兼容所有模块,线程安全性高
缺点:不适合处理高并发请求;一个进程相对占用更多的系统资源,消耗更多的内存
2.Worker工作模式
使用多进程和多线程的混合模式,也预先派生了几个子进程(数量远少于prefork派生的);每个子进程创建多个线程,包括一个监听线程;每个请求会被分配一个线程来服务
优点:占据更少的内存(多个线程通常会共享父进程的内存),适合高并发的场景
缺点:必须考虑线程安全的问题,使用keep-alive长连接的时候,某个线程会被一直占用,即使没有收到请求,需要等待到超时才会释放;一个线程出现问题也会导致同一进程下的线程出现问题
keep-alive
在http早期,每个http请求都要求打开一个tcp socket连接,并且使用之后就断开这个tcp连接;
设置keepalive_timeout之后,httpd守护进程便会等待浏览器还有没有请求,这个等待就是keepalive_timeout时间;如果在规定的等待时间内没有收到浏览器发来的http请求,则关闭这个http连接;
优点:减少tcp连接的建立次数;减少time_wait状态连接;提高性能和提高httpd服务器的吞吐率
缺点:长时间的tcp连接容易导致系统资源无效占用;配置不当的keep-alive,比重复利用连接带来的损失大
3.Event工作模式
类似于worker的工作模式,最大区别是它解决了keep-alive场景下,长期被占用的线程的资源的浪费问题;event模式下,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实的请求过来的时候,将请求传递给服务线程,执行完毕又允许它释放
优点:增强了高并发场景下的请求处理能力,减少tcp的连接数量
缺点:Event PMP不能在https访问下工作
查看apache工作模式的方法:
httpd -V |grep -i "Server MPM"
指定的方式:
在编译时使用 --with-mpm=xxx