本博文主要参数 Apache 2.2文档以及Apache模块开发指南

Apache的整个运行可以分为两个阶段:启动阶段和运行阶段。

在启动阶段时,它以ROOT特权来启动,进行解析配置文件(一般就是httpd.conf)、加载模块和初始化一些日志文件及内存共享段等操作,在启动阶段准备结束时,apache的控制转向多处理模块MPM,此时使得MPM能够在系统特权级运行,从而管理接下来的运行阶段。因为当处于运行阶段时,程序会放弃ROOT特权,以接收并处理网络中用户的服务请求,所以MPM也是在启动阶段初始化。

一,什么是MPM

MPM,是Multi -Processing Modules的缩写,就是多处理模块的意思,它是在Apache 2.0中引入的一个概念,共引入目标是将Apache的结构能够模块化,把核心的任务处理作为一个可插拔的模块来运行,这样就很容易根据不同的环境和应用来更有效的优化Apache的运行,它是Apache2.X中最影响其性能的,最核心的特性,因为直接决定了Apache的工作方式。这里有一个问题是:它究竟怎么样影响了Apache。

可以这么说:它决定了Apache以什么样的方式接入外部请求,如何Apache内部怎么样处理这个请求过程,这当然是最核心的了吧,比如它可以决定在处理外部请求的时候,需不需要启动多线程,如果是用多线程,最多可以多少个线程,一个进程可以产生最多多少个线程,类似于这种配置,都来自于MPM。MPM有一些指令可以专门用于调节父进程如何产生子进程,主要是StartServers,MinSpareServers,MaxSpareServers,MaxClients等,下面会介绍这些指令是什么意思。

它提供Apache服务程序和其所在的操作系统之间的接口,这个模块的主要职责是:

  1. 根据Apache运行的操作系统平台来优化Apache。
  2. 提高Apache的效率。
  3. 保证Apache的安全。

其实MPM本身也是一个模块,它是Apache中唯一一个系统层的模块,Apache在编译的时候选定一个所要使用的MPM模块,我们先来了解一下MPM模块在系统结构中的位置

在任何时候,一个正常的Apache都只有一个MPM模块在运行。

二,有哪些MPM可以被使用

在安装apache时,我们可以查看哪些MPM模块可以被使用。

[html] view
plain
copy

  1. [root@localhost httpd-2.2.11]# ./configure --help | grep mpm
  2. --with-mpm=MPM          Choose the process model for Apache to use.
  3. MPM={beos|event|worker|prefork|mpmt_os2}
  1. beos是BEOS上的缺省MPM模块。
  2. mpmt_os2,这是专门针对OS/2优化过的混合多进程多线程多路处理模块(MPM)。
  3. event,一个标准workerMPM的实验性变种。
  4. worker,线程型的MPM,实现了一个混合的多线程多处理MPM,允许一个子进程中包含多个线程。
  5. prefork,一个非线程型的、预派生的MPM。
下面分针对这些模块进行讨论,我们怎么知道当前apache是编译了哪个MPM使用呢?
[html] view
plain
copy

  1. [root@localhost httpd-2.2.11]# /install/apache2/bin/httpd -l
  2. Compiled in modules:
  3. core.c
  4. prefork.c
  5. http_core.c
  6. mod_so.c
  7. [root@localhost httpd-2.2.11]#

这表示Apache当前的正在工作的MPM是prefork工作方式的MPM,这也是一种缺省的模块,如果需要其它的MPM模块,在编译的时候用--with-mpm指定。


三,prefork 

       Apache MPM prefork实现了一个非线程型的、预派生的web服务器。适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。
       这种MPM的工作方式是:由一个单独的控制进程(父进程)产生子进程,然后将这些子进程用于监听请求并作出应答,这些子进程在处理时并不产生线程。另外,Apache总是试图保持一些备用的(spare)或者是空闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。
可以用于配置该MPM如何工作的主要参数有:
  1. StartServers。

    StartServers指令设置了服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。不同的MPM默认值也不一样。对于worker默认值是"3"。对于prefork默认值是"5"。
  2. MinSpareServers。

    MinSpareServers指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。。
  3. MaxSpareServers。MaxSpareServers指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成"MinSpareServers+1"。
  4. MaxClients。MaxClients指令设置了允许同时伺服的最大接入请求数量。任何超过MaxClients限制的请求都将进入等候队列,直到达到ListenBacklog指令限制的最大值为止。一旦一个链接被释放,队列中的请求将得到服务。对于非线程型的MPM(也就是prefork),MaxClients表示可以用于伺服客户端请求的最大子进程数量,默认值是256。要增大这个值,你必须同时增大ServerLimit
    。对于线程型或者混合型的MPM(也就是beos或worker),MaxClients表示可以用于伺服客户端请求的最大线程数量。线程型的beos的默认值是50。对于混合型的MPM默认值是16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要将MaxClients增加到超过16个进程才能提供的时候,你必须同时增加ServerLimit的值。。
  5. MaxRequestsPerChild。每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。如果 MaxRequestsPerChild为”0″,子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:

    1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。

    2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
  6. ServerLimit。对于prefork MPM,这个指令设置了MaxClients最大允许配置的数值。对于workerMPM,这个指令和ThreadLimit结合使用设置了MaxClients最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。
配置举例:
[html] view
plain
copy

  1. <IfModule prefork.c>
  2. StartServers       4 Apache启动时开启的子进程个数
  3. MinSpareServers    4 最小的空闲子进程
  4. MaxSpareServers    6 最大的空闲子进程
  5. ServerLimit      15
  6. MaxClients        12 以免产生大量的进程占用内存,影响系统性能
  7. MaxRequestsPerChild  1200 子进程在处理了1200个请求之后,就会被销毁,然后创建新进程。
  8. </IfModule>

四,worker

此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。控制这个MPM的最重要的指令是,控制每个子进程允许建立的线程数的ThreadsPerChild指令,和控制允许建立的总线程数的MaxClients指令。

每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可以建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。

Apache总是试图维持一个备用(spare)或是空闲的服务线程池。这样,客户端无须等待新线程或新进程的建立即可得到处理。初始化时建立的进程数量由StartServers指令决定。随后父进程检测所有子进程中空闲线程的总数,并新建或结束子进程使空闲线程的总数维持在MinSpareThreads和MaxSpareThreads所指定的范围内。由于这个过程是自动调整的,几乎没有必要修改这些指令的缺省值。可以并行处理的客户端的最大数量取决于MaxClients指令。活动子进程的最大数量取决于MaxClients除以ThreadsPerChild的值。

       有两个指令设置了活动子进程数量和每个子进程中线程数量的硬限制。要想改变这个硬限制必须完全停止服务器然后再启动服务器(直接重启是不行的),ServerLimit是活动子进程数量的硬限制,它必须大于或等于MaxClients除以ThreadsPerChild的值。ThreadLimit是所有服务线程总数的硬限制,它必须大于或等于ThreadsPerChild指令。这两个指令必须出现在其他workerMPM指令的前面。
在设置的活动子进程数量之外,还可能有额外的子进程处于"正在中止"的状态但是其中至少有一个服务线程仍然在处理客户端请求,直到到达MaxClients以致结束进程,虽然实际数量会很小。这个行为能够通过以下禁止特别的子进程中止的方法来避免:
  1. 将MaxRequestsPerChild设为"0"。
  2. 将MaxSpareThreads和MaxClients设为相同的值。
一个典型的该类型MPM配置如下:
[html] view
plain
copy

  1. ServerLimit 16
  2. StartServers 2
  3. MaxClients 150
  4. MinSpareThreads 25
  5. MaxSpareThreads 75
  6. ThreadsPerChild 25
五,小结

       Prefork MPM基于非线程模型,由独立的进程创建多个子进程的方式来工作,它在所有情况下都很安全,对运行非线程安全(non-thread-safe)模式的软件如PHP,它是唯一的安全选择。另外,对于某些应用程序,包括在 Apache 1.3上非常流行的程序(如简单静态页面、CGI脚本等),Prefork MPM是最好的选择。另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。但是由于每一个请求都会产生一个新的进程,导致系统资源(尤其是内存)消耗的很快,一旦并发量较大的时候,大量的Apache进程会占用巨大的内存空间。 

       Worker MPM基于线程模式,具有内存消耗低(对繁忙的服务很重要)、扩展性在某些特定应用情况下比Prefork更好等优点。在这个模式下,采用的进程和线程混合的形式处理请求。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的Prefork模式。
以上两种稳定的MPM方式在非常繁忙的服务器应用下都有些不足。尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载,但是 Keepalive需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。

Apache的多处理模块MPM的更多相关文章

  1. Apache的多路处理模块MPM:Prefork Worker Event

    如何确认当前apache使用哪种模式 通过/etc/init.d/httpd中的来确认系统apache的运行脚本路径 apachectl=/usr/sbin/apachectl httpd=${HTT ...

  2. Apache HTTP Server mod_session_dbd模块mod_session_dbd.c 安全漏洞

    漏洞名称: Apache HTTP Server mod_session_dbd模块mod_session_dbd.c 安全漏洞 CNNVD编号: CNNVD-201307-488 发布时间: 201 ...

  3. apache +php +php curl 模块设置

    2.2 linux 下面 2.2.1 web服务器安装 1目前采用的web服务器是apache2,在ubuntu 下安装 apt-getupdate apt-get installapache2 测试 ...

  4. wdlinux中apache配置反向代理模块

    想要在.htaccess中开启反向代理功能都不行[apache中没有mod_proxy模块] .htaccess 文件内容如下 RewriteEngine On RewriteBase / Rewri ...

  5. Apache is running a threaded MPM, but your PHP module is not compiled to be threadsafe. you need to recompile php. pre-configuration failed

    手动配置想要组合版本的wamp环境时,在服务器上直接下载的几个安装包怎么都组合安装不成功,纠结很久,终于找到原因.配置apache支持php后apache一直无法成功启动.后来发现php是nts的版本 ...

  6. LINUX下为apache 和 PHP 添加模块

    LINUX下为apache 和 PHP 添加模块https://www.path8.net/tn/archives/4717/opt/lampp/bin/httpd -V/opt/lampp/bin/ ...

  7. Apache学习---多进程处理模块(MPM)原理详解

    查看Apache的模式,可以使用httpd -V命令来查看: 1. prefork MPM prefork模式可以算是很古老但是非常稳定的Apache模式.Apache在启动之初,就预先fork一些子 ...

  8. apache开启url rewrite模块

    在把服务器数据转移到本地服务器之后,本地打开首页出现排版紊乱等问题,经过大神指点说是url rewrite的问题. 本篇文章主要写怎样开启apache的url rewrite功能. 打开Apache2 ...

  9. Apache设置防DDOS模块mod_evasive

    mod_evasive 是Apache(httpd)服务器的防DDOS的一个模块.对于WEB服务器来说,是目前比较好的一个防护DDOS攻击的扩展模块.虽然并不能完全防御 DDOS攻击,但在一定条件下, ...

随机推荐

  1. kamailio/opensips snmp/cacti/zabbix监控

        kamailio/opensips是现在比较流行的sip proxy,有配置灵活.性能强大.支持各种RFC等优点,是杀人越货.谈情说爱是必备佳品.要保证这么好的东西稳定运行,监控是必不可少的, ...

  2. 「LuoguP3808」 【模板】AC自动机(简单版)

    题目背景 通过套取数据而直接“打表”过题者,是作弊行为,发现即棕名. 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. ...

  3. vue 路由监听

    发现网上其实有很多种答案,但是测试之后发现很多都不行,或者写的不完整. 一.在app.vue组件内,增加监听$route,如下: watch: { $route(to, from) { console ...

  4. ubuntu系统,关于源(source)的配置

    1. 现象:(出现的错误) 执行 sudo apt-get update, 报错:apt-get 404 Not Found Package Repository Errors 执行 sudo apt ...

  5. 如何用vs2013开发人员命令提示工具执行一个方法(一个简单的demo)

    在任何一个编辑器中编写一个静态的Main方法,必须是静态且名为Main的方法,并将Main方法所在的类文件命名为yang.cs(这个名字随便命名),如图-1. 图-1 打开你的vs2013开发人员命令 ...

  6. SIP协议&开源SIP服务器搭建和客户端安装

    1. SIP SIP 是一个应用层的控制协议,可以用来建立,修改,和终止多媒体会话,例如Internet电话 SIP在建立和维持终止多媒体会话协议上,支持五个方面: 1)   用户定位: 检查终端用户 ...

  7. bzoj3836

    状压dp 图上怎么跑dp?我们跑三进制状压dp,0表示选了,1表示既没选也没覆盖,2表示没选但是被覆盖了. 状态是dp[dep][S]表示当前走到了深度为dep的节点,状态为S,按照dfs序转移 每次 ...

  8. 使用 Git 命令去管理项目的版本控制(二)

    参考 上一篇  完成本篇博客,本篇为作者原创,仅供学习参考. 本篇博文在上一篇的基础上这里记录了我的一个小模拟练习.本篇作为自己的学习笔记,也意在方便其他人的学习使用,达到分享目的.下面主要是操作截图 ...

  9. 3-C++程序的结构1.3

    类的友元 一个类之外的函数,又与该类有特殊关系! 友元关系提供了不同类或对象的成员函数之间.类的成员函数与一般函数之间进行数据共享的机制.通俗地说,友元关系就是一个类主动声明那些其他类或函数是它的朋友 ...

  10. Flutter实战视频-移动电商-58.购物车_删除商品功能制作

    58.购物车_删除商品功能制作 主要做购物车后面的删除按钮 删除的方法写在provide里面 provide/cart.dart文件 传入goodsId,循环对比,找到后进行移除 //删除单个购物车商 ...