LAMP 架构——Apache 工作模式

查看 Apache 所有工作模式

在 httpd 目录执行以下命令:

# ./configure --help  

说明: /–with-mpm 在 help 文件中搜索“–with-mpm”
工作模式有:prefork、worker、event、beos、mpmt_os2、winnt,其中主要的是 prefork、worker、event 三种模式。


查看 Apache 当前使用的模式

# /usr/local/apache/bin/httpd -l

Apache 三种工作模式

prefork 模式:一个非线程的,预派生的模块,这意味着 prefork 会使用多个子进程,每个子进程只有一个线程来接受请求;每个进程只能处理一个 http 链接,直到这个链接被释放。

worker 模式:worker 是使用多个子进程、每个子进程有多个线程、由于使用的是线程去处理请求,消耗内存小,适合高流量的请求,但是如果某个进程出现问题,那么这个进程下的线程都会出现问题,即稳定性不是很好。

event 模式:,是为解决 keep-alive 保持长连接出现的一种工作模式,使用 keep-alive 长连接的时候,某个线程会一直被占用,及时中间没有请求,需要等到超时才会被释放,所以这个时候就出现了 event 的工作模式就出现了。在 event 工作模式中,会有一些专门的线程用来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。另外,event 模式是不支持用在 https(安全 http)上的。

本节选自:http://blog.csdn.net/yanggd1987/article/details/44652197


prefork 模式:

<IfModule mpm_prefork_module>
ServerLimit   20000
StartServers   5
MinSpareServers   5
MaxSpareServers   10
MaxClients   1000
MaxRequestsPerChild 0
</IfModule>

StartServers 5: apache 在启动后建立的子进程数,prefork 默认为 5。

MinSpareServers 5: 最小空闲进程数,默认为 5。当空闲子进程数小于 5 时,那么 apache 将会立刻生成新的子进程。

MaxSpareServers 10”:
最大空闲进程数,默认为 10。当空闲子进程数超过 10 时,那么父进程会杀死多余的子进程,当我们的网站负载过大,可以适当加大 MinSpareServers 和 MaxSpareServers。

“MaxClients 1000”:
apache 所能接受的 http 请求数。当请求超过 1000 时,多余的请求会进入请求队列,直到前面的请求处理完。当我们的服务器剩余资源很多但访问很慢时,我们就要看看这个参数是不是设置太低。当然 Maxclients 默认值为 256, 当要增大此值时,也要增加 serverlimit,但是 serverlimit 最大为 20000。(注:apache2.3.1 以后的版本 MaxClients 称为 MaxRequestWorkers)。

“MaxRequestPerChild 1000”:
每个子进程所能接受的最大请求数,当超过 1000 时会自动销毁,0 表示子进程永不销毁,虽然能够接受更多的请求,但可能会造成内存泄漏。


event 模式

prefork和mpm方式在非常繁忙的服务器应用下都有些不足。尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载,但是 Keepalive需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。 Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限 制,此时Event MPM方式是最有效的。一个以Worker MPM方式工作的繁忙服务器能够承受每秒好几万次的访问量(例如在大型新闻服务站点的高峰时),而Event MPM可以用来处理更高负载。值得注意的是,Event MPM不能在安全HTTP(HTTPS)访问下工作。

event和work有相同之处,都是通过线程来处理请求;一个父进程建立多个子进程,而子进程又会建立多个线程。
<IfModule mpm_event_module>
    ServerLimit         1000
    StartServers         20
    MinSpareThreads        25
    MaxSpareThreads      1200
    ThreadsPerChild      50
    MaxRequestWorkers    2000
    MaxConnectionsPerChild  1000
</IfModule>

“StartServers 20”: apache 启动后建立 20 个子进程,由于默认的 Serverlimit
为 16,当我们 StartServers 大于 16 时,会报错“changing ServerLimit to 1000 from
original value of 16 not allowed during
restart”,但是我们可以通过 Serverlimit 来重新设置,不过需要先停止 apache 服务再启动,直接 restart 无效。

“MinSpareThreads 25”: 最小空闲线程数为 25。

“MaxSpareThreads 1200”: 最大空闲线程数,这里要注意这个值必须要大于 StartServers*
ThreadsPerChild=20 *50=1000,如若我们 MaxSpareThreads
800,小于 1000,则 StartServers-MaxSpareThreads/50=4,则有 4 个进程会被杀掉,我们可以通过 top 查看,restart 后会生成多个进程,当过一会多余的进程会被 kill 掉。

“MaxRequestWorkers 2000”: 最大数量的工作线程,等于 ServerLimit *
ThreadPerChild,如果按照默认的 ServerLimit=16 的话,2000>16 *
50,日志中会报错“MaxRequestWorkers of 1000 would require 20 servers and
exceed ServerLimit of 16, decreasing to
800”,这时我们需要通过修改 ServerLimit,需要先停止 apache 服务再启动,直接 restart 无效。

“MaxConnectionsPerChild 1000”: 每个进程所能建立的最大连接数。