优化Apache,让网站速度更快

2020-01-30 11:27:05于丽


worker的工作原理
   相对于prefork,worker是2.0 版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是, worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。这种MPM的工作方式将是Apache 2.0的发展趋势。
   worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。

# 下面我以worker模式进行编译安装
# ./configure --prefix=/usr/local/apache --with-mpm=worker --enable-so(让它支持DSO功能,这样以后可以动态加载模块)
# make
# make install
# cd /usr/local/apache/conf
# vi httpd.conf


<IfModule worker.c> StartServers 2 MaxClients 150 ServerLimit 25 MinSpareThreads 25 MaxSpareThreads 75 ThreadLimit 25 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>

Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)

需要注意的是,如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)。下面是笔者的 worker配置段:
<IfModule worker.c> StartServers 3 MaxClients 2000 ServerLimit 25 MinSpareThreads 50 MaxSpareThreads 200 ThreadLimit 200 ThreadsPerChild 100 MaxRequestsPerChild 0 </IfModule>
# 保存退出。
# /usr/local/apache/bin/apachectl start
# 可根据实际情况来配置Apache相关的核心参数,以获得最大的性能和稳定性。

二、限制Apache并发连接数
我们知道当网站以http方式提供软件下载时,若是每个用户都开启多个线程并没有带宽的限制,将很快达到http的最大连接数或者造成网络阻塞,使得网站的许多正常服务都无法运行。下面我们添加mod_limitipconn模块,来控制http的并发连接数。

# wget <IfModule mod_limitipconn.c> <Location />   #所限制的目录所在,此处表示主机的根目录 MaxConnPerIP 2  #所限制的每个IP并发连接数为2个 </Location> </IfModule>