# Apache worker/prefork模式说明和优化配置
在linux中,我们可以利用 `http -l` 查看安装的模块时prefork模式还是worker模式。命令如下:
~~~
apachectl -l|grep -E 'prefork|worker'
apachectl -M |egrep 'prefork|worker'
~~~
## prefork模式
prefork模式使用的是多个子进程,每个子进程只有一个线程,每个进程在某个确定的时间只能维持一个连接。
### 工作原理
控制进程最初创建若干个子进程,为了不在请求来临时再生成子进程,所以要根据需求不断的创建新的子进程,最大可以达到每秒中32个知道满足需求为止。
### 源代码编译安装方法
在编译安装apache的过程中,加入参数`--with-mpm=prefork` **如果不加`--with-mpm`参数默认为prefork模式。**
**优点:** 效率高、稳定、安全。
**缺点:** 相比worker模式消耗资源更多。
### 配置参数说明
~~~
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestPerChild 5000
</IfModule>
~~~
* StartServers: 最初建立的子进程数量
* MinSpareServers: 最小空闲进程数,如果空闲的进程小于设定值,apache会自动创建进程,*如遇服务器并发负载较大时,可以考虑加大*。
* MaxSpareServers: 最大空闲进程数,如果空闲的进程大于设定值,apache会自动杀掉多余的进程,*如遇服务器并发负载较大时,可以考虑加大*。
* MaxClients: 设定的是apahce可以同时处理的请求数,**是对apache性能影响最大的参数**。
* MaxRequestPerChild: 每个子进程可处理的请求数。每个子进程在处理了"MaxRequestSperChild"个请求后会自动晓辉,0值意味着无限制,即子进程永不销毁,虽然默认设为0可以使每个子进程处理更多的请求,但如果设成非零值也有如下好处,1. 防止你内存泄露 2. 在服务器负载下降的时候会自动减少子进程数。
## worker模式
worker模式是apache2.0+引入的新模式,是线程与进程的结合,在worker模式下会有多个子进程,每个子进程优惠有多个线程,每个线程在某个确定的事件只能维持一个连接。
### 工作原理
由主控制进程生成若干个子进程,每个子进程又包含固定的线程数,各个线程独立处理请求,同样为了不在请求到来时再生成线程,在配置文件中设置了最小和最大的空闲线程及所有子进程中的线程总数,如果现有子进程中的线程总数不能满足并发及负载,控制进程将派生新的子进程。
### 源代码编译安装方法
在配置编译的过程中,加入参数`--with-mpm=worker` 如果不加的话系统会默认为prefork模式。
**另外worker模式**
优点:内存占用比prefork模式低,适合高并发高流量HTTP服务。
缺点:假如一个线程崩溃,整个进程就会连同其任何线程一起“挂掉”,由于线程共享内存空间,所以一个程式在运行时必须被系统识别为"每个线程都是安全的"。服务稳定性不如prefork模式。
### 配置参数说明
~~~
<IfModule mpm_worker_module>
StartServers 3
MaxClients 1600
serverLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadsPerChild 200
MaxRequestPerChild 0
</IfModule>
~~~
worker模式下所能同时处理的情趣总数是由子进程总数乘以ThreadSperChild值决定的,应该大于等于maxClients,如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。
默认最大的子进程数量总数为16,如需加大时需要声明ServerLimit的值(最大为2000)
如果声明了ServerLimit,那么他乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将自动调节到一个相应值。
MaxClients <= 总的进程数(ServerLimit) * 线程数(ThreadsPerChild)
MaxClients % ThreadsPerChild = 0
## 以上两种模式的配置方法
打开apace的主配置文件找到
~~~
# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf
~~~
删掉注释开启拓展配置。