5个提高Apache Web服务器性能的提示

在本文中,我们将讨论一些提示,这将帮助您确保Apache将顺利运行,并能够处理您的请求数量

根据由Netcraft的最近的一份报告 (公知的因特网公司的其他服务的网络浏览器的使用统计中提供), Apache继续是网站和面向因特网的计算机中最广泛使用的web服务器。
提高Apache Web服务器性能

5个提升Apache Web服务器性能的提示

此外, Apache保持在经历了前网络服务器中最大的增长,其次是Nginx的IIS。因此,如果您是负责管理Apache安装的系统管理员,您需要知道如何根据您(或您的客户端)的需求确保您的Web服务器以其最大容量执行。 在本文中,我们将讨论一些提示,这些提示将帮助您确保Apache可以顺利运行,并能够处理您期望从远程客户端请求的数量。 但是,请记住,Apache的设计目的不是设置基准记录 - 但即使如此,它仍然能够在几乎任何您可能想到的使用情况下提供高性能。

提示#1:始终将Apache更新到最新版本

不用说,安装最新版本的Apache可能是你需要考虑的第一件事之一。自2015年11月19日,在ApacheCentOS7库提供的最新版本是2.4.6,Debian的2.4.10。 但是,最近可能会有一个改进或者已经添加到新发布的稳定版本的错误修复,然后可以从源下载和安装。还提供了编译和安装说明在这里 -只要记住,如果你选择了这个更新方法,你可能要备份你的当前配置文件/网站/虚拟主机作为预防措施。 在任何情况下,您可以检查您当前安装的版本如下:
# httpd -v               [On RedHat/CentOS based systems]
# apache2 –v             [On Debian/Ubuntu based systems] 
检查Apache版本

检查Apache版本

作为一个经验法则,坚持与您所选择的分布的包管理器提供的更新方法( yum update httpdaptitude safe-upgrade apache2 ,为CentOS或Debian的,分别),除非没有其他办法。 您可以阅读最新的发行说明Apache文档部分在Apache HTTP服务器项目的网站。

提示#2:如果您使用的内核大于2.4,请考虑立即升级

为什么?内核版本2.4及以上的默认启用了发送文件的内核系统调用。这反过来促进高性能网络文件传输(在web服务器 - 客户端通信的上下文中是期望的),并且使得Apache能够通过执行同时读取和发送操作来更快地递送静态内容并且具有较低的CPU利用率。 您可以使用以下方式查看当前安装的内核:
# uname -r
并将其与www.kernel.org中的最新稳定内核(在撰写本文时为4.3)进行比较。
检查Linux内核版本

检查Linux内核版本

虽然这是一个不适合初学者的过程,但升级内核是一个有趣的练习,可以了解有关Linux内部的更多信息。

提示#3:选择最适合您的情况的多处理模块(MPM)

在实践中,MPM的允许你来决定如何配置Web服务器绑定到网络端口的机器上,接受来自客户端的请求,并使用子进程(和线程,或者)来处理这些请求扩展Apache模块化功能。 从版本2.4开始,Apache提供三种不同的MPM可供选择,具体取决于您的需求:
  1. prefork MPM使用多个子进程,不必穿线。每个进程一次处理一个连接,而不为每个进程创建单独的线程。在不涉及太多细节的情况下,我们可以说只有在调试使用或如果应用程序需要处理非线程安全模块(如mod_php)的应用程序时,才需要使用此MPM。
  2. worker MPM使用每子进程,其中每个线程处理一次一个连接多个线程。这是高流量服务器的好选择,因为它允许使用比前一种情况更少的RAM来处理更多的并发连接。
  3. 最后, event MPM在大多数安装的Apache 2.4及以上版本中的默认MPM。 它类似于工人MPM,它也创造了每个孩子的过程,但有一个优势多线程:它导致的KeepAlive空闲连接(而他们处于停滞状态),由单一线程来处理,从而释放内存,可以分配给其他线程。 这MPM不适合像mod_php的非线程安全的模块,它的替代品这样的PHP-FPM必须改用使用。
要检查你的Apache安装中使用的MPM,你可以这样做:
# httpd -V
下面的图片显示,这个特定的Web服务器使用的是prefork的MPM。
检查Apache MPM

检查Apache 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_event,mpm_workermpm_prefork。 并取消注释加载所需模块的行,如下所示:
LoadModule mpm_event_module modules/mod_mpm_event.so
注意 :为了让Debian中的事件MPM的工作,你可能必须从非自由库安装中的libapache2-MOD-FastCGI的包。 此外,针对CentOS您将需要PHP-FPM(连同FCGImod_fcgid),而Debian中它被称为PHP5-FPM(Apache2的-MPM-事件一起)。 最后,但并非最不重要的,重新启动Web服务器和新安装PHP-FPM(PHP5-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
虽然你可以设置Apache将使用特定的MPM,该配置可以在一个上覆盖了每个虚拟主机基础上以同样的方式如前所述。 只需将相应的标签放入每个虚拟主机的配置文件中,您就可以开始使用了 - 但确保您每个虚拟主机只使用一个MPM。 最后,请注意,无论您选择的分布,PHP-FPM依赖于FastCGI的执行,这就是为什么我建议的额外软件包安装较早的原因。 有关详细信息和PHP-FPM的例子以及如何与事件MPM增加的Apache的性能,您应该参考官方文档 。 这是我在将默认MPM从prefork更改为在上一个图像中显示的相同框中的事件之后看到的:
选择Apache MPM模块

选择Apache MPM模块

CentOS 7,你需要确保的HTTPHTTPS服务通过防火墙启用,网络接口(S)的正确添加到默认区域。 例如:
# 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配置在云VPS设置防止PHP-FPM和Apache从处理PHP文件。 作为一个基本的测试(我相信你能想到的更复杂或紧张的人),我将创建checkes另一个名为文件是否存在一个PHP文件test.php两个CentOS 7服务器的同一目录中使用相同的硬件特性并加载但具有不同的MPM。其中一个将使用事件,另一个将使用prefork:
比较Apache事件和Prefork模块

比较Apache事件和Prefork模块

这是我一直保存到指定文件中的PHP代码checkiffileexists.php
<?php
$filename = 'test.php';
if (file_exists($filename)) {
echo "The file $filename exists";
} else {
echo "The file $filename does not exist";
}
?>
然后,我们将运行Apache的基准测试工具(AB)200个并发请求,直到2000请求已完成:
# ab -k -c 100 -n 2000 localhost/checkiffileexists.php
让我们运行测试并比较结果。注意性能统计:
Apache性能负载测试

Apache性能负载测试

正如你所看到的,与事件的服务器的性能是本次测试的各个方面非常优越的prefork的对应。

提示#4:明智地为Apache分配RAM

也许要考虑的最重要的硬件产品的RAM分配给每个Apache进程的量。 虽然你不能直接控制这一点,你可以限制通过MaxRequestWorkers指令子进程(原名中的MaxClients的Apache 2.2),这将对限制由Apache提供的内存使用的数量。同样,您可以在每个主机或每个虚拟主机上设置此值。 要做到这一点,你应该注意Apache所使用的内存的平均金额,然后由MaxRequestWorkers的数量乘以它,这是将为Apache进程分配的内存量。你不希望你的web服务器做的一件事是开始使用交换,因为这将显着降低其性能。因此,您应该始终保持Apache的RAM使用在您能负担的限度内,从不依赖于交换。 例如,下面的块将限制并发客户端的数量为30。如果更多的客户端击中主机,他们可能会遇到延迟或瞬间故障,可以通过刷新浏览器轻松解决。虽然这可能被认为是不合需要的,但对于服务器来说更健康,从长远来看也是如此,对于您的网站也是如此。 你可以把这个区块内/etc/httpd/conf/httpd.conf/etc/apache2/apache2.conf ,这取决于您使用的CentOS或Debian的。 请注意,同样的原则也适用于所有的MPM -我使用的事件在这里继续与前面的技巧中概述的概念:
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads          25
MaxSpareThreads          75
ThreadLimit                      64
ThreadsPerChild          25
MaxRequestWorkers    30
MaxConnectionsPerChild    1000
</IfModule>
在任何情况下,我们强烈建议您指的是Apache的2.4的文档 ,看看哪些指令允许您选择的MPM。

提示#5:了解您的应用程序

作为一个经验法则,您不应加载任何不是您的应用程序工作所必需的Apache模块。这将需要至少对您的服务器上运行的应用程序的整体了解,特别是如果您是系统管理员并且有另一个负责开发的团队。 您可以列出当前加载的模块:
# httpd -M          [On RedHat/CentOS based systems]
# apache2ctl -M     [On Debian/Ubuntu based systems]
CentOS的卸载/禁用模块,您将需要注释掉的LoadModule与开始(该行无论是在主配置文件或在里面/etc/httpd/conf.modules.d辅助之一。 另一方面,Debian提供一个称为a2dismod禁用模块工具,并用于如下:
# a2dismod module_name
要启用它:
# a2enmod module_name
在任一情况下,请记住重新启动Apache以使更改生效。

摘要

在本文中,我们回顾5个技巧 ,可以帮助你调整Apache Web服务器,并提高其性能。 此外,你应该记住,优化和性能没有安全是没有意义的,所以你可能要参考安装mod_pagespeed,以提高Web服务器的性能Apache的加固技巧文章中Howtoing.com为好。 由于我们无法在本文中充分涵盖此主题的所有方面,也许您会想到其他想要与社区的其他人分享的想法。如果是这样,请随时使用下面的评论表格让我们知道。