启动及热启动

./apachectl stop #立即停止
./apachectl start #立即启动
./apachectl graceful #优雅重启,重新加载配置文件
./apachectl graceful-stop #优雅停止

如果你启动的是/usr/local/apache2/bin/apachectl, 
会启动HTTPD='/usr/local/apache2/bin/httpd'这个httpd 
使用的配置文件应该是/usr/local/apache2/conf/httpd.conf,

而你启动/usr/sbin/httpd 
使用的配置文件应该是/etc/httpd/conf/httpd.conf 

apache状态

http://192.168.0.61/server-status

LoadModule status_module modules/mod_status.so
ExtendedStatus On
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from IP
</Location>

打开查看的话就使用http://IP/server-status来访问,如果需要自动更新,可以用

http://IP/server-status?refresh=N,N是更新时间,默认是秒。

httpd.conf配置文件

timeout

如果客户端与服务器创建好连接后,超过该值,就会把这个连接会断开

keepalive

表示是否保持长连接,即在一个tcp连接下可以发送多个http请求

keepalivetimeout

表示当开启长连接时,请求与请求之间的间隔

apache进程与线程关系

主进程:apache启动的时候以root产生的进程

在整个过程中所有的请求都是由线程处理的

MPM模块

通过命令查看apache使用了哪些模块

[root@localhost apache]# ./bin/apachectl -l
Compiled in modules:
  core.c
  mod_so.c
  http_core.c
[root@localhost apache]# ./bin/apachectl -V| grep -i mpm
Server MPM:     event

mpm分类

prefork MPM

prefork是比较古老而又稳定的apache模式,特点是每个进程都是单线程,在一个时间点只能处理一个连接,需要启动大量的进程来处理高并发的请求。由于是单线程进程,因而无须考虑线程安全的问题,可以使用非线程安全的库,例如mod_php。

优点是成熟稳定,缺点是比较消耗内存,而且并发支持受限于进程数量,对高并发支持稍差。

主进程——子进程——每个子进程生成一个子线程(每个子线程只能处理一个http请求

apache2.4版本调优_apache

 

worker MPM

worker同样使用多个进程,但每个进程又拥有多个线程,每个线程处理一个连接。由于线程是轻量级的,因而具有较高的并发性,同时,多个进程又获得了一定的稳定性。

worker模式特点是占用内存少,并发性比较高,缺点是必须考虑线程安全。如果使用了keep-alive方式,一个线程可能会被一直保持一个连接,但中间没有请求,直到超时。如果有多个线程被这样占据,在高并发场景下同样会出现无线程可用的情形。

主进程——子进程——每个子进程生成多个子线程

apache2.4版本调优_apache_02

event MPM

event模式是在2.4版本中才稳定发布的模式,它在worker的基础上,解决了keep-alive连接不能释放的问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。

event相比于worker的优势是,它解决了worker模式下长连接线程的阻塞问题。

值得一提的是,worker/event模式的请求处理模式,已经和nginx的libevent模式相同了。在mod_php模式下,每个apache进程都需要直接执行php,所以很容易达到系统资源限制。但是在php-fpm模式下,apache只负责建立连接,然后把请求传递给php-fpm来处理。这样,apache可以保持大量的连接,请求处理能力取决于php服务器的性能。

由于event是明显优于worker的,所以在apache2.4及后续版本中,一般优先选择event模式

主进程——子进程——每个子进程生成多个子线程(ThreadsPerChild由他决定生成多少子线程,默认是50)

apache2.4版本调优_httpd_03

mpm配置解析

<IfModule mpm_event_module>
    StartServers            10
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25    #每个进程产生多少线程,默认是50个
    MaxRequestWorkers     1600
    MaxConnectionsPerChild   10000
</IfModule>
<IfModule mpm_worker_module>
    StartServers             3              #初始启动多少子进程
    ServerLimit             3              #最多生成多少子进程,具体设置多少可以通过——(总内存-其他占用内存)/每个子进程占用的内存
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers    1600
    MaxConnectionsPerChild   0
</IfModule>

ServerLimit           #最多生成多少子进程,具体设置多少可以通过——(总内存-其他占用内存)/每个子进程占用的内存

                             #为了安全可以(总内存-其他占用内存) * 0.8 /每个子进程占用的内存

                             #每个子进程占用内存的大小是由子线程的数量来决定

                             #serverlimit 一般最大值可以设置到20000,这是由服务器限制的,如果需要设置更大的值,需要修改mpm源文件中的max_server_limit值

ThreadsPerChild   每个子进程可以生成的线程数,默认是50

ThreadsLimit        限制每个子进程可以生成多少线程数,一般不用设置,2.4版本以后才有这个选项

MaxRequestWorkers    最大同时处理请求的进程数量,也是最大的同时连接数,表示了apache的最大请求并发能力,超过该数目后的请求,将排队,在2.3.13之前,它的名字是MaxClients,MaxRequestWorkers    = ServerLimit  *  ThreadsPerChild   

ListenBacklog   表示排队数,这是2.4版本以后才有

MaxConnectionsPerChild   表示每个线程可以处理的请求数,当超过这个值,那么这个子线程就会被杀掉,设置0表示不限制,一般设置为0即可

MaxSpareThreads        表示最大空闲线程数,MaxSpareThreads >StartServers  * ThreadsPerChild

MinSpareThreads         表示最小空闲线程数

MaxRequestWorkers指令设置了将同时服务的请求数的限制。任何超出MaxRequestWorkers限制的连接尝试通常都会排队,最多可以根据ListenBacklog指令进行排队。在另一个请求结束时释放了子进程后,将为连接提供服务。

对于非线程服务器(prefork),MaxRequestWorkers转换成将要推出的服务请求的子进程的最大数量。默认值为256;要增加它,您还必须加注ServerLimit

对于线程服务器和混合服务器(例如eventworker),MaxRequestWorkers限制可用于服务客户端的线程总数。对于混合的MPM,默认值是16ServerLimit)乘以的值25ThreadsPerChild)。因此,要增加到MaxRequestWorkers需要超过16个过程的值,还必须提高ServerLimit