Apache 目前一共有三种稳定的 MPM 模式。它们分别是 prefork/worker 和 event,它们同时也代表 Apache 的演变和发展。今天杜老师就聊下 prefork 模式!
prefork 模式是很古老但是非常稳定的模式。用的是多个子进程,Apache 在启动之初,控制进程会建立若干子进程,然后等待请求进来,并且总是视图保持一些备用的子进程。为不在请求到来时再生成子进程,所以需要根据需求不断的创建新的子进程,最大可以达到每秒 32 个直到满足需求为止。之所以这样做,是为减少频繁创建和销毁进程的开销。每个子进程中只有一个线程,在一个时间点,只能处理一个请求。
在 Unix 系统,父进程通常以 root 身份运行以便绑定 80 端口,而 Apache 产生的子进程通常以一个低特权用户运行。User 和 Group 指令用于配置子进程的低特权用户。运行子进程的用户必须要对它所服务的内容有读取权限,但对服务内容之外的其它资源必须拥有尽可能少的权限。
在编译安装 Apache 的过程中,加参数–with-mpm=prefork 即可,如不加也可以,因为 Apache 默认采用 prefork 模式进行编译安装。
也可以使用–enable-mpms-shared=all,这样在编译的时候会在 modules 目录下自动编译出三个 MPM 文件的 so,然后通过修改 httpd.conf 配置文件更改 MPM 即可。
优点:成熟,兼容所有新老模块。进程之间完全独立,使它非常稳定。同时,不需要担心线程安全的问题。
缺点:一个进程相对占用更多系统资源,消耗更多内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等有可用进程,请求才被处理。
配置参数说明如下:
配置 | 说明 |
---|---|
StartServers 5 | 服务启动时初始进程数,默认是 5 |
MinSpareServers 5 | 最小空闲子进程数,默认是 5 |
MaxSpareServers 10 | 最大空闲子进程数,默认是 10 |
MaxRequestWorkers 250 | 限定同一时间内客户端最大接入请求数量,默认是 250 |
MaxConnectionsPerChild 0 | 每个子进程在其生命周期内允许最大请求数量,如果请求总数已经达到这个数值,子进程将结束,如果设置为 0,子进程将永远不会结束。该值设置为非 0 值,可以防止运行 PHP 导致的内存泄露 |