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