启动及热启动
./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请求)
worker MPM
worker同样使用多个进程,但每个进程又拥有多个线程,每个线程处理一个连接。由于线程是轻量级的,因而具有较高的并发性,同时,多个进程又获得了一定的稳定性。
worker模式特点是占用内存少,并发性比较高,缺点是必须考虑线程安全。如果使用了keep-alive方式,一个线程可能会被一直保持一个连接,但中间没有请求,直到超时。如果有多个线程被这样占据,在高并发场景下同样会出现无线程可用的情形。
主进程——子进程——每个子进程生成多个子线程
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)
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
。
对于线程服务器和混合服务器(例如event
或worker
),MaxRequestWorkers
限制可用于服务客户端的线程总数。对于混合的MPM,默认值是16
(ServerLimit
)乘以的值25
(ThreadsPerChild
)。因此,要增加到MaxRequestWorkers
需要超过16个过程的值,还必须提高ServerLimit
。