在低内存VPS上配置使用Apache2.4
TL;DR
介绍了更先进的响应式多线程mod_event多进程模块,揭开Apache服务器占用内存多的迷思。
引子
所谓低配虚拟主机(VPS),首要问题就是内存小。除了某厂商坚持使用石头作为磁盘,和某些痴迷挖矿的群体对XEN虚拟CPU斤斤计较外,内存的大小或多或少地限制了我们的想象空间。
遇到的问题
自Apache2.4开始mod_event多进程模块(MPM)正式被列入稳定状态(区分实验状态)。 然而包括debian9在内的大多数发行版仍然默认使用mod_prefork配置。
简单来说prefork方案使得Apache派生出非常多进程,每个进程包含一个线程,并且每个进程同时只处理一个请求。 虽然这么做能让不是“线程安全”的软件库正常工作,也正是每个请求一个进程的原因, 使得网间对Apache的印象就是吃很多内存。
解决方法
拒绝mod_php
很可惜,博主读过的大部分文章、官方教程都会使用这个模块。出厂即用的感觉确实不错,可惜它并不优雅。
这里引用官方对于mod_php
的描述
Why you shouldn’t use mod_php with the prefork mpm anymore
- mod_php is loaded into every httpd process all the time. Even when httpd is serving static/non php content, that memory is in use.
- mod_php is not thread safe and forces you to stick with the prefork mpm (multi process, no threads), which is the slowest possible configuration
简单来说,就是指mod_php
不是线程安全的,用了它就只能使用prefork模块。
同时这个模块会常驻所有接受请求的进程,无论请求内容是否和PHP解析有关。
使用mod_event
开启mod_event是很简单的,复杂的是对依赖于prefork的模块的处理。比如将mod_php迁移成php-fpm,再对后者进行调优的操作。
限制连接数
将上述内容保存到Apache配置目录的conf-available
下,命名为mod_event.conf
。
上述配置讲述了一个Apache服务器,启动时派生StartServers
个进程,每个进程ThreadsPerChild
个线程,用线程处理请求。
服务高峰期,最多将会派生ServerLimit
个工作进程,同样每个ThreadsPerChild
线程。也就是说服务器最多能同时接受8 * 64 = 512
个请求。
如果你好奇在调优完成后,Apache内存的占用,那么如下便是一个闲置Apache2.4服务器的占用 – 0.0%
(对比同样是www-data用户启动的nginx,闲置时0.4%)
FYI
-
Apache Documents – Apache MPM event
-
Apache Wiki – Running PHP on Apache httpd
-
wiki.mikejung.biz – Apache Tunning