金钱(警告)
** 状态:** 被贬值
如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议升级或迁移到支持的 Ubuntu 版本:
** 原因:** Ubuntu 12.04 已于 2017 年 4 月 28 日到期(EOL)并且不再收到安全补丁或更新。
** 相反,请参阅:** 此指南可能仍然有用作为参考,但可能不会在其他Ubuntu版本上工作. 如果可用,我们强烈建议使用为您正在使用的Ubuntu版本撰写的指南。
介绍
Apache是一个令人惊讶的强大和有能力的Web服务器。为了使初始设置尽可能简单,它配备了许多预先安装的模块,这使得它成为新项目的绝佳选择,当你需要快速生产时。
首先吸引我到DigitalOcean的是起步的低成本。最小的和最便宜的滴滴具有512MB的RAM,这在当今大框架世界中看起来并不多,但是如果你花一些时间调整设置,你会惊讶于你可以用这样一个小服务器做什么。
如果你正在运行Apache在较小的滴滴尺寸之一,或者如果你想最大限度地提高你的性能在较大的滴,这里有一些事情你应该做。
不需要的模块
在 Ubuntu 和 Debian 系统中,你会看到一个名为 /etc/apache2/mods-enabled’的文件夹和一个名为
/etc/apache2/mods-available/`的文件夹。
在我的VPS上,我默认情况下有17个模块活跃。这太多了,大多数不需要我的应用程序。不幸的是,您需要的模块可能不太清楚,因为有些模块依赖于其他模块。
我建议做的是列出所有当前活跃的模块,并将其保存为未来的参考,如果您需要重新返回,然后只需单独禁用模块,并在每次更改后重新启动Apache,以查看是否出现错误。
在 Ubuntu 和 Debian 上,您可以使用命令禁用一个模块(使用 autoindex 作为例子):
1sudo a2dismod autoindex
一些特别需要资源的模块,如果您不需要它们,您应该禁用:
- PHP
- SSL
- 重写
- Perl
- Python
- Rack / Ruby / 乘客
其中一些模块默认不启用,所以你可能没有启用它们,在某些情况下,它们被启用,因为你实际上需要它们。
关于重写
的快速注释: 通常这种模块被启用时,外名
模块实际上会工作同样好. 如果你可以通过外名,然后禁用重写。
从重写
切换到代名词
是一个高级主题(有一些 有用的文档)然而,即使你不能完全关闭重写,但你可以将一些重写规则转换为代名词,你将获得一个优势。
在禁用模块并重新加载 Apache 配置后,您可以检查 apache 错误日志以获取消息. 在 Ubuntu 和 Debian 中,请检查 /var/log/apache2/error.log。
我收到一个错误,看起来像这样:
1Syntax error on line 6 of /etc/apache2/sites-enabled/site1:
2Invalid command 'DAVLockDB', perhaps misspelled or defined by a module not included in the server configuration
3Action 'configtest' failed.
这意味着我刚刚禁用的模块是必要的,在这种情况下,该模块是 dav_fs,所以我只是用:
1sudo a2enmod dav_fs
然后我重新启动了Apache,并寻找下一个错误。在你找到最小列表之前可能需要几次尝试。
从 Apache 移除代码
如果你运行一个PHP网站,很可能你正在使用着名的mod_php. 如果你正在运行一个Ruby网站,简单的解决方案是乘客混淆,也称为mod_rails或mod_rack。
这个问题是,该语言的翻译器的C代码嵌入到Apache中,从而在每个页面视图上使用更多的内存。如果您的网站上的一个受欢迎的页面导致30个HTTP请求,其中一个将用于动态页面,另一个29个可能会用于静态资源,如图像,css和 javascript。
允许mod_php可以使它使用超过100MB的RAM使用量!考虑到,默认情况下,你的Apache服务器可能有25个或更多的流程运行,你可以看到为什么这可能成为一个问题。
这里有一些工具,你可以用来做到这一点:
- PHP 可以从 php-fpm 中受益,这是一种使用 fastcgi 协议的独立过程。
- 对于 Python 使用 uWSGI或 gnunicorn (对于更多 Python 信息,请参阅 DigitalOcean 上的这个伟大的文章)。
做这种改变的一个缺点是,它更难让事情起初工作. 在某些情况下,文档非常好. 在其他情况下, cough php-fpm cough 文档很少。
通常情况下,PHP或Python或Ruby的特殊服务器流程被启动,然后Apache,而不是本能地知道如何通过嵌入式代码处理这些请求,只是将动态内容的呼叫转移到这个后端流程。
在从我的虚拟服务器中删除mod_php后,我的Apache流程的大小从90-120MB到10MB以下。
限制Apache进程和儿童的数量
大多数操作系统的默认 Apache 配置不适合较小的服务器 - 25 个或更多的孩子流程是常见的. 如果您的每个 Apache 孩子流程使用 120 MB 的 RAM,那么您的 VPS 只需要 3 GB 的 Apache。
一个访客的网页浏览器可以同时要求4个项目从网站上,所以只有7或8个人试图在同一时间加载页面,你的云服务器可能会变得过载。
通常情况下,服务器会保持这些死去的Apache流程活跃,试图在用户放弃后很长时间内提供内容,从而减少了可供用户服务的流程数量,并减少了可用的系统内存量。
你应该做的就是弄清楚你的应用程序需要多少内存,然后弄清楚剩下多少,并将大部分分配给Apache。
例如,如果您有三个 php-fpm 流程处理动态内容,每个流程可以使用高达 70 MB 的 RAM,而您的 MySQL 服务器可能会使用高达 120 MB 的 RAM,这将合并到应用程序使用的总数为 330 MB。
虽然Apache正在运行,在服务器上打开 top命令,我会粘贴一些你会看到的内容,删除大多数不相关的行:
1top -bn 1
2 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3[...]
415015 www-data 20 0 232m 9644 1900 S 0.0 1.6 0:00.02 apache2
515016 www-data 20 0 232m 9644 1900 S 0.0 1.6 0:00.01 apache2
615017 www-data 20 0 232m 9644 1900 S 0.0 1.6 0:00.02 apache2
例如,在我的虚拟服务器上,它已经被优化得很好,值是9,644,这意味着它不使用10MB的RAM。
编辑您的云服务器的 apache 配置文件,在 Ubuntu 和 Debian 上是 /etc/apache2/apache2.conf
,并找到 mpm_prefork_module 配置的部分。
以下是一個例子,你會在Ubuntu中尋找什麼:
1<IfModule mpm_prefork_module>
2 StartServers 3
3 MinSpareServers 3
4 MaxSpareServers 5
5 MaxClients 30
6 MaxRequestsPerChild 0
7</IfModule>
看看那边的 MaxClients行吗?我们需要将这个值更改为较低的数字。
如果您的VPS过载,并达到它可以同时服务的最大客户数,它将为这些用户提供服务,其他用户只会快速失败,然后他们可以重新加载页面,也许在第二次尝试中会更成功。
这听起来很糟糕,但相信我,要让这些连接快速关闭,但让服务器处于健康状态,而不是永久开放,这是更好的选择,令人惊讶的是,你可以从一个服务器中获得更好的性能,它有更少的儿童流程,但响应更快,而不是有一个服务器有更多的儿童流程,它无法处理。
事實上,我所管理的WordPress網站是使用4個php-fpm流程在1GB的滴面上托管的,可以同時服務950多位同時使用者,這意味著每天約有4200萬頁面瀏覽的頂級容量,如果這個網站有時會變得足夠受歡迎!
考虑替代MPM配置
大多数Apache配置历史上都使用了 prefork mpm,它是线程安全的,因此适用于PHP和其他嵌入式语言。
如果你摆脱了 PHP 或 Rails 等外部模块,那么你可以考虑到 worker MPM,这通常比 prefork 更快。
为了启用工人模块,您必须安装它。
1sudo apt-get install apache2-mpm-worker
它会给你一个这样的信息:
1The following packages will be REMOVED:
2 apache2-mpm-prefork libapache2-mod-php5
3The following NEW packages will be installed:
4 apache2-mpm-worker
50 upgraded, 1 newly installed, 2 to remove and 2 not upgraded.
6Need to get 2,284 B of archives.
7After this operation, 8,718 kB disk space will be freed.
8Do you want to continue [Y/n]?
请注意,在Ubuntu上,如果您安装 worker mpm,它会卸载prefork mpm _and_它会卸载mod_php和其他不兼容的添加模块。
在这里,我们讨论了你可以对Apache进行的四种优化,这些优化应该大大提高应用程序的性能,即使你有一个小小的下降。
我强烈建议在测试滴面上尝试,而不是在您的生产服务器上。DigitalOcean的服务的美好之处在于,您可以为测试更改所需的时间旋转一个新的滴面,并在完成时关闭它。