Apache工作模式

Stella981
• 阅读 419

Apache的几种工作模式

查看Apache所有工作模式:

在httpd目录执行以下命令:
# ./configure --help    
  /--with-mpm   在help文件中搜索“--with-mpm”

工作模式有:prefork、worker、event、beos、mpmt_os2、winnt,其中主要的是prefork、worker、event三种模式。

Apache三种工作模式

本节选自:http://blog.csdn.net/qq_21956483/article/details/53487323

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

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

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

解析

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

  • prefork模式:

    ServerLimit 20000 StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 1000 MaxRequestsPerChild 0

“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”:
每个进程所能建立的最大连接数。

查看Apache当前使用的模式

# /usr/local/apache/bin/httpd -l
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
2年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
00_设计模式之语言选择
设计模式之语言选择设计模式简介背景设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这