apache

参考链接#apache 官网

  • Web Server 是一种B/S服务方式 Request<=> Response
  • apache 是一种广泛使用的Web Server 以跨平台、高效稳定著称
  • 大的历史版本大概分为如下:版本的更迭也表明了apache在运行机制的优化的努力
V#1.x  提供现在认为的协议以及基础模块和跨平台支持

V#2.0  提供新的http接口实现方式及unicode /正则 /MPM ARP( multi-processing modules (MPMs) and the Apache Portable Runtime (APR))  

V#2.2  代理模块,原有功能优化升级 加入 Eevent MPM 、mod_cache 和 mod_file_cache 将不再是试验模块,它们已经足够稳定,可以用于实际生产中了

v#2.4  功能优化升级、限流设置、mod_http2、更好的异步读写支持等 并且( The Event MPM is no longer experimental but is now fully supported) 推荐使用Event MPM 模型
  • 查看和配置

    httpd -l //查看工作模式 win平台 是 winnt 模式

    在configure配置编译参数 –with-mpm=prefork|worker|event 来指定编译MPM

    三种都支持:–enable-mpms-shared=all,在编译的时候会在modules目录下自动编译出三个MPM文件的so,然后通过修改httpd.conf配置文件更改MPM
    image

    Prefork MPM 稍早期版本默认模式 v1.3 ~ v2.0 (多进程处理模式)
  • 原理

1
2
1.启动阶段,根据配置初始化模块,就预先派生出一些子进程,子进程初始化
2.运行阶段:进程初始完成进入请求循环,等待客户端请求,每个子进程是单线程的,即一个进程同时只能处理一个请求,处理完请求结束当前请求,处理下一请求
  • 优缺点及使用场景

    1
    2
    3
    4
    5
    6
    7
    8
    9
    + 优点
    无需考虑线程安全问题
    兼容新老模块,成熟稳定
    + 缺点
    从运行原理可以看出 每个进程同时只能处理一个请求,所以在高并发请求下会排队等待空闲进程处理
    在常规请求下,每个进程相对占用更多的资源和内存
    在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放
    + 场景
    一般在非生产环境下或自己开发实践使用
  • 配置片段

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    <IfModule mpm_prefork_module>

    #服务器启动时建立的子进程数量
    StartServers 5

    #空闲子进程的最小数量,默认5;如果当前空闲子进程数少于MinSpareServers ,那么Apache将会产生新的子进程。此参数不要设的太大。
    MinSpareServers 5

    #空闲子进程的最大数量,默认10;如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程会杀死多余的子进程。此参数也不需要设置太大,如果你将其设置比 MinSpareServers 小,Apache会自动将其修改为MinSpareServers+1。
    MaxSpareServers 10

    #限定服务器同一时间内客户端最大接入的请求数量,默认是150;任何超过了该限制的请求都要进入等待队列,一旦一个个连接被释放,队列中的请求才将得到服务。
    MaxClients 150

    #每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。若该值设置为非0值,可以防止运行PHP导致的内存泄露。
    MaxRequestsPerChild 0
    </IfModule>

image

Work MPM v2.2 (多进程+多线程 处理模式)
  • 原理
1
2
1.启动阶段,根据配置初始化模块,就预先派生出一些子进程,子进程不直接处理请求,子进程初始化创建多个线程(包括一个监听线程),等待客户端请求过来
2.运行阶段:每个线程处理请求,请求完成可以退出也可以再处理下一个请求
  • 优缺点及使用场景

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    + 优点
    线程比起进程更轻,占用资源更少,
    高并发场景比prefork 处理更优秀
    每个线程出问题或者引起整个进程退出,但是不影响其他进程响应请求
    + 缺点
    多线程共享父进程内存地址,需要考虑线程安全问题
    在高并发下 keep-alive 处理请求能够减少资源的重复创建与销毁,但是在使用 keep-alive 引起阻塞,线程挂起,一直等到超时或者才被释放,如果过多线程进程被占用,将导致并发性能下降问题

    + 场景
    生产环境 集群环境等
  • 配置片段

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <IfModule mpm_worker_module>
    #服务器启动时建立的子进程数量
    StartServers 2

    #限定服务器同一时间内客户端最大接入的请求数量,默认是150;任何超过了该限制的请求都要进入等待队列,一旦一个个连接被释放,队列中的请求才将得到服务。
    MaxClients 150

    #空闲子进程的最小数量
    MinSpareThreads 25

    #空闲子进程的最大数量
    MaxSpareThreads 75

    #每个子进程产生的线程数量
    ThreadsPerChild 25

    #每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。将该值设置为非0值,可以防止运行PHP导致的内存泄露。
    MaxRequestsPerChild 0
    </IfModule>

image

Event MPM v2.4 (多进程+多线程+epoll(linux2.6 以上) 处理模式)
  • 原理
1
2
1.启动阶段,根据配置初始化模块,就预先派生出一些子进程,子进程不直接处理请求,子进程初始化创建多个线程(包括一个监听线程 主线程分配管理),有专门的线程管理 keep-alive 类型线程,等待客户端请求过来
2.运行阶段:每个线程处理请求,请求完成可以退出也可以再处理下一个请求
  • 优缺点及使用场景

    1
    2
    3
    4
    5
    6
    7
    8
    9
    + 优点
    线程比起进程更轻,占用资源更少,
    更强的高并发处理能力
    每个线程出问题或者引起整个进程退出,但是不影响其他进程响应请求
    + 缺点
    多线程共享父进程内存地址,需要考虑线程安全问题

    + 场景
    生产环境 集群环境等
  • 配置片段

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <IfModule mpm_event_module>
    StartServers 3
    ServerLimit 16
    MinSpareThreads 75
    MaxSpareThreads 250
    ThreadsPerChild 64
    MaxRequestWorkers 400
    MaxConnectionsPerChild 0 //如果设置为0,子进程将永远不会结 不建议设为0
    </IfModule>

image