httpd的特性:
- 高度模块化:core + modules
- 模块化设计DSO:Dynamic Shared Object
- MPM:Multipath Processing Modules 多路处理模块
perfork MPM:多进程模型,每个进程响应一个请求 (并发模型不能超过1024个)
一个主进程:负责生成子N个子进程及回收子进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个。负责创建套接字,负责接收请求并将其派发给某子进程进行处理;
n个子进程:每个子进程处理一个请求;
工作模型:会预先生成N个空闲进程,随时等待用于响应用户请求。
prefork的默认配置(httpd2.2) <IfModule prefork.c> StartServers 8 #进程启动后立即启动的空闲进程数量 MinSpareServers 5 #最小空闲进程数量 MaxSpareServers 20 #最大空闲进程数量 ServerLimit 256 #一个周期内允许最大的进程数量 MaxClients 256 #最大允许启动的服务器子进程数量 MaxRequestsPerChild 4000 #允许最大请求的数量(超过数量就会关闭该进程,设置为0则永不过期) </IfModule>
worker MPM 多线程模型(多进程生成,一个进程生成多个线程)每个线程处理一个用户请求
一个主进程:负责生成子进程,创建套接字;负责接收请求,并将其派发给某子进程进行处理;
n个子进程:每个子进程负责生成多个线程;
每个线程:负责响应用户请求,其并发响应数量为:m*n (m:子进程数量;n:每个子进程所能创建的最大线程数量)。
worker的默认配置(httpd2.2) <IfModule worker.c> StartServers 3 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 #每个子进程所能创建的最大线程数量 MaxRequestsPerChild 0 #0表示不限制 </IfModule>
event MPM :事件驱动模型(多进程模式),每个进程响应多个请求
一个主进程 :负责生成子进程,负责创建套接字,负责接收请求并将其派发给某子进程进行处理
n个子进程:基于事件驱动机制直接响应多个请求,其并发响应数量为:m*n (m:子进程数量;n:每个子进程响应的请求数量)。
<IfModule mpm_event_module>(httpd2.4) StartServers 3 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 0 </IfModule> 附:httpd2.2默认没有给出event模型的配置内容,但从测试运行的结果来看,配置应该同worker模型接近。
对比httpd2.2和httpd2.4
①httpd2.2不支持同时编译多个MPM模块,只能在编译时选定要使用哪个,为此rpm包提供了三个应用程序文件:httpd(prefork), httpd.worker, httpd.event,分别用于实现对不同的MPM机制的支持;默认使用的模块为/usr/sbin/httpd,其为prefork的MPM模块。
如果要更改MPM,直接修改配置文件/etc/sysconfig/httpd:
HTTPD=/usr/sbin/httpd.{worker,event}
修改后重启服务service httpd restart,此时可通过 ps aux | grep httpd 或 htttpd -M | grep mpm查看是否更换成功。
②httpd2.4支持动态编译多个MPM模块,如果要更换MPM,修改配置文件 /etc/httpd/conf.modules.d/00-pmp.conf:
LoadModule mpm_{worker,event}_module modules/mod_mpm_{worker,event}.so
修改后重启服务systemctl restart httpd.service,此时可通过 ps aux | grep httpd或 htttpd -M | grep mpm查看是否更换成功。
附:httpd2.4.6没有直接给出3种mpm的默认配置,但是通过/usr/share/doc/httpd-2.4.6/httpd-mpm.conf文件可以查看到相关的配置;如果我们想修改配置可参考文档修改/etc/httpd/conf/httpd.conf文件即可。此处我修改了worker mpm,内容如下:
httpd2.4切换成worker模型,需要修改配置文件/etc/httpd/conf.modules.d/00-mpm.conf,内容如下:
重新启动httpd服务,发现有7条线程;即使是默认的配置也是会多出1条线程,没有找到原因:
并发服务器响应请求:
单进程I/O模型
多进程I/O模型
复用的I/O模型:多线程模型和事件驱动
利用的多进程I/O模型
https://www.cnblogs.com/walk1314/p/9112249.html