Apache 两种工作模式 :prefork worker
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache 两种工作模式 :prefork worker相关的知识,希望对你有一定的参考价值。
前言
1·最近这几篇文章都在讲Apache的一些安全与优化,这些针对服务器都是很重要的,掌握这些不仅提升了服务器的安全,还让服务器的性能大大的提高。这样就可以让客户有很好的体验感。
2·今天这篇文章依旧是讲Apache。但是,是讲Apache的优化深入。Apache 的默认配置保证基本运行服务,但是在实际生产环境中,有时候需要把服务器性能发挥到最大化。
Apache的两种工作模式:(prefork、worker)
很多朋友都知道Apache是当下Web服务器用得最广泛也是最稳定的开源软件之一,其中工作模式有很多种,最主要使用的两种工作模式是:prefork模式、worker模式。下面会分别介绍这两种模式。
Prefork 工作模式:
1·首先我们需要知道什么是prefork 工作模式,其次需要知道这种工作模式的优点、缺点,最后我们需要会配置prefork 工作模式。这样在生产环境种才会有利于我们灵活的根据自身需求的应用!
2·prefork 工作模式实现了一个非线程型的、预派发的Web服务器,它是要求将每个请求互相独立的情况下最好的MPM(多路处理模块)。每个进程在某个确定的时间只单独处理一个请求。
3·prefork 模式由一个单独的控制进程(父进程) 负责产生子进程,子进程用于监听请求并作出应答,所以会一直存在空闲的子进程用于响应新的请求,这样可加快响应速度。
prefork 的优点、缺点:
优点:
1·具有很强的自我调节能力,工作效率高,只需要很少的配置指令调整;
2·最重要的是MaxClients 的值可以是一个足够大的数值以便处理潜在的请求高峰;
3·适合于没有线程安全库,需要避免线程兼容性问题的系统;
4·对线程调试困难的平台更容易调试一些。
缺点:
1·MaxClients 的值不能太大,以免需要使用的内存超出物理内存的大小;
2·因为它会常备用空闲的子进程用于响应新的请求,所以会占用更多的内存;
prefork 配置方式:
1· 首先需要知道你Apache是否指定了工作模式
cd /usr/local/httpd/bin
./httpd -l (在bin目录下执行此命令可以查看当前的工作模式)
2·如果没有指定工作模式就需要在apache配置时加入参数
./configure --with-mpm=prefork
3·在主配置文件中打开MPM(多路处理模块)路径:
vim /etc/httpd.conf
Include conf/extra/httpd-mpm.conf (去掉注释即可)
4·修改prefork工作模块参数
vim /usr/local/httpd/conf/extra/httpd-mpm.conf
修改的值稍微调整,实际情况需要根据自身需求,内容如下:
<IfModule mpm_prefork_module> (prefork 模块)
StartServers 10
MinSpareServers 10
MaxSpareServers 30
MaxRequestWorkers 1000
MaxConnectionsPerChild 5000
</IfModule>
prefork 配置参数表:
参数 | 说明 |
---|---|
StartServers | 启动时创建的进程数量 |
MinSpareServers | 最少空闲进程 |
MaxSpareServers | 最多空闲进程 |
MaxRequestWorkers | 最多创建多少个子进程来处理请求 |
MaxConnectionsPerChild | 每个进程处理的最大请求数,如果达到请求数,进程即被销毁,如果设置0,子进程永远不会结束 |
Worker 工作模式:
1·Worker 模式使 Web 服务器支持混合的多线程多进程。
2·Worker 模块每个进程能够拥有的线程数量使固定的,服务器会根据负载情况增加或减少进程数量
3·一个单独的控制进程(父进程)负载子进程的建立,而每个子进程能够建立一定数量的服务现场和一个监听线程,监听接入请求并将其传递给服务线程处理和应答
Worker 的优点、缺点:
优点:
1·由于使用线程来处理请求,所以可以处理很多请求;
2·系统资源的开销小于基于进程的MPM;
3·它使用了多进程,每个进程有多个线程,以获得基于进程的 MPM 的稳定;
4·线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些
缺点:
1·如果一个线程出现了问题也会导致同一进程下的线程出现问题;
2·由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)。
Worker 的配置方式:
1· 首先需要知道你Apache是否指定了工作模式
cd /usr/local/httpd/bin
./httpd -l (在bin目录下执行此命令可以查看当前的工作模式)
2·如果没有指定工作模式就需要在apache配置时加入参数
./configure --with-mpm=worker
3·在主配置文件中打开MPM(多路处理模块)路径:
vim /etc/httpd.conf
Include conf/extra/httpd-mpm.conf (去掉注释即可)
4·修改worker工作模块参数
vim /usr/local/httpd/conf/extra/httpd-mpm.conf
修改的值稍微调整,实际情况需要根据自身需求,内容如下:
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
worker 配置参数表:
参数 | 说明 |
---|---|
StartServers | 服务器启动时建立的子进程数 |
MinSpareThreads | 最少空闲进程 |
MaxSpareThreads | 最多空闲进程 |
ThreadsPerChild | 每个子进程常驻执行线程数 |
MaxConnectionsPerChild | 每个进程处理的最大请求数,如果达到请求数,进程即被销毁,如果设置0,子进程永远不会结束 |
MaxRequestWorkers | 限定服务器同一时间内客户端最大接入的请求数量 |
总结:
1· prefork 模式使用多个子进程,每个子进程只有一个线程。每个进程在一个确定的时间只能维持一个链接。但是它的内存占用比较多,可是也更容易调试!
2· worker 模式使用多个子进程,每个子进程有多个线程。每个线程在一个确定的时间只能维持一个链接。它的内存使用比prefork要低得多。
归纳:
总的来说,prefork 方式速度稍高于 worker ,然而它需要得 CPU 和内存资源也比 worker 多!实际应用中更推荐 prefork 得方式。
以上是关于Apache 两种工作模式 :prefork worker的主要内容,如果未能解决你的问题,请参考以下文章