介绍
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可以受益于php-fpm,这是一个使用fastcgi协议的单独进程。
对于Python使用uWSGI或gnunicorn (更多Python的信息,请点击这里这篇大文章在DigitalOcean )。
钢轨,使用麒麟 (更多详情Ruby看到这篇文章在这里DigitalOcean覆盖麒麟 )。
做这个变化的一个缺点是,很难让事情最初工作。 在某些情况下,文档是非常好的。 在其他情况下, 咳嗽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找到完美的配置。