一、两种模式
prefork模式:
prefork是Unix平台上的默认(缺省)MPM,使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接,效率高,但内存占用量比较大。
这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。
worker模式:
worker使用多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只能维持一个连接,内存占用量比较小,适合高流量的http服务器。缺点是假如一个线程崩溃,整个进程就会连同其任何线程一起”死掉”,所以要保证一个程式在运行时必须被系统识别为”每个线程都是安全的”。
此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。
二、prefork模式配置详解
ServerLimit
默认的MaxClient最大是256个线程,如果想设置更大的值,就的加上ServerLimit这个参数。20000是ServerLimit这个参数的最大值。如果需要更大,则必须编译apache,此前都是不需要重新编译Apache。
生效前提:必须放在其他指令的前面
StartServers
指定服务器启动时建立的子进程数量,prefork默认为5。
MinSpareServers
指定空闲子进程的最小数量,默认为5。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。
MaxSpareServers
设置空闲子进程的最大数量,默认为10。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。此参数不要设的太大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成”MinSpareServers+1”。
MaxClients
限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为256。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,你必须同时增大ServerLimit。
MaxRequestsPerChild
每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。如果 MaxRequestsPerChild为”0”,子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:
1. 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2. 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
三、worker模式配置详解
StartServers
服务器启动时建立的子进程数,默认值是”3”。
MaxClients
允许同时伺服的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候队列。默认值 是”400”,16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,你必须同时增加ServerLimit的值。
MinSpareThreads
最小空闲线程数,默认值是”75”。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。
MaxSpareThreads
设置最大空闲线程数。默认值是”250”。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。 MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正你设置的值:worker要求其大于等于 MinSpareThreads加上ThreadsPerChild的和。
ThreadsPerChild
每个子进程建立的常驻的执行线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。
MaxRequestWorkers = MaxClients 最大连接数
MaxRequestsPerChild
设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为”0”,子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:
1. 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2. 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
注意对于KeepAlive链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。
ServerLimit指令解释:
对于preforkMPM,这个指令设置了MaxClients最大允许配置的数值。
对于workerMPM,这个指令和ThreadLimit结合使用设置了MaxClients最大允许配置的数值。
对于preforkMPM,只有在你需要将MaxClients设置成高于默认值256的时候才需要使用这个指令。要将此指令的值保持和MaxClients一样。
对于workerMPM,只有在你需要将MaxClients和ThreadsPerChild设置成需要超过默认值16个子进程的时候才需要使用这个指令。
不要将该指令的值设置的比MaxClients 和ThreadsPerChild需要的子进程数量高。如果显式声明了ServerLimit,
那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,
否则Apache将会自动调节到一个相应值(可能是个非期望值)。
注意:
Apache在编译时内部有一个硬限制”ServerLimit 20000”(对于preforkMPM为”ServerLimit 200000”)。你不能超越这个限制。
Maxclient指令解释:
对于非线程型的MPM(也就是prefork),MaxClients表示可以用于伺服客户端请求的最大子进程数量,默认值是256。
要增大这个值,你必须同时增大ServerLimit 。
对于线程型或者混合型的MPM(也就是beos或worker),MaxClients表示可以用于伺服客户端请求的最大线程数量。
线程型的beos的默认值是50。对于混合型的MPM默认值是16(ServerLimit)乘以25(ThreadsPerChild)的结果。
因此要将MaxClients增加到超过16个进程才能提供的时候,你必须同时增加ServerLimit的值。
四、httpd.conf配置文件说明
KeepAlive On/Off
指保持连接活跃,类似于mysql永久连接。
如果设置为On,那么来自同一客户端的请求就不需要再
一次连接,避免每次请求都要新建一个连接而加重服务器的负担。
KeepAliveTimeOut number
如果第二次和第一次请求间隙时间超过了这个值,第一次连接就会中断,
再新建第二个连接。一般设置了10秒可以了
MaxKeepAliveRequests 100
一次连接可以进行的HTTP请求的最大次数。将其值设置为0,将支持一次
连接内进行无限次的传输请求。事实上,没有客户程序在一次连接中请求太多的页面,
通常达不到这个上限就完成了连接了
五、server-status 的相关说明
Apache Server Status for 192.168.58.135
Server Version: Apache/2.2.15 (Unix) DAV/2 PHP/5.3.3
Server Built: Mar 22 2017 06:52:55
Current Time: Friday, 01-Sep-2017 14:38:21 CST
Restart Time: Friday, 01-Sep-2017 14:31:36 CST
Parent Server Generation: 0
Server uptime: 6 minutes 45 seconds
Total accesses: 7 - Total Traffic: 20 kB
CPU Usage: u0 s0 cu0 cs0
.0173 requests/sec - 50 B/second - 2925 B/request
1 requests currently being processed, 7 idle workers
__W_____........................................................
................................................................
................................................................
................................................................
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process
Srv PID Acc M CPU SS Req Conn Child Slot Client VHost Request
0-0 2622 0/1/1 _ 0.00 294 1 0.0 0.00 0.00 192.168.58.1 localhost GET /server-status HTTP/1.1
1-0 2623 0/2/2 _ 0.00 10 5 0.0 0.01 0.01 192.168.58.1 localhost GET /server-status HTTP/1.1
2-0 2624 0/0/0 W 0.00 0 0 0.0 0.00 0.00 192.168.58.1 localhost GET /server-status HTTP/1.1
3-0 2625 0/2/2 _ 0.00 5 8 0.0 0.00 0.00 192.168.58.1 localhost GET /server-status HTTP/1.1
4-0 2626 0/1/1 _ 0.00 16 2 0.0 0.00 0.00 192.168.58.1 localhost GET /server-status HTTP/1.1
7-0 2629 0/1/1 _ 0.00 13 4 0.0 0.00 0.00 192.168.58.1 localhost GET /server-status HTTP/1.1
Srv Child Server number - generation
PID OS process ID
Acc Number of accesses this connection / this child / this slot
M Mode of operation
CPU CPU usage, number of seconds
SS Seconds since beginning of most recent request
Req Milliseconds required to process most recent request
Conn Kilobytes transferred this connection
Child Megabytes transferred this child
Slot Total megabytes transferred this slot
Apache/2.2.15 (CentOS) Server at 192.168.58.135 Port 80
参数分析:
字段 说明
Server Version Apache 服务器的版本。
Server Built Apache 服务器编译安装的时间。
Current Time 目前的系统时间。
Restart Time Apache 重新启动的时间。
Parent Server Generation Apache 父程序 (parent process) 的世代编号,就是 httpd 接收到 SIGHUP 而重新启动的次数。
Server uptime Apache 启动后到现在经过的时间。
Total accesses 到目前为此 Apache 接收的联机数量及传输的数据量。
CPU Usage 目前 CPU 的使用情形。
_SWSS.... 所有 Apache process 目前的状态。每一个字符表示一个程序,最多可以显示 256 个程序的状态。
Scoreboard Key 上述状态的说明。以下为每一个字符符号所表示的意义:
* _:等待连结中。
* S:启动中。
* R:正在读取要求。
* W:正在送出回应。
* K:处于保持联机的状态。
* D:正在查找DNS。
* C:正在关闭连结。
* L:正在写入记录文件。
* G:进入正常结束程序中。
* I:处理闲置。
* .:尚无此程序。
Srv 本程序与其父程序的世代编号。
PID 本程序的process id。
Acc 分别表示本次联机、本程序所处理的存取次数。
M 该程序目前的状态。
CPU 该程序所耗用的CPU资源。
SS 距离上次处理要求的时间。
Req 最后一次处理要求所耗费的时间,以千分之一秒为单位。
Conn 本次联机所传送的数据量。
Child 由该子程序所传送的数据量。
Slot 由该 Slot 所传送的数据量。
Client 客户端的地址。
VHost 属于哪一个虚拟主机或本主机的IP。
Request 联机所提出的要求信息。
五 、worker模式工作遇到的问题:
当apache以woker模式工作时,重启apache时重启失败:
[root@bogon ~]# httpd -l
Compiled in modules:
core.c
worker.c
http_core.c
mod_so.c
[root@bogon ~]# service httpd start
正在启动 httpd:httpd: Syntax error on line 221 of /etc/httpd/conf/httpd.conf: Syntax error on line 9 of /etc/httpd/conf.d/php.conf: Cannot load /etc/httpd/modules/libphp5-zts.so into server: /etc/httpd/modules/libphp5-zts.so: cannot open shared object file: No such file or directory
[失败]
查找libphp5-zts.so
[root@bogon ~]# yum search php-zts*
Loaded plugins: fastestmirror, refresh-packagekit
Loading mirror speeds from cached hostfile
* base: mirror.bit.edu.cn
* extras: mirror.bit.edu.cn
* updates: mirror.bit.edu.cn
Warning: No matches found for: php-zts*
No Matches found
vi /etc/httpd/conf.d/php.conf 时,可以看到woker模式加载libphp5-zts.so
[root@bogon ~]# vi /etc/httpd/conf.d/php.conf
#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
.c>
LoadModule php5_module modules/libphp5.so
.c>
LoadModule php5_module modules/libphp5-zts.so
解决方法:
注释掉/etc/httpd/conf.d/php.conf文件中的“LoadModule php5_module modules/libphp5-zts.so”,然后重启apache 则正常启动。