Apache 工作模式
概述
apache的工作模式有:beos,netware,prefork,worker , event,mpmt_os2,mpm_winnt。
查看当前模式: #http –l 或 #apachectl –l
Apache在configure配置编译参数的时候,可以使用 --with-mpm=prefork 来指定编译为那一种MPM,当然也可以用编译为都支持: --enable-mpms-shared=all ,所有此平台支持的 MPM 模块都会被安装。
默认选项 : Unix 系统是 prefork,worker 或 event , Window 系统是 mpm_winnt
mpm_winnt 模式
它使用单个控制进程启动单个子进程,该子进程又创建线程来处理请求
<IfModule mpm_winnt_module> ThreadsPerChild 150 #设置并发客户端连接的最大数量 MaxRequestsPerChild 3000 #到达MaxRequestsPerChild的限制后,子进程将会结束,假如MaxRequestsPerChild为0,子进程将永远不会结束 </IfModule>
worker 模式
实现了一个混合多进程多线程服务器。通过使用线程来处理请求,它能够以比基于进程的服务器更少的系统资源来处理大量请求。但是,它通过保持多个进程可用,每个进程都有许多线程,从而保留了基于进程的服务器的大部分稳定性。
<IfModule mpm_worker_module> StartServers 2 #最初启动的进程数 MaxRequestWorkers 150 #可以启动的最大线程总数,有的apache 没有这个配置项 MaxClients 150 # 客户端最大接入请求的数量 MinSpareThreads 25 #用于处理请求峰值的最小空闲线程数 MaxSpareThreads 75 #最大空闲线程数 ThreadsPerChild 25 #每个子进程部署的线程数 MaxRequestsPerChild 0 #每个子进程再其存活期内允许服服的最大请求数量,为0,子进程将永远不会结束 </IfModule>
运作原理:
单个控制进程(父进程)负责启动子进程。每个子进程创建ThreadsPerChild
指令中指定的固定数量的服务器线程,以及一个侦听器线程,用于侦听连接并在连接到达时将它们传递给服务器线程进行处理。
Apache HTTP Server 总是试图维护一个备用或空闲服务器线程池,这些线程随时准备为传入的请求提供服务。通过这种方式,客户端无需等待新线程或新进程的创建就可以为其请求提供服务。最初启动的进程数由StartServers
指令设置。在运行过程中,服务器会评估所有进程中空闲线程的总数,并分叉或杀死进程以使该数量保持在由MinSpareThreads
和指定的边界内MaxSpareThreads
. 由于这个过程是非常自我调节的,因此很少需要修改这些指令的默认值。可以同时服务的最大客户端数(即所有进程中的最大线程总数)由 MaxRequestWorkers
指令确定。活动子进程的最大数量由MaxRequestWorkers
指令除以 ThreadsPerChild
指令确定。
两个指令对活动子进程的数量和子进程中的服务器线程数设置了硬限制,并且只能通过完全停止服务器然后重新启动来更改。 ServerLimit
是对活动子进程数量的硬性限制,必须大于或等于 MaxRequestWorkers
指令除以 ThreadsPerChild
指令。 ThreadLimit
是服务器线程数的硬限制,必须大于或等于该ThreadsPerChild
指令。
除了一组活动的子进程之外,可能还有其他正在终止的子进程,但至少有一个服务器线程仍在处理现有的客户端连接。可能存在直至MaxRequestWorkers
终止的进程,但实际数量预计会小得多。可以通过禁用单个子进程的终止来避免这种行为,这可以通过以下方式实现: MaxRequestsPerChild 0 或者 设置 MaxSpareThreads 与 MaxRequestWorkers 一样的值。
event 模式
通过将一些处理工作传递给侦听器线程来允许同时处理更多请求,从而释放工作线程以服务新请求。
event 与 worker 的关系:
event
基于worker
MPM,实现了混合多进程多线程服务器。单个控制进程(父进程)负责启动子进程。每个子进程创建ThreadsPerChild
指令中指定的固定数量的服务器线程,以及一个侦听器线程,用于侦听连接并将它们传递给工作线程以在它们到达时进行处理。运行时配置指令与 提供的相同worker
,只是添加了AsyncRequestWorkerFactor
.
运作原理:
此 MPM 尝试修复 HTTP 中的“保持活动状态”问题。客户端完成第一个请求后,它可以保持连接打开,使用同一个套接字发送更多请求,并节省大量创建 TCP 连接的开销。然而,Apache HTTP Server 传统上让整个子进程/线程等待来自客户端的数据,这也带来了自身的缺点。为了解决这个问题,这个 MPM 为每个进程使用一个专用的侦听器线程来处理侦听套接字、所有处于 Keep Alive 状态的套接字、处理程序和协议过滤器已完成工作的套接字以及唯一剩余的套接字要做的就是将数据发送给客户端。单个进程/线程块可以处理的连接总数由AsyncRequestWorkerFactor
指令规定。
prefork 模式
实现了一个非线程的预分叉 Web 服务器。每个服务器进程都可以响应传入的请求,并且父进程管理服务器池的大小。它适用于需要避免线程以与非线程安全库兼容的站点。它也是隔离每个请求的最佳 MPM,这样单个请求的问题不会影响到任何其他请求。
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0 </IfModule>
运行原理:
单个控制进程负责启动子进程,这些子进程侦听连接并在连接到达时为其提供服务。Apache httpd 总是试图维护几个备用 或空闲的服务器进程,这些进程随时准备为传入的请求提供服务。通过这种方式,客户端无需等待新的子进程被派生,就可以为其请求提供服务。
, StartServers
, MinSpareServers
和 规范父进程如何创建MaxSpareServers
子 MaxRequestWorkers
进程来服务请求。一般来说,Apache httpd 是非常自我调节的,因此大多数站点不需要从它们的默认值调整这些指令。需要同时处理超过 256 个请求的站点可能需要增加MaxRequestWorkers
,而内存有限的站点可能需要减少MaxRequestWorkers
以防止服务器抖动(将内存交换到磁盘并返回)。性能提示 文档中提供了有关调整过程创建的更多信息。
虽然父进程通常root
在 Unix 下启动以绑定到端口 80,但子进程由 Apache httpd 作为低权限用户启动。和指令用于设置 Apache httpd 子进程的权限User
。Group
子进程必须能够读取将要提供的所有内容,但除此之外应该拥有尽可能少的权限。
MaxConnectionsPerChild
通过杀死旧进程并启动新进程来控制服务器回收进程的频率。
额外说明
MaxSpareServers
指令设置所需的最大空闲子服务器进程数。空闲进程是不处理请求的进程。如果有超过MaxSpareServers
空闲的,那么父进程将杀死多余的进程。只有在非常繁忙的站点上才需要调整此参数。将此参数设置为较大的数字几乎总是一个坏主意。如果您尝试将该值设置为等于或小于 MinSpareServers
,Apache HTTP Server 会自动将其调整为MinSpareServers
+ 1
。
该MinSpareServers
指令设置所需的空闲子服务器进程的最小数量。空闲进程是不处理请求的进程。如果少于MinSpareServers
空闲,则父进程创建新的子进程:它将产生一个,等待一秒钟,然后产生两个,等待一秒钟,然后产生四个,它将以指数方式继续,直到每秒产生 32 个子进程。只要满足MinSpareServers
设置就会停止。只有在非常繁忙的站点上才需要调整此参数。将此参数设置为较大的数字几乎总是一个坏主意。
要求更高伸缩性的站点可以选择使用线程的 MPM,即 worker
或 event
; 需要可靠性或者与旧软件兼容的站点可以使用 prefork
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!