如何优化的Apache Web服务器性能

如果你在Droplet的尺寸较小的一个运行Apache,或者如果你想在更大的Droplet最大限度地提高你的表现,下面是你应该做的几件事情。我会在实施例中使用Ubuntu 12.04,但我证明了的原则也适用于其他版本的Linux以及。

介绍


Apache是​​一个非常强大和功能强大的Web服务器。 为了使初始设置尽可能容易,它预装了大量模块。 这使得它成为新项目的一个很好的选择,当你需要快速的生产力。 但是,随着您的网站增长,您可能开始遇到性能问题。

首先吸引我到DigitalOcean的是成本低的开始。 最小和最便宜的Droplet有512MB的RAM,这在今天的大型框架的世界似乎不多。 但是,如果你花一点时间调整设置,你会惊讶地发现你可以使用这样的小型服务器做些什么。

如果你在一个较小尺寸的Droplet上运行Apache,或者想要在更大的Droplet上最大化你的性能,这里有一些你应该做的事情。 我将在示例中使用Ubuntu 12.04,但我演示的原则也适用于其他版本的Linux。

卸载不需要的模块


在Ubuntu和Debian为基础的系统,你会看到一个文件夹,名为/etc/apache2/mods-enabled并呼吁一个文件夹/etc/apache2/mods-available/ mods-available文件夹是特定服务器上安装的所有模块的列表,启用mods是当前活动的模块。

在我的VPS我有17个模块默认激活。 这太多了,大多数不需要我的应用程序。 不幸的是,你需要的模块可能不是很清楚,因为有些是他人的依赖。

我建议做的是制作一个所有当前活动模块的列表,并保存以备将来参考,以备您需要恢复。 然后简单地一个接一个地禁用模块,并在每次更改后重新启动Apache,以查看是否发生错误。

在Ubuntu和Debian上,使用命令(使用autoindex作为示例)禁用模块:

sudo a2dismod autoindex

一些特别资源匮乏的模块,如果你不需要,你应该禁用它们:

  • PHP
  • SSL
  • 改写
  • Perl
  • python
  • 机架/Ruby/Passenger

默认情况下,其中一些模块未启用,因此您可能没有启用它们,在某些情况下,它们已启用,因为您确实需要它们。

关于“改写”快速注:通常当“别名”模块将实际工作同样这个模块被启用。 如果你可以通过别名,然后禁用重写。 重写是更繁重的模块之一,但它也给Apache带来了一些显着的力量。

从“改写”到“别名”切换是一个高级主题(有一些有用的文档 )。但是,即使你不能完全关闭重写,但你能你的一些重写规则转换为别名,你将获得一个优势。

禁用模块并重新装载Apache配置后,可以检查apache错误日志中的消息。 在Ubuntu和Debian中,检查/var/log/apache2/error.log。

我得到一个错误,看起来像这样:

Syntax error on line 6 of /etc/apache2/sites-enabled/site1:
Invalid command 'DAVLockDB', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.

这意味着我刚刚禁用的模块是需要的。 在这种情况下,模块是dav_fs,所以我只是重新启用它:

sudo a2enmod dav_fs

然后我重新启动Apache,并寻找下一个错误。 它可能需要几次尝试,你得到最小列表排序。 要有耐心,这是值得的。

将代码移出Apache


如果你运行一个PHP网站,很可能是伟大的,你使用着名的mod_php。 如果你运行ruby站点,简单的解决方案是Passenger Phusion,也就是mod_rails或mod_rack。

这样做的问题是用于该语言的解释器的C代码被嵌入到Apache中,从而在每个页面视图上使用更多的内存。 如果您网站上的热门网页产生30个HTTP请求,其中一个将用于动态网页,而其他29则可能用于静态资源,例如图片,CSS和JavaScript。 为什么要为那些不提供任何动态内容的29个请求使用a肿的Apache?

区别可以是戏剧性的。 启用mod_php,并且可能造成它在每个Apache子进程内存使用100MB的使用! 考虑到,默认情况下,Apache服务器可能运行25个或更多进程,您可以看到为什么这会成为一个问题。

这里有一些工具,你可以使用这样做:

做这个变化的一个缺点是,很难让事情最初工作。 在某些情况下,文档是非常好的。 在其他情况下, 咳嗽PHP-FPM咳嗽的文档是稀疏。

通常发生的情况是,启动用于PHP或Python或Ruby的特殊服务器进程,然后Apache,而不是本能地知道如何通过嵌入式代码处理这些请求,只是将对动态内容的调用转发到这个后端进程。

你会惊讶于这有多大的区别。 从我的虚拟服务器中删除mod_php的后,我的Apache进程大小从每个 90-120MB去下10MB。 我只能用两个php后端进程来处理我所有的动态内容,每个进程只使用60MB。

限制Apache进程和子进程的数量


大多数操作系统的默认Apache配置不太适合较小的服务器 - 25个子进程或更多是常见的。 如果你的每个Apache子进程使用120MB的内存,那么你的VPS只需要3GB的Apache。

一个访问者的网络浏览器可以一次从网站请求4个项目,因此只有7或8个人试图加载页面,同时您的云服务器可能变得超载。 这导致网页在不断加载的状态下挂起,似乎是永恒的。

通常情况下,服务器将保持这些死的Apache进程活动,尝试在用户放弃后长时间提供内容,这减少了可用于为用户提供服务的进程数,并减少可用的系统RAM数量。 这会导致什么是俗称,在为您和您的网站的访问者不愉快的经历结束的螺旋式下降

你应该做的是找出你的应用程序需要多少RAM,然后找出剩下多少,并将大部分分配给Apache。

例如,如果你有三个php-fpm进程处理动态内容,每个可以使用高达70MB的内存,你的MySQL服务器可能使用高达120MB的RAM,这组合了应用程序使用的总共330MB。 这允许您为Apache分配大约150MB。

在Apache运行在服务器上打开靠前指挥。 我会粘贴一点你会看到,修剪掉大多数不相关的行:

top -bn 1
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                    
[...]
15015 www-data  20   0  232m 9644 1900 S  0.0  1.6   0:00.02 apache2                    
15016 www-data  20   0  232m 9644 1900 S  0.0  1.6   0:00.01 apache2                    
15017 www-data  20   0  232m 9644 1900 S  0.0  1.6   0:00.02 apache2                    

请注意Apache子进程的RES列,并记下其RES值。 例如,在我已经优化的虚拟服务器上,值为9,644,这意味着它使用不到10MB的RAM。 如果我限制Apache最多15个子进程,那么它应该最大在大约150MB的RAM。

编辑您的云服务器Apache的配置文件,这在Ubuntu和Debian是/etc/apache2/apache2.conf ,找到了MPM prefork的模块配置部分。 查找MaxClients行并将其设置为15,然后保存并重新启动Apache。

这里是一个例子你会看看在Ubuntu:

<IfModule mpm_prefork_module>
    StartServers          3
    MinSpareServers       3
    MaxSpareServers       5
    MaxClients           30
    MaxRequestsPerChild   0
</IfModule>

MaxClients的行吗? 我们需要将该值更改为较小的数字。

如果您的VPS超载,并达到可以立即服务的最大数量的客户端,它将为这些和其他用户将简单地得到一个快速失败。 然后他们可以重新加载页面,也许在第二次尝试更大的成功。

这听起来不错,但相信我,更好的是让这些连接快速关闭,但使服务器处于健康状态,而不是悬挂开放的永恒。 令人惊讶的是,您可以从服务器获得更好的性能,该服务器具有较少的子进程,但响应速度比具有更多子进程的服务器无法处理更快。

例如,我管理的Wordpress网站托管在1GB的Droplet使用4 php-fpm流程,并能够一次为超过950同时服务的用户。 这转换为峰值容量为每天约42万页面浏览量,如果这个网站变得流行足够!

考虑备用MPM配置


大多数的Apache配置在历史上使用的prefork的 MPM,它是线程安全的,因此适合于用PHP和其他嵌入式语言的使用。

如果你摆脱外部模块,如PHP或Rails的,那么你可以考虑工人 MPM,这往往比prefork的速度更快。

为了启用工作模块,你必须安装它。

sudo apt-get install apache2-mpm-worker

它会给你一个这样的消息:

The following packages will be REMOVED:
  apache2-mpm-prefork libapache2-mod-php5
The following NEW packages will be installed:
  apache2-mpm-worker
0 upgraded, 1 newly installed, 2 to remove and 2 not upgraded.
Need to get 2,284 B of archives.
After this operation, 8,718 kB disk space will be freed.
Do you want to continue [Y/n]? 

请务必注意,在Ubuntu上,如果你安装的工人MPM它会卸载prefork的MPM,它会卸载mod_php,并且和其他不兼容的附加模块。

在这里,我们讨论了您可以对Apache进行的四个优化,这些优化应该大大提高应用程序性能,即使您有一个小Droplet。

我强烈建议尝试这个测试Droplet,而不是你的生产服务器。 DigitalOcean的服务的优点是,你可以旋转一个新的Droplet只需要你需要测试的变化,并关闭它,你完成后的时间。 使用小时计费,这是一种低风险,低成本的方式,为您的VPS找到完美的配置。

:提交马修Nuzum