Apache工作模式介绍
源码包安装 httpd 时可查看 httpd-mpm.conf 文件
工作模式类型
- Event模式
- Prefork模式
- Worker模式
一、event模式
event 工作模式介绍:
1、event 是Apache 最新的工作模式,它和 worker模式很像,不同的是在于它解决了keep-alive 长连接的时候占用线程资源被浪费的问题;
2、event 工作模式在遇到某些不兼容的模块时,会失效,将会退回到worker模式;
3、event 工作模式需要 linux系统,对epoll的支持,才能启用,需要补充的是HTTPS的连接(SSL)
(2)event 工作方式:
1、event工作模式中,会有一些专门的线程用来管理这些 keep-alive 类型的线程;
2、当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放;
3、这样,一个线程就能处理几个请求了,实现了异步非阻塞,这增强了在高并发场景下的请求处理。
(3)、event工作参数
参数 | 说明 |
---|---|
StartServers | 服务启动时初始的进程数,默认3 |
MinSpareThreads | 最小的空闲子进程数,默认75 |
MaxSpareThreads | 最大的空闲子进程数,默认250 |
ThreadsPerChild | 每个子进程产生的线程数量,默认是25 |
MaxRequsetWorkers | 限定同一时间内客户端最大接入的请求数量,默认是400 |
MaxConnectionPerChild | 每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。将该值设置为非0值,可以防止运行PHP导致的内存泄露 |
二、prefork模式
(1)、prefork工作模式介绍
prefork模式实现了一个非线程的预派发的Web服务器,它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。prefork模式具有很强的自我调节能力,只需要很少的配置指令调至。最重要的是可将MaxClients设置为一个足够强大的数值以处理潜在的请求高峰,同时又不能太大,以免需要使用的内存超出物理内存的大小。
出于稳定性和安全性考虑,不建议更换Apache 2 的运行方式,使用系统默认的prefork模式即可。另外很多php模块不能在工作worker模式下,列例如RedHat Linux 自带的php就不能支持线程安全。
(2)、prefork工作方式
编译安装Apache时,如果没有指定工作模式,默认会使用prefork模式。可以使用httpd -l命令查看,prefork.c表示当前运行的是prefork工作模式
(3)、prefork工作参数
参数 | 说明 |
---|---|
ServerLimit | 最大进程数 |
StartServers | 启动的时候创建的进程数量 |
MinSpareServers | 最少空闲进程 |
MaxSpareServers | 最多空闲进程 |
MaxClients | 最多创建多少个子进程用来处理请求 |
MaxRequestsPerChild | 每个进程处理的最大请求数,达到请求数,进程即被销毁,如果设置为0,子进程永远不会结束 |
三、worker模式
(1)、worker工作模式介绍
worker模式使用Web服务器支持混合的多线程进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进程,而每个进程又有多个线程,以获得基于进程的MPM的稳定性。
(2)、worker工作模式
worker模块每个进程能够拥有的线程数量是固定的,服务器根据负载情况增加或减少进程数量。一个单独的控制进程负责子进程的建立,而每个子进程能够建一定数量的服务线程和一个监听线程,监听线程监听接入请求并将其传递给服务线程处理和应答。
(3)、worker工作参数
参数 | 说明 |
---|---|
ServerLimit | 最大进程数,默认值是"16" |
ThreadLimit | 每个子进程的最大线程数,默认值是"64" |
StartServers | 服务器启动时建立的子进程数,默认值是"3" |
MaxClients | 允许同时接受的最大接入请求数量(最大线程数量) |
MinSpareThreads | 最小空闲线程数,默认值是"75" |
MaxSpareThreads | 设置最大空闲线程数。默认值是"250" |
ThreadsPerChild | 每个子进程建立的常驻的执行线程数。默认值是25 |
MaxRequestsPerChild | 设置每个子进程在其生存周期内允许伺服的最大请求数。设置为"0",子进程将永远不会就结束 |