本教程讲解如何通过优化 Linux® 提高 Apache 的性能。

开始之前

关于本教程

Apache 是一个可高度定制的守护进程。可以根据特定平台、环境和性能阈值对这个软件进行大量定制。但是,大多数管理员只运行普通的开箱即用的安装,很少对默认配置进行修改。

本教程针对具有以下需求的读者:

  • 在 Apache 上运行特定的应用程序,希望了解如何调整 Apache 来满足应用程序的特殊需求
  • 在低成本的 Linux 平台上使用 Apache(与其他操作系统相比,Linux 能够更好地发挥老式硬件的作用),希望了解如何让老式硬件产生最好的性能。
  • 对最近的 Microsoft® 更新不满意,希望找到替代 Windows® 软件的产品。

目标

本教程主要关注如何通过优化 Linux 提高 Apache 的性能。学完本教程之后,您应该会熟悉许多控制 Apache 并调整其行为的建议、提示和技巧,使 Apache 更加适合于它运行的环境。涉及的主题包括:

  • 硬件问题。
    选择有效的硬件,使用容错,以及性价比分析
  • 操作系统考虑因素。
    平台/发行版选择,内核编译,磁盘优化
  • 从头编译 Apache。
    定制编译的好处、过程和编译时的一些考虑因素
  • 配置建议。
    运行时参数,httpd.conf 文件,以及静态与动态内容场景

外部性能考虑因素

Apache 在很大程度上依靠自身的配置来管理它的性能和负载,但是它需要借助于操作系统的帮助。本节主要关注如何检查操作系统,确保它产生最佳性能。

Apache 适用于许多种平台,包括 Windows NT/2000、Linux、所有风格的 UNIX、Sun 的 Solaris 和 BSD 系列操作系统。本教程主要关注如何通过优化 Linux 来提高 Apache 的性能。还将学习一些调整方法和技巧。

内核

首先看看内核。您很可能正在运行 Linux 发行版附带的常规内核。尽管常规内核本质上并不差,但是它们常常在预编译时增加了对许多硬件的支持。这主要是为了方便安装,但是有经验的用户会重新编译内核,去掉所有多余的硬件支持。毕竟,在 Web 服务器中为什么需要支持 ham radio 呢?它完全是在浪费宝贵的资源,这些资源本来可以用在更有用的方面。

接下来,访问服务器上的 /usr/src/linux/net 目录,并在文本编辑器中打开 TUNABLE 文件。这个文件列出了在编译内核时可以指定的所有参数。除非理解网络设备配置的内部原理,否则应该避免调整这些配置。对于 Linux 高手和有开发高性能系统经验的其他人,可以通过修改配置提高性能。

操作系统的一般规则

现在,脱离 Linux 的范围,看看适用于所有操作系统的一般规则。对于任何服务器,管理员首先应该做的事情是禁用高级电源管理(advanced power management,APM)模块。无论机器是桌面机还是服务器,APM 都会浪费 CPU 和内存资源,而其收益不一定会超过它造成的麻烦和问题。另外,您肯定不希望公司的 Web 服务器莫名其妙地转入睡眠状态。

禁用了 APM 之后,还要检查是否正在运行其他不需要的服务。通过取消这些服务,可以向有意义的服务提供更多机器处理能力,减少资源争用问题对 Web 服务器的影响。可以关闭的一些重要进程,包括不需要使用的任何 Xwindows、KDE、Gnome 任务和其他程序。

还要通过命令行查看目前运行的所有服务及其进程 ID。在下面的 “优先级” 一节中需要这些信息。

优先级

可以使用 Linux 实用程序 nicerenice 调整剩余服务的优先级。可以使用这些实用程序提高服务器上 Apache 或其他软件的调度优先级,这样操作系统就会认识到它们比其他进程更重要。

例如,可以把 Apache(httpd)的优先级改为 -15,这已经接近上限(优先级从最高的 -20 到最低的 19)。可以从命令行使用这两个实用程序:

  • 要想停止现有服务并以优先级 -15 重新启动它,可以发出命令 nice -15 httpd
  • 要想避免停止服务,可以发出命令 renice -15 -p 1996

这里的差异是 renice 需要进程 ID(或 pid)。如上所述,可以使用 top 查明 pid。nicerenice 是很灵活的程序,更多信息参见手册页。

另外,还可以使用 irqtune 实用程序调整处理器响应来自系统中各种设备的中断请求的方式。

优化硬盘

使用 hdparm 对硬盘进行调优。可以用这个实用程序调整大多数 Linux 发行版中标准 IDE 驱动器的输入/输出控制。大多数选项适用于常规的 IDE 驱动器,但是一些选项需要 2.0.10 以上版本附带的现代 EIDE 驱动器。

如果使用默认的 Linux 安装,可以把 Linux 的硬盘访问速度提高 2 倍。hdparm 对 IDE 硬盘最有用,但是一些 hdparm 设置也适用于 SCSI。关于 hdparm 实用程序的更多信息,请参见 参考资料 中的链接。

编译 Apache 的定制版本

由于 Apache 简单而且容易掌握,大多数 Linux 发行版都附带预编译和预安装的 Apache。Apache 大量使用模块,所以管理员可以启用许多不同的功能。每个发行版都附带一些可以马上使用的模块,因此开箱即用的 Apache 安装足以满足一般性 Web 站点的需求。

对于您的需求来说,通用的 Apache 配置可能不是最优的。下面学习哪些 Apache 模块可以提供您需要的功能,并构造一个高性能的 Apache 安装。

过程

要想从头构造 Apache 安装,需要完成四个主要步骤:

  1. 决定合适的 Apache 配置。
  2. 从 Apache 发行站下载最新的二进制文件。
  3. 从源代码文件编译二进制文件。
  4. 测试新的可执行文件。

如果测试没有问题,就把刚创建的文件放在系统中的适当位置。

Apache 模块

计划 Apache 安装的关键是确定满足站点需求所需的模块。Apache 附带大约 40 个标准 模块(这些模块是 Apache 开发组认可的)。这些标准模块提供各种各样的功能,包括内容过滤、环境支持和辅助管理。在 http://www.apache.org/docs/mod/index.html 的 Apache 文档中可以找到所有标准模块的名称及其说明(参见 参考资料)。

Apache Module Registry 是一个很好的额外资源,它提供标准模块之外的其他模块。这里提供的模块可以解析身份验证和参数、通过 Jserv 和 Jakarta 项目解释 Java ,并且支持 Python 和 Tcl/tk 等编程语言。







Mod_so

一个值得关注的模块。Mod_so 模块使 Apache 能够在运行时调用其他模块,这样就不需要把其他模块编译到 httpd 二进制文件中。如果管理员需要在系统上运行多个不同配置的 Apache 实例(可能监听不同的网络接口),常常会使用这个功能。

每个实例可以调用自己的模块(在这个上下文中称为共享对象)。管理员只需关注一个 Apache 安装。无论是编译为共享对象,还是静态地编译到 Apache 二进制文件中,大多数模块的功能是相同的。

要想进一步简化模块的动态调用,可以使用 apxs 脚本获取一个或多个模块、把它们编译为共享对象、可选地放置它们并在 Apache 配置文件中启用它们。

共享对象 mod_soapxs 对所有 Apache 用户都有好处,尤其是对于常常修改配置的用户。对源代码的任何修改都需要重新编译 Apache,而这些工具可以避免这些麻烦。







APACI 和配置脚本

可以使用 APache AutoConf-style Interface(APACI)加快配置过程;用户界面是一个称为 configure 的脚本。configure 脚本使用来自命令行的开关。用来创建 makefile 的最常用开关是 -enable-module-disable-module-enable-shared-with-layout-enable-module 启用一个在默认情况下没有打开的模块,-disable-module 的作用正好相反。这两个开关都需要以 -enable[disable]-module=xxxxx的形式指定模块(模块名是 mod_xxxxx)。

使用 -with-layout 指定在编译 Apache 之后放置各个部分的位置。通过使用布局,可以在编译之前定义所有位置。布局是在 Apache 源代码根目录中的 config.layout 文件中定义的。有几个预定义的布局,但是我总是创建一个定制的布局,使我的所有系统尽可能保持一致。







一个布局示例

下面是我在自己的系统上编译 Apache 时最常用的布局。

prefix: /usr/local/apache
exec_prefix: $prefix
bindir: $exec_prefix/bin
sbindir: $exec_prefix/bin
libexecdir: $exec_prefix/libexec
mandir: /usr/local/man
sysconfdir: /etc
datadir: $prefix
iconsdir: $datadir/icons
htdocsdir: $datadir/html
cgidir: $datadir/cgi-bin
includedir: /usr/include/apache
localstatedir: /var/httpd
runtimedir: $localstatedir/rtlogs
logfiledir: $localstatedir/logs
proxycachedir: $localstatedir/proxy







开始编译过程

现在可以开始编译自己的 Apache 可执行程序的过程。

http://www.apache.org/dist/ 获得最新的 Apache 源代码并下载到 /tmp 中。到撰写本文时,最新版本是 1.3.22。然后,用以下命令进行文件解压:

# cd /tmp
# gunzip -c apache_1.3.22.tar.gz | tar xf -
# cd apache_1.3.22/







配置和编译

接下来,输入以下命令开始配置过程。

# cd /usr/local/src/apache_1.3.22
# ./configure -with-layout=JonStandard \
-disable-module=imap \
-disable-module=asis \
-disable-module=userdir \
-disable-module=autoindex \ 
-verbose

这些禁用的模块只是为了演示如何正确使用语法。在这个实例中,禁用了 mod_imap 和 mod_asis(因为没有 imagemaps 或 asis 文件)以及 mod_userdir 和 mod_autoindex(因为没有用户目录和包含索引文件的其他目录)。还添加了 -verbose 选项,这让 configure 脚本准确地说明其操作。






继续编译

这个过程完成之后,显示命令提示。要完成 Apache 编译,请在命令提示上:

  1. 输入 make。屏幕上会出现消息,说明编译的情况。
  2. 完成编译之后,输入 make install 把文件放到所选布局指定的目录中。

现在完成了!






完成的二进制文件

完成的二进制文件如下:

# /usr/local/apache/bin/httpd -l
Compiled-in modules:
http_core.c
mod_env.c
mod_log_config.c
mod_mime.c
mod_negotiation.c
mod_status.c
mod_include.c
mod_dir.c
mod_cgi.c
mod_actions.c
mod_speling.c
mod_alias.c
mod_access.c
mod_setenvif.c

通过配置设置优化 Apache

到目前为止,已经考虑了操作环境中的性能调优和定制编译的 Apache 守护进程的安装,消除了大多数预编译发行版中多余的部分。现在,要关注 Apache 的运行时选项并通过调整它们进一步改进性能。

一般设置

需要在 Apache 的 httpd.conf 配置文件中设置以下指令:

HostnameLookups off —— 使用域名服务(DNS)的服务总会影响到性能。动态创建的脚本往往只需要 IP 地址,而不是完全规范化的名称。这个指令覆盖默认设置,禁止通过 DNS 进行主机名查询。

AllowOverride none —— 这个指令指示 Apache 不要在它可以访问的每个目录中寻找 .htaccess 文件。如果没有这个指令,Apache 就会浪费处理器时间在提供页面的每个目录中寻找 .htaccess 文件。

Options FollowSymLinksOptions SymLinksIfOwnerMatch —— 这些设置消除多余的系统调用。它们告诉 Apache 是否跟随文件系统中的符号链接以及跟随的条件。尽管文件系统中的符号链接更便于使用,但是会降低 Web 服务的速度。

SendBufferSize —— 如果把这个设置的值增加到最大 Web 页面的大小,就可以降低 Web 服务器的磁盘负担。从内存缓冲区提供页面的速度比物理磁盘快几百倍。

DirectoryIndex index.cgi index.pl index.shtml index.html —— 内容协商(Content negotiation)会降低性能,但是大多数实现都需要它。由于其便利性,内容协商成为一种不可避免的开销。为了降低它对性能的有害影响,这个指令提供选项的完整列表,避免 Apache 浪费时间和资源猜测索引文件。

MinSpareServers、MaxSpareServersStartServers —— 这些设置控制 Apache 启动多少个子进程来处理 Web 请求。

1.3 之前的 Apache 版本使用一种称为 ramp-up period 的机制控制启动多少个子进程来处理负载。ramp-up period 机制每秒启动一个子进程。因为对于高负载来说每秒一个子进程的响应时间太慢了,这在基准测试中会成为问题。但是在实践中,因为 Apache 服务器很少重新启动,所以其功用还有待确定:大多数子进程已经装载了,因此不需要 ramp-up period。

Apache 1.3 改变了这个 “每秒一个” 规则,允许子进程以指数形式快速增加。例如,Apache 将生成一个进程,等一秒,然后生成两个进程,再等一秒,然后生成四个进程,依此类推。这个过程一直持续到每秒生成 32 个子进程,或者达到 MinSpareServers 指定的值。

MaxRequestsPerChildKeepAliveTimeout —— 这两个设置控制所有子进程的销毁。

  • MaxRequestsPerChild 设置决定一个子进程最多可以处理多少个请求,超过这个数量之后,Apache 就会生成新的子进程。默认值是 30,但是应该考虑加大这个值:Apache 足够健壮,可以处理更大的负载。如果使用 mod_perl,就应该重新考虑修改它的默认值,因为这个模块造成子进程占用大量内存页面。
  • KeepAliveTimeout 设置指定空闲子进程存活的最长时间,超过这个时间之后,就会杀死子进程。不要把这个值增加到 60 以上,因为空闲的子进程会浪费服务器资源。






逗留的连接

Apache 倾向于逗留刚刚发送数据的连接,但是这样做没有意义。一个小守护进程 lingerd 有助于纠正这种倾向。lingerd 通过接管这些逗留连接,让 Apache 能够立即为另一个 HTTP 请求服务。要使用 lingerd,必须对 Apache 源代码应用补丁。这不适合于新手,但是您应该知道 lingerd 守护进程可以产生显著的速度提升。






使用 PHP 的动态内容

PHP 消耗的资源比较多,需要的处理器时间是静态 HTML 页面的 2 到 10 倍。从性能的角度来看,最好只在站点需要的地方上使用 PHP。

为了消除通过 CGI 调用 PHP 的额外开销,要确保把 PHP 静态地安装在 Apache 中或者作为动态调用的模块。另外,应该尝试用 -enable-inline-optimization -disabl debug 设置编译 PHP4。这会提高 PHP 脚本编译的速度,与缓存产品结合使用可以降低生成动态内容时服务器的响应时间。

另外,可以考虑用 -with-mm 选项编译 PHP 并在 php.ini 中设置 session.save_handler=mm,从而切换到共享内存会话。这些修改可能使性能提高一倍。

要想进一步优化 Apache 安装的 PHP 性能,可以使用某种 PHP 缓存产品。缓存脚本意味着不需要在每次调用时都编译脚本。缓存脚本之后,常常能够获得 50% 的性能提升。另外,也可以缓存 PHP 脚本产生的 HTML 结果,这也可以节省时间。

注意事项

您需要快速优化 Web 服务器和检查表吗?本节提供一些简单的技巧和选项,帮助您快速有效地提高 Apache 安装的性能。

使用 Apache 的当前版本。这种 Web 服务器软件的开发当前还在继续。每两周更新一次,甚至更频繁。这些更新常常包含对基本代码的性能改进,或者用来提高 Apache 的灵活性和模块化的新模块。

避免服务器端包含。服务器端包含会消耗大量资源,会增加每个服务器请求的计算时间和开销。存在跨多个页面保持站点结构和内容一致的更高效的方法,但是这超出了本教程的范围。考虑买一本 Web 设计方面的书,里面会介绍这方面的内容。

必须单独启动 httpd要避免在 inetd 超守护进程或 tcpd 中启动 Apache 进程。要想在引导系统时启动 Apache,应该在 rc.local 中添加 startup 命令,或者把启动脚本放在 /etc/rc.d/rc3.d/ 中。

从另一台机器提供图形。这样,您的服务器只需处理静态 HTML 和已经创建的动态内容。这个技巧对于包含大量图形的站点尤其有意义,这些站点通过使用图像压缩程序节省带宽和下载时间。

要在 Apache 安装上进行压力测试。对 Apache 的压力测试度量改进措施使性能提高了多少。可以使用 ab 程序(在 Apache 的 bin 或 sbin 目录中)模拟服务器的负载。

不要在 Web 服务器上运行无关的服务。为什么要白白消耗处理器和缓存时间呢?应该尽可能让一台机器用于 Web 服务;即使是老式机器也足以应付中低程度的服务负载。Apache 能够充分利用硬件资源,对于老式机器也不例外。

不要使用网络文件系统(NFS)在网络上保存内容或日志。应该把所有内容放在运行 Apache 的服务器的本地磁盘驱动器上。不仅 NFS 的网络吞吐量比本地磁盘子系统上的 I/O 操作低,而且 NFS 还需要处理器时间。

不要为不需要日志的站点保存日志。这应该是显而易见的,尤其是对于专门提供图形的机器。在 httpd.conf 中,使用 TransferLog 指令把这些不需要的日志发送到 /dev/null 销毁掉。

结束语

开始优化您的 Apache 安装

恭喜!您已经学完了本教程,并且掌握了以下技能:

  • 通过优化 Linux 操作系统提高 Apache Web 服务器的性能
  • 根据自己的需求编译 Apache 的定制版本
  • 通过 Apache 的配置设置尽可能提高性能

您可以调整许多选项来提高 Apache 的性能。本教程提供了一些实用的技巧,但还有许多其他技巧。可以通过 参考资料 中列出的链接进一步学习 Apache 性能调优。

参考资料

学习

  • 从 Apache Web 网站上的 Apache group 下载 官方认可的模块
  • Apache Module Registry 是一个模块数据库,包含标准 Apache 发行版之外的许多模块,可以在您的 Apache 安装中使用。浏览 modules.apache.org,寻找扩展 Web 服务器功能的机会。

     

    关于作者

    Jonathan Hassell 拥有并管理 Enable Hosting,这是一家位于北卡罗莱纳州 Charlotte 的 Web 服务提供商。他还定期为计算机行业出版物撰稿。Jonathan 还从事电视剧本写作。可以通过 jon@jonathanhassell.com 与他联系。

本日志由 flyinweb 于 2009-08-16 17:26:50 发表,目前已经被浏览 3983 次,评论 0 次;

作者添加了以下标签: Apache性能调优

引用通告:http://www.517sou.net/Article/191/Trackback.ashx

评论订阅:http://www.517sou.net/Article/191/Feeds.ashx

评论列表

    暂时没有评论
(必填)
(必填,不会被公开)