apache2.x支持插入式并行处理模块,称为多路处理模块(MPM),在编译时必须选择也只能选择一个MPM
prefork模式
prefork是一个多路处理模块MPM,实现了一个进程型的、预派生的web服务器,适合于没有线程安全库、需要避免线程兼容性问题的系统
在要求每个请求相互独立的情况下具有很好的特性,若一个请求出现问题不会影响到其他请求
具有很强的自我调节能力,只需要很少的配置指令进行调整就可以适合于企业应用要求
最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以避免所需的内存超出物理内存的大小
一个单独的控制进程(父进程)负责产生子进程,子进程用于监听请求并作出应答,因此在内存中存在一些备用的(spare)或是空闲的子进程用于响应新的请求,可加快响应速度父进程通常以root身份运行,以便绑定80端口,子进程通常以一个低特权的用户运行,可通过User和Group配置
运行子进程的用户必须要对网站内容有读取权限,但是对其他资源必须拥有尽可能少的术系统安全
编译安装时没有指定工作模式,默认会使用prefork模式,可用httpd -l 查看
在httpd的配置文件中包含prefork的配置文件
Include conf/extra/httpd-mpm.conf
conf/extra/httpd-mpm.conf
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
参数 | 说明 |
---|---|
ServerLimit | 最大进程数 |
StartServers | 启动的时候创建的进程数量 |
MinSpareServers | 最少空闲进程 |
MacSpareServers | 最多空闲进程 |
MaxClients | 最多创建多少个进程用来处理请求 |
MaxRequestsPerChild | 每个进程处理的最大请求数,达到请求数,进程即被销毁,如果设置为0,子进程永远不会结束 |
worker模式
worker模式支持混合的多线程多进程,可处理海量请求
该模式下每个进程能拥有的线程数量是固定的,服务器会根据负载情况±进程数量
一个父进程负责子进程的建立
每个子进程能建立一定数量的服务线程和一个监听线程,监听进程监听接入请求并将其传递给服务线程处理和应答
换成worker模式:
在编译时添加–with-mpm=worker参数
重新安装
同样在主配置文件中包含worker的配置文件
Include conf/extra/httpd-mpm.conf
conf/extra/httpd-mpm.conf
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
参数 | 说明 |
---|---|
ServerLimit | 最大进程数,默认值是16 |
ThreadLimit | 每个子进程的最大线程数,默认值是64 |
StartServers | 服务器启动时简历的子进程数,默认值是3 |
MaxClients | 允许同时接受的最大接入请求数量(最大线程数量) |
MinSpareThreads | 最小空闲线程数,默认值是75 |
ThreadsPerChild | 每个子进程建立的常驻的执行线程数,默认值是25 |
MaxRequestsPerChild | 设置每个子进程在其生存期内允许伺服的最大请求数量,设置为0,子进程永不结束 |
event模式
event和worker很像,不同在于解决了keepalive长连接的时候占用线程资源被浪费的问题
遇到某些不兼容的模块时会失效并回退到worker模式
需要Linux2.6+对epoll的支持,需要补充的是ssl(secure socket layer)连接
有专门的线程来管理keepalive类型的线程
在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程
当有真实亲求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放
这样,一个线程就能处理几个请求了,实现了异步非阻塞。这增强了在高并发场景下的请求处理
参数 | 说明 |
---|---|
StartServers | 服务启动时初始的进程数,默认3 |
MinSpareThreads | 最小的空闲子进程数,默认75 |
MaxSpareThreads | 最大的空闲子进程数,默认250 |
ThreadsPerChild | 每个子进程产生的线程数量,默认是25 |
MaxRequestWorkers | 限定同一时间内客户端最大接入的请求数量,默认是400 |
MaxConnectionPerChild | 每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。将该值设置为非0值,可以防止运行php导致的内存泄露 |