提升 Apache Web 服务器性能的 5 个技巧
根据Netcraft(一家著名的互联网公司,提供网络浏览器使用情况统计等服务)最近的一份报告,Apache仍然是网站和面向互联网的计算机中使用最广泛的网络服务器。
此外,Apache在顶级 Web 服务器中一直保持着最大的增长,其次是Nginx和IIS。因此,如果您是负责管理 Apache 安装的系统管理员,您需要知道如何确保您的 Web 服务器根据您(或您的客户)的需求以最佳性能运行。
在本文中,我们将讨论一些技巧,帮助您确保 Apache 能够顺利运行,并能够处理您预期来自远程客户端的大量请求。
但是,请记住,Apache 的设计目的并不是为了设定基准记录——但即便如此,它仍然能够在您能想到的几乎任何使用情况下提供高性能。
提示 1:始终保持 Apache 更新为最新版本
毫无疑问,安装最新版本的 Apache 可能是您需要考虑的第一件事之一。截至 2015 年 11 月 19 日,CentOS 7存储库中提供的最新版本的 Apache 是2.4.6,而Debian 的存储库中提供的最新版本是2.4.10。
但是,最近发布的稳定版本可能会有改进或错误修复,然后可以从源代码下载并安装。这里还提供了编译和安装说明- 请记住,如果您选择此更新方法,您可能需要备份当前的配置文件/站点/虚拟主机以防万一。
无论如何,您可以按如下方式检查当前安装的版本:
# httpd -v [On RedHat/CentOS based systems] # apache2 –v [On Debian/Ubuntu based systems]
根据经验法则,除非没有其他方法,否则请坚持使用所选发行版的包管理器提供的更新方法(对于 CentOS 或 Debian,分别为yum update httpd
或)。您可以在 Apache HTTP 服务器项目网站的Apache 文档部分阅读最新的发行说明。aptitude safe-upgrade apache2
提示 #2:如果你正在使用 2.4 之前的内核,请考虑立即升级
为什么?内核版本2.4及更高版本默认启用了 sendfile 内核系统调用。这反过来又促进了高性能网络文件传输(这是 Web 服务器-客户端通信环境中所需要的),并使 Apache 能够通过同时执行读取和发送操作更快地传递静态内容,同时降低 CPU 利用率。
您可以使用以下命令查看当前安装的内核:
# uname -r
并将其与 www.kernel.org 上的最新稳定内核(撰写本文时为 4.3)进行比较。
虽然这个过程并不适合初学者,但升级内核是一个有趣的练习,可以让你更多地了解 Linux 的内部结构。
提示#3:选择最适合您情况的多处理模块(MPM)
实际上,MPM扩展了 Apache 的模块化功能,允许您决定如何配置 Web 服务器以绑定到机器上的网络端口、接受来自客户端的请求以及使用子进程(和线程)来处理此类请求。
从 2.4 版开始,Apache 提供了三种不同的 MPM 供您选择,具体取决于您的需求:
- MPM
prefork
使用多个子进程,无需线程。每个进程一次处理一个连接,而无需为每个连接创建单独的线程。无需过多赘述,我们可以说,只有在调试使用非线程安全模块(如 mod_php)的应用程序时,或者您的应用程序需要处理这些模块时,您才需要使用此 MPM。 - MPM
worker
每个子进程使用多个线程,每个线程每次处理一个连接。对于高流量服务器来说,这是一个不错的选择,因为它允许使用比前一种情况更少的 RAM 来处理更多并发连接。 - 最后,
event
对于 2.4 版及更高版本,MPM 是大多数 Apache 安装中的默认 MPM。它与 worker MPM 类似,因为它也为每个子进程创建多个线程,但有一个优点:它使KeepAlive或空闲连接(当它们保持该状态时)由单个线程处理,从而释放可分配给其他线程的内存。此 MPM 不适合与非线程安全模块(如mod_php )一起使用,必须使用PHP-FPM等替代品。
要检查Apache 安装使用的MPM ,您可以执行以下操作:
# httpd -V
下图显示该特定的 Web 服务器正在使用prefork 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
注意:为了使事件 MPM 在 Debian 中工作,您可能必须从非自由存储库安装libapache2-mod-fastcgi包。
此外,对于 CentOS 您将需要php-fpm (以及fcgi和mod_fcgid ),而在 Debian 中它被称为php5-fpm (以及apache2-mpm-event )。
最后,但并非最不重要的一点是,重新启动 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 更改为 event 之后看到的内容:
在CentOS 7中,您需要确保通过防火墙启用http和https服务,并且网络接口正确添加到默认区域。
例如:
# 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
我之所以提起这个问题,是因为我最近遇到了一个问题,云 VPS 中的默认防火墙配置设置阻止了php-fpm和 Apache 处理 php 文件。
作为一个基本测试(我相信您可以想到更复杂或更紧张的测试),我将创建一个 php 文件,用于检查test.php
两个 CentOS 7 服务器的同一目录中是否存在另一个名为的文件,这两个服务器具有相同的硬件特性和负载,但具有不同的 MPM。其中一个将使用事件,另一个将使用 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
让我们运行测试并比较结果。注意性能统计数据:
如您所见,在本次测试的各个方面,带有事件的服务器的性能都远远优于其prefork版本的服务器。
提示 #4:为 Apache 明智地分配 RAM
需要考虑的最关键的硬件项目可能是分配给每个 Apache 进程的RAM量。虽然您无法直接控制这一点,但您可以通过MaxRequestWorkers指令(以前在 Apache 2.2中称为MaxClients)限制子进程的数量,这将限制 Apache 的 RAM 使用量。同样,您可以根据每个主机或每个虚拟主机设置此值。
为此,您应该记下 Apache 使用的平均 RAM 量,然后将其乘以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 服务器性能和Example.com 上的Apache 强化技巧文章。
由于我们无法在本文中充分涵盖该主题的所有方面,也许您会想到其他想要与社区其他成员分享的想法。如果是这样,请随时使用下面的评论表告诉我们。