Apache的工作模式主要有:prefork,worker和event。当然,都是多进程模式,没办法apache就是这样。其中,prefork是多进程单线程模式;worker是多进程多线程模式;event在多进程多线程方面引入了一个管理类型的线程,可以主动释放这些闲置进程。今天,我们主要说下最新的event模式的优化教程。

古哥一直用的是lamp环境,即linux+apache+mysql+php,相信大部分人用的都是lnmp,即nginx服务器。相比于nginx,apache比较费资源,主要表现在进程多,内存占用高,内存不释放等问题。
前文中,已经描述过Apache的三种模式,现在我们再列出三张框架图,让你更加清楚的看懂这三种模式的不同点:
没有疑问,我们肯定要选择event的工作模式,在终端输入如下内容(请注意,是大写的V),判断自己Apache的工作模式:
httpd -V 得到如下反馈: Server version: Apache/2.4.46 (Unix) Server built: Oct 25 2020 23:00:24 Server's Module Magic Number: 20120211:93 Server loaded: APR 1.7.0, APR-UTIL 1.6.1 Compiled using: APR 1.7.0, APR-UTIL 1.6.1 Architecture: 64-bit Server MPM: event threaded: yes (fixed thread count) forked: yes (variable process count) Server compiled with.... -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) -D APR_USE_PROC_PTHREAD_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=256 -D HTTPD_ROOT="/usr/local/apache" -D SUEXEC_BIN="/usr/local/apache/bin/suexec" -D DEFAULT_PIDLOG="logs/httpd.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="conf/mime.types" -D SERVER_CONFIG_FILE="conf/httpd.conf"
我们找到Server MPM:,可以看到工作模式为event模式。
接下来,我们开始优化Apache的进程线程管理模块:
如果你用的是lamp一键包,那么请打开/usr/local/apache/conf目录,找到httpd.conf文件,搜索找到下面的内容:
#Include conf/extra/httpd-mpm.conf
将前面的#去掉,保存文件。
接着打开/usr/local/apache/conf/extra/httpd-mpm.conf,找到mpm_enent_module部分,修改下面的参数:
<IfModule mpm_event_module> StartServers 3 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 200 </IfModule>
主要修改了MaxConnectionsPerChild为200,可以理解为最大子线程200个,超过就自动释放进程。默认为0,即不释放子线程。所以,你会发现自己的apache占用内存越来越高。
当然,这个具体数值,要根据你的访客数量,进行调整。具体如何调整,可以参考官方文档:http://httpd.apache.org/docs/2.4/mod/event.html。
到此,优化结束!下面我们回顾下优化之前与优化之后的对比结果:
优化前:apache进程每天3点自动清理,内存降低到最小值。然后随着用户访问,内存量开始增加,不见任何减小趋势。到了晚上,基本上内存占用接近70%。再等到第二天3点自动清理。
优化后:apache进程还是每天3点自动清理,但随着用户访问,内存会增加。但是,当访问停止或者进程达到某个阈值,内存开始直接降低,并且基本上不会超过40%占用。
关于Wordrpess后台,优化apache之前,关闭后台,内存未清理;现在,关闭后台,内存立马清理。这说明,在未设置最大子线程时,内存基本没有释放的功能。好了,下面是我最近观察的内存占用情况,自行判断吧:
最后说一下,优化后主要是让apache有了内存释放机制,即最大子线程设置。
关于apache三种工作模式,这里推荐使用event模式。其他的模式,说实话,貌似也不存在这个线程管理释放的功能。而这个event模式是在2.4版本后引入的,所以,一般大家都是event模式,只需优化一下参数即可。
最后,再放一个最近改好的ssh登录终端,欢迎语,炫酷就对了。

原创文章,作者:古哥,转载需经过作者授权同意,并附上原文链接:https://iymark.com/website/apache-mode-event-optimize.html