首页 » LANMP » Apache » 正文

Apache的工作模式

Apache的启动方式有两种,一种是直接执行httpd这个可执行程序(但是不好控制,不推荐)

还有一种是使用apachectl (apache贴心管理小工具,其实就是个shell脚本)


查看工作模式

如果你启动的是/usr/local/xxxx/bin/apachectl

那么 执行 (小写的l)
如果你和本博客是一样的配置,那么会出现
一条:


httpd(apache)的三种工作模式

三种工作模式–prefork

prefork apache 2.2默认的模式。没有线程的概念,是多进程模型,一个进程处理一个连接;稳定;响应快。其缺点是在连接数比较大时就非常消耗内存。

2.2中编译时不加–with-mpm=xxx 那么就是prefork
2.4中 则是 event工作模式

三种工作模式–worker

多进程多线程模型,一个进程有多个线程,每个线程处理一个连接。这种模式下开销更小,处理的请求更海量。

缺点是一旦某个线程出了问题,其所属进程也可能会死掉

三种工作模式–event

Worker模式的升级和加强版本.相对worker模式能够承受的了更高的并发负载。
event模式不能很好的支持https的访问

我们来分别体验一下

重新生成makefile文件
再次

我们来看一下基本的配置

找到这一行

这个额外加载的配置文件,就是对不同工作模式的一个配置。为了方便区分,所以会放到外面。当然你也可以直接拉过来放到httpd.conf里面

配置文件

参数说明

StartServers //初始创建进程数
MaxSpareServers //最大空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程
MinSpareServers //最小空闲进程数

MaxRequestWorkers
最大接收的请求数,apache 2.3.1之前叫做MaxClients.
默认值256(250?).调大这个值要增加ServerLimit (最大为2万,要调这个值要改源码文件)
http://httpd.apache.org/docs/current/mod/mpm_common.html#serverlimit

MaxRequestsPerChild(2.4为MaxConnectionsPerChild)
每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后将自动销毁

0为不限制


mpm的配置例子

一个prefork配置的例子

一个worker配置的例子


配置MPM需要注意的事项

notes:
For the prefork MPM, this directive sets the maximum configured value for MaxRequestWorkers for the lifetime of the Apache httpd process. For the worker and event MPMs, this directive in combination with ThreadLimit sets the maximum configured value for MaxRequestWorkers for the lifetime of the Apache httpd process. Any attempts to change this directive during a restart will be ignored, but MaxRequestWorkers can be modified during a restart.

Special care must be taken when using this directive. If ServerLimit is set to a value much higher than necessary, extra, unused shared memory will be allocated. If both ServerLimit and MaxRequestWorkers are set to values higher than the system can handle, Apache httpd may not start or the system may become unstable.

With the prefork MPM, use this directive only if you need to set MaxRequestWorkers higher than 256 (default). Do not set the value of this directive any higher than what you might want to set MaxRequestWorkers to.

With worker and event, use this directive only if your MaxRequestWorkers and ThreadsPerChild settings require more than 16 server processes (default). Do not set the value of this directive any higher than the number of server processes required by what you may want for MaxRequestWorkers and ThreadsPerChild.

Note

There is a hard limit of ServerLimit 20000 compiled into the server (for the prefork MPM 200000). This is intended to avoid nasty effects caused by typos. To increase it even further past this limit, you will need to modify the value of MAX_SERVER_LIMIT in the mpm source file and rebuild the server.

翻译:

对于prefork MPM,此指令为Apache httpd进程的生命周期设置MaxRequestWorkers的最大配置值。对于工作人员和事件MPM,此指令与ThreadLimit结合,为Apache httpd进程的生命周期设置MaxRequestWorkers的最大配置值。在重新启动期间更改此指令的任何尝试都将被忽略,但MaxRequestWorkers可以在重新启动期间进行修改。

使用此指令时必须特别小心。如果ServerLimit设置为远远高于必要值,则会分配额外的未使用的共享内存。如果ServerLimit和MaxRequestWorkers都设置为高于系统可以处理的值,则Apache httpd可能无法启动或系统可能会变得不稳定。

使用prefork MPM,只有在需要设置MaxRequestWorkers高于256(默认值)时,才使用此指令。不要将此伪指令的值设置为高于可能要设置MaxRequestWorkers的值。

对于worker和event,只有当MaxRequestWorkers和ThreadsPerChild设置需要超过16个服务器进程(默认值)时才使用此伪指令。不要将此伪指令的值设置为高于MaxRequestWorkers和ThreadsPerChild所需的服务器进程所需的数量。

注意

ServerLimit 20000有一个硬限制编译到服务器(对于prefork MPM 200000)。这是为了避免由打字错误造成的恶作剧。要将其进一步超过此限制,您将需要修改mpm源文件中MAX_SERVER_LIMIT的值并重建服务器。

来源: https://httpd.apache.org/docs/2.4/mod/mpm_common.html#serverlimit

worker demo

发表评论

正在加载验证码......

请先完成验证