Apache 目前一共有三种稳定的 MPM 模式。它们分别是 prefork/worker 和 event,它们同时也代表 Apache 的演变和发展。今天杜老师就聊下 event 模式!
event 是 Apache 最新的工作模式,和 worker 模式很像,不同的是在于它解决了 keep-alive 长连接时候占用线程资源被浪费的问题。
event 工作模式中,会有一些专门的线程用来管理这些 keep-alive 类型线程,当真实请求过来的时候,将请求传递给服务器的线程,执行完毕之,又允许它释放。这样,一个线程就可以几个请求了,实现了异步非阻塞。这增强了在高并发场景下的请求处理。
event 工作模式在遇到某些不兼容模块时,如果,将会回退到 worker 模式,一个工作线程处理一个请求。官方自带模块全部支持 event 工作模式的。
event 工作模式需要 Linux 系统对 epoll 支持,才能启用。需要补充的是 HTTPS 的连接,它的运行模式仍然类似 worker 的方式,线程会被一直占用,知道连接关闭。
在编译安装 Apache 的过程中,加入参数–with-mpm=event 即进行编译安装。
也可以使用–enable-mpms-shared=all,这样在编译的时候会在 modules 目录下自动编译出三个 MPM 文件的 so,然后通过修改 httpd.conf 配置文件更改 MPM 即可。
配置 | 说明 |
---|---|
StartServers 3 | 服务启动时初始进程数,默认为 3 |
MinSpareThreads 75 | 最小空闲子进程数,默认为 75 |
MaxSpareThreads 250 | 最大空闲子进程数,默认为 250 |
ThreadsPerChild 25 | 每个子进程产生的线程数量,默认是 25 |
MaxRequestWorkers 400 | 限定同一时间内客户端最大接入的请求数,默认是 400 |
MaxConnectionsPerChild 0 | 每个子进程在其生命周期内允许最大请求数量,如果请求总数已经达到这个数值,子进程将结束,如果设置为 0,子进程将永远不会结束。将值设置为非 0 值,可以防止运行 PHP 导致的内存泄露 |
Apache 能更好的为有特殊要求的站点定制。例如,要求更高伸缩性的站点可以选择使用线程的 MPM,即 worker 或 event。
需要可靠性或者与旧软件兼容的站点则可以使用 prefork。就使用 PHP 而言,FastCGI 和 PHP-FPM 是更推荐的使用模式。