网站搜索

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


根据 Netcraft(一家著名的互联网公司,提供 Web 浏览器使用统计数据等服务)最近的一份报告,Apache 仍然是站点和面向 Internet 的计算机中使用最广泛的 Web 服务器。

此外,Apache 在顶级 Web 服务器中继续保持最大增长,其次是 NginxIIS。因此,如果您是负责管理 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 httpdaptitude safe-upgrade apache2,分别)除非没有其他办法。您可以在 Apache HTTP 服务器项目网站的 Apache 文档部分阅读最新的发行说明。

提示 #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 可供选择,具体取决于您的需求:

  1. prefork MPM 使用多个子进程而不使用线程。每个进程一次处理一个连接,无需为每个连接创建单独的线程。无需过多讨论,我们可以说,只有在调试使用非线程安全模块(如 mod_php)的应用程序时,或者您的应用程序需要处理非线程安全模块(如 mod_php)时,您才需要使用此 MPM。
  2. worker MPM 每个子进程使用多个线程,其中每个线程一次处理一个连接。对于高流量服务器来说,这是一个不错的选择,因为与之前的情况相比,它允许使用更少的 RAM 处理更多的并发连接。
  3. 最后,event MPM 是大多数 Apache 2.4 及更高版本安装中的默认 MPM。它与工作 MPM 类似,它也为每个子进程创建多个线程,但有一个优点:它会导致 KeepAliveidle 连接(当它们保持在该状态时)由单个线程处理,从而释放可分配给其他线程的内存。此 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_eventmpm_workermpm_prefork

并取消注释加载所需模块的行,如下所示:

LoadModule mpm_event_module modules/mod_mpm_event.so

注意:要使事件 MPM 在 Debian 中工作,您可能必须从非免费版本安装 libapache2-mod-fastcgi 软件包存储库。

此外,对于 CentOS,您将需要 php-fpm (以及 fcgimod_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 中,您需要确保通过防火墙启用 httphttps 服务,并且网络接口)已正确添加到默认区域。

例如:

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 文件来检查两个 CentOS 的同一目录中是否存在另一个名为 test.php 的文件7 台服务器具有相同的硬件特性和负载,但具有不同的 MPM。其中一个将使用 event,另一个将使用 prefork:

这是我保存到名为 checkiffileexists.php 的文件中的 php 代码:

<?php
$filename = 'test.php';

if (file_exists($filename)) {
    echo "The file $filename exists";
} else {
    echo "The file $filename does not exist";
}
?>

然后,我们将运行具有 200 个并发请求的 Apache 基准测试工具 (ab),直到完成 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 服务器并提高其性能。此外,您应该记住,没有安全性的优化和性能是没有意义的,因此您可能还需要参考 Howtoing.com 中的安装 mod_pagespeed 以提高 Web 服务器性能和 Apache 强化技巧文章。

由于我们无法在本文中充分涵盖该主题的所有方面,也许您会想到想要与社区其他成员分享的其他想法。如果是这样,请随时使用下面的评论表告诉我们。