前言


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·因为它会常备用空闲的子进程用于响应新的请求,所以会占用更多的内存;
Apache 两种工作模式 :prefork模式 、 worker模式_第1张图片


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
修改的值稍微调整,实际情况需要根据自身需求,内容如下:
(prefork 模块)
StartServers 10
MinSpareServers 10
MaxSpareServers 30
MaxRequestWorkers 1000
MaxConnectionsPerChild 5000


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模式下也存在)。


Apache 两种工作模式 :prefork模式 、 worker模式_第2张图片


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
修改的值稍微调整,实际情况需要根据自身需求,内容如下:

StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0


worker 配置参数表:

参数 说明
StartServers 服务器启动时建立的子进程数
MinSpareThreads 最少空闲进程
MaxSpareThreads 最多空闲进程
ThreadsPerChild 每个子进程常驻执行线程数
MaxConnectionsPerChild 每个进程处理的最大请求数,如果达到请求数,进程即被销毁,如果设置0,子进程永远不会结束
MaxRequestWorkers 限定服务器同一时间内客户端最大接入的请求数量

总结:

1· prefork 模式使用多个子进程,每个子进程只有一个线程。每个进程在一个确定的时间只能维持一个链接。但是它的内存占用比较多,可是也更容易调试!
2· worker 模式使用多个子进程,每个子进程有多个线程。每个线程在一个确定的时间只能维持一个链接。它的内存使用比prefork要低得多。


归纳:

总的来说,prefork 方式速度稍高于 worker ,然而它需要得 CPU 和内存资源也比 worker 多!实际应用中更推荐 prefork 的方式。