Apache服务器性能调优五法是……
译者:刘旭坤
原文链接:http://www.tecmint.com/apache-performance-tuning/
小象科技原创作品,欢迎大家疯狂转发;
机构、自媒体平台转载务必至后台留言,申请版权。
Netcraft近日发布的报告称Apache依然是最受欢迎的网络服务器,此外Apache服务器也力压Nginx和IIS成为增长最多的服务器。
如果你正负责Apache安装管理等工作,那么你一定得懂一些性能调优的方法以便充分发挥服务器的全部能力。
本文中我们就介绍一些Apache服务器性能调优的方法,不过大家在实践的时候请根据自己的实际情况来应用因为性能调优的目的是满足需求,并不是拿来吹嘘标榜的。
1.使用最新版本的Apache
第一点就是把Apache更新到最新版。截止到2015年11月19日,CentOS7上的Apache最新版本是2.4.6,Debian上的最新版本则是2.4.10。
不过这么几天可能已经又有了什么更新,大家可以下载源文件并安装。如果从源文件安装的话最好把配置文件等进行备份以免不测。
下面的命令可以用来查看当前安装的Apache版本。
# httpd -v [On RedHat/CentOS based systems]
# apache2 -v [On Debian/Ubuntu based systems]
好心提醒一下,大家最好使用自己系统的包管理器来更新。对于CentOS和Debian更新的命令分别是yumupdate httpd 和 aptitude safe-upgradeapache2。
2.考虑升级系统内核
从内核版本2.4开始Linux默认支持sendfile系统调用。这有助于提升网络文件传输的性能因此Apache可以使用较少资源更快地响应静态文件的请求。
可以用下面的命令来查看内核版本:
# uname -r
再从www.kernel.org看看最新的内核版本就能知道自己是不是已经太久没有升级了。本文发稿时最新的稳定内核版本是4.3。
升级内核对新手来说可能有点困难,不过可以很好地锻炼我们对Linux的理解。
3.审慎选择多处理模块MPM
MPM的不同选择可以控制网络端口的绑定,接受请求的方式和子进程的使用。
从Apache 2.4开始我们可以根据实际情况选择三种不同的MPM:
n preforkMPM会开启多个进程,每个进程处理一个请求。通常我们只有在应用中使用了mod_php这样非线程安全的模块时才会使用prefork MPM。
n workerMPM的每个进程会使用多个线程,每个线程可以处理一个请求。相比于prefork MPM它可以处理更多的并发请求。
n eventMPM从Apache 2.4开始就成了默认的MPM模式,它与worker MPM类似每个进程也会有多个线程。不过会把KeepAlive和idle状态的连接交由一个单独的线程来处理,这样就可以腾出更多的内存来应付新的请求。eventMPM也不支持mod_php这样的非线程安全模块,好在有PHP-FPM这样的替代产品。
下面的命令用于查看MPM模式:
# httpd -V
下面的截屏显示此服务器正使用prefork MPM。
要更改MPM的话需要编辑:
# /etc/httpd/conf.modules.d/00-mpm.conf [On RedHat/CentOS based systems]
# /etc/apache2/mods-available/<mpm>.load [On Debian/Ubuntu based systems]
<mpm>在不同MPM配置下可能是mpm_event、mpm_worker或mpm_prefork。然后把想要的MPM取消注释:
LoadModule mpm_event_module modules/mod_mpm_event.so
注:Debian中使用event MPM可能需要安装libapache2-mod-fastcgi。
此外CentOS中我们需要php-fpm,在Debian中这个包叫做php5-fpm。
最后我们还要重启服务器和php-fpm服务:
RedHat/CentOS:
# systemctl restart httpd php-fpm && systemctl enable httpd php-fpm
Debian/Ubuntu:
# systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm
以上方法制定的MPM可能会被虚拟主机的配置所覆盖。
前文中的默认MPM从prefork改为event之后的截屏如下:
在CentOS 7中要注意http和https服务是否能够通过防火墙,还要确保网络接口已经加入到防火墙的internal信任区域中:
# firewall-cmd --zone=internal --add-interface=tun6to4
# firewall-cmd --zone=internal --add-interface=tun6to4 --permanent
# firewall-cmd --set-default-zone=internal
# firewall-cmd --add-service=http
# firewall-cmd --add-service=https
# firewall-cmd --add-service=http --permanent
# firewall-cmd --add-service=https --permanent
# firewall-cmd --reload
如果使用firewalld的默认配置的话云虚拟机中php-fpm可能会失效。
下面我们来做一个小测试比较不同的MPM效果。我们有两台硬件配置相同的CentOS 7服务器,唯一的不同是一个设置为event MPM另一个设置为prefork MPM。
我写了一个checkiffileexists.php来查看在同一目录下是否存在test.php文件。
<?php
$filename = 'test.php';
if (file_exists($filename)) {
echo "The file $filename exists";
} else {
echo "The file $filename does not exist";
}
?>
接下来我用压力测试工具ab(Apache benchmark tool)来模拟200个同时请求直至完成2000个请求:
# ab -k -c 100 -n 2000 localhost/checkiffileexists.php
下面是结果的对比:
我们可以看到设置为event MPM的服务器性能明显超过设置为prefork MPM的服务器。
4.仔细为Apache进程分配内存
硬件条件中最重要的就是为Apache进程所分配的内存。虽然我们没办法直接控制内存的分配,但我们可以通过设置MaxRequestWorkers来控制Apache对内存的使用。注意一下一个连接情况下Apache使用的内存乘以MaxRequestWorkers就是系统可能为Apache分配的最大内存。请注意不要让服务器使用交换区,这将对性能造成极大的损害。
我们可以编辑/ect/httpd/conf/httpd.conf或/etc/apache2/apache2.conf来修改MaxRequestWorkers的数目(分别是CentOS和Debian中的路径)。比如下面我们把MaxRequestWorkers修改为30:
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 30
MaxConnectionsPerChild 1000
</IfModule>
这样如果有超过30个用户同时连接就会出现连接失败或者延迟的情况,但长远来看对服务器和站点是有好处的。
5.了解自己的应用
一般来说如果某个Apache模块不是必需的那么就不应该加载,要做到这一点你必须对于自己的应用有详尽的了解。如果你只是管理员而不是开发团队的话那么还是挺困难的。
下面的命令可以列出现在加载的所有模块:
# httpd -M [On RedHat/CentOS based systems]
# apache2ctl -M [On Debian/Ubuntu based systems]
要禁用某个模块的话在CentOS中我们可以编辑/ect/httpd/conf.modules.d,把以LoadModule开始的某些行注释掉。
Debian提供了一个a2dismod工具,所以我们可以用下面的命令来禁用某个模块:
# a2dismod module_name
要重新加载的话使用下面的命令:
# a2enmod module_name
无论是禁用还是重新加载之后都要记得要重启Apache。
小结
本文中我们讨论了五个Apache性能调优的方法,希望能够对大家有所帮助。
浙公网安备 33010602011771号