5个提升Apache Web服务器性能的提示
提示#1:始终将Apache更新到最新版本
不用说,安装最新版本的Apache可能是你需要考虑的第一件事之一。自2015年11月19日,在Apache CentOS的 7库提供的最新版本是 2.4.6,而 Debian的是 2.4.10。 但是,最近可能会有一个改进或者已经添加到新发布的稳定版本的错误修复,然后可以从源下载和安装。还提供了编译和安装说明 在这里 -只要记住,如果你选择了这个更新方法,你可能要备份你的当前配置文件/网站/虚拟主机作为预防措施。 在任何情况下,您可以检查您当前安装的版本如下:# httpd -v [On RedHat/CentOS based systems] # apache2 –v [On Debian/Ubuntu based systems]
检查Apache版本
yum update httpd
或
aptitude safe-upgrade apache2
,为CentOS或Debian的,分别),除非没有其他办法。 您可以阅读最新的发行说明
Apache文档部分在Apache HTTP服务器项目的网站。
提示#2:如果您使用的内核大于2.4,请考虑立即升级
为什么?内核版本 2.4及以上的默认启用了发送文件的内核系统调用。这反过来促进高性能网络文件传输(在web服务器 - 客户端通信的上下文中是期望的),并且使得Apache能够通过执行同时读取和发送操作来更快地递送静态内容并且具有较低的CPU利用率。 您可以使用以下方式查看当前安装的内核:# uname -r并将其与www.kernel.org中的最新稳定内核(在撰写本文时为4.3)进行比较。
检查Linux内核版本
提示#3:选择最适合您的情况的多处理模块(MPM)
在实践中 ,MPM的允许你来决定如何配置Web服务器绑定到网络端口的机器上,接受来自客户端的请求,并使用子进程(和线程,或者)来处理这些请求扩展Apache模块化功能。 从版本2.4开始,Apache提供三种不同的MPM可供选择,具体取决于您的需求:- 该
prefork
MPM使用多个子进程,不必穿线。每个进程一次处理一个连接,而不为每个进程创建单独的线程。在不涉及太多细节的情况下,我们可以说只有在调试使用或如果应用程序需要处理非线程安全模块(如mod_php)的应用程序时,才需要使用此MPM。 - 的
worker
MPM使用每子进程,其中每个线程处理一次一个连接多个线程。这是高流量服务器的好选择,因为它允许使用比前一种情况更少的RAM来处理更多的并发连接。 - 最后,
event
MPM在大多数安装的Apache 2.4及以上版本中的默认MPM。 它类似于工人MPM,它也创造了每个孩子的过程,但有一个优势多线程:它导致的KeepAlive或空闲连接(而他们处于停滞状态),由单一线程来处理,从而释放内存,可以分配给其他线程。 这MPM不适合像mod_php的非线程安全的模块,它的替代品这样的PHP-FPM必须改用使用。
# httpd -V下面的图片显示,这个特定的Web服务器使用的是 prefork的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_worker或 mpm_prefork。 并取消注释加载所需模块的行,如下所示:
LoadModule mpm_event_module modules/mod_mpm_event.so注意 :为了让Debian中的事件MPM的工作,你可能必须从非自由库安装 中的libapache2-MOD-FastCGI的包。 此外,针对CentOS您将需要 PHP-FPM(连同 FCGI和 mod_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模块
# 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模块
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性能负载测试
提示#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以使更改生效。