apache-httpd的三种模式

apachehttpd-2.4新模块mod_proxy_fcgi(可以提供fcgi代理)mod_ratelimit(限制用户带宽)mod_request(请求模块,过滤请求)mod_remoteip(匹配客户端IP地址)基于IP的访问控制已修改,不再允许支持,拒绝;,排序机制,但使用一致添加了以下新功能要启用该功能,必须在编译安装时启用这三个功能--enable-mpms-shared=all--with-mpm=event2,支持event3,支持异步读写4.在每个模块和每个目录中指定;日志级别5,表达式解析器的改进版本6.每个请求配置:7.毫秒级保留8.基于FQDN的虚拟主机不再需要NameVirtualHost指令9.支持使用自定义HTTPd可以添加的变量安装时模块较多相关模块分析:--enable-so:支持动态分配模块(即enable支持DSO)--enable-rewrite:支持url重写--enable-ssl:支持ssl--.with-ssl=/usr/local/openssl:指定ssl安装位置--enable-cgi:启用cgi--enable-cgid:MPM使用event或worker启用cgid--enable-modules=most:显式指定要静态编译到httpd二进制文件中的模块是一个以空格分隔的模块名称列表,全部或大多数,所有工具,包括所有模块,以及大多数工具,包括大多数。
常用模块--enable-mpms-shared=all:启用MPM支持的所有模式,因此event、workshop和prefork将模块化安装,只需在httpd.conf中配置要使用哪一个即可。
--with-mpm=event:指定早期Apache2.0默认启用mpm模式,2.2版本为worker,2.4版本为event=/usr/local/pcre:支持pcre--with-z=/usr/local/zlib:使用zlib压缩库--with-apr=/usr/local/apr:指定安装路径apr--with-apr-util=/usr/local/apr-util:指定apr-util的安装路径--enable-expires:通过配置文件Expires:"和"Cache-Control:"启用和控制HTTP,header内容,即提供网站图片、js、css等内容的客户端浏览器缓存设置。
这是apache调优的重要选项之一。
--enable-deflate:提供对内容的压缩和流式传输的支持,通常是带有html、js、css等内容的页面。
使用此参数将大大提高流式传输速度并改善访问者体验。
在生产环境中,这是Apache调优的重要选项之一。
优化的Apache配置:Apache运行的硬件环境是对性能影响最大的因素即使硬件无法升级,最好给Apache一个单独的主机,以避免其他应用程序的干扰。
在各种硬件指标中,内存对于静态内容(照片、javascript文件、css文件等)的性能影响最大,它决定了内存中可以存储的内容越多,读取硬盘上的内容就越困难磁盘,尽量少,大内存可以大大提高静态页面的速度,对于高负载的动态页面,每次request可以节省更多时间,并且Apache的mpm模块将生成相应的进程或线程。
单独对待,而进程或行进程的数量大致与内存消耗成正比,因此增加内存对于提高动态页面操作的负载和速度也极其有用。
二是磁盘速度,尤其是静态网站,Apache不断读取文件并发送给相应的请求,对硬盘的读写极其频繁,动态网站也需要不断加载web程序(php等),而且request可能需要读取十几个文件来处理;尽可能提高硬盘的速度和质量对于提高apache的性能至关重要。
最后是CPU和网络,CPU影响程序在互联网上运行的速度,而网络则影响流量。
阿帕奇运行模式:ApacheHTTPServer被设计为一个功能强大且灵活的服务器,可以在多个平台和不同环境中运行。
这种模块化设计称为“多处理模块”(MPM),也称为工作模式。
Prefork模式(非线程):其主要工作方法是:当Apache服务器启动时,mpm_prefork模块会预先创建多个子进程。
(默认为5个),每个子进程只有一个线程。
mpm_prefork模块收到客户端请求后,将请求转交给子进程。
进程进行处理,每个子进程只能用于处理单个请求。
同时。
如果当前请求数量超过了预先创建的子进程数量,mpm_prefork模块将创建新的子进程来处理额外的请求。
Apache总是尝试保留一些备用或空闲进程以供将来的请求使用。
这样,客户端请求收到后就不需要等待子进程生成。
由于每个请求对应mpm_prefork模块中的一个子进程,因此它比其他两个模块占用更多的系统资源。
不过,mpm_prefork模块的优点是它的每个子进程都会独立处理对应的单个请求,因此如果其中一个请求出现问题,不会影响其他请求。
Prefork比Worker效率高,但内存占用大很多,不擅长处理高并发场景。
prefork模式下影响Apache性能的重要参数说明#preforkMPMStartServers5#apache启动时默认启动的子进程数MinSpareServers5#最小不活动子进程数MaxSpareServers10#最大子进程数W0。
#MaxRequestWorkers设置允许并发访问请求的最大数量。
任何超过MaxRequestWorkers限制的请求都将进入等待队列。
MaxConnectionsPerChild500#设置每个子进程可以处理的请求数。
处理“MaxConnectionsPerChild”请求后,任何子进程都将被自动终止。
0表示无限,即子进程永远不会被销毁。
虽然默认设置0允许每个子进程处理更多请求,但将其设置为一个值并不能零还有两个重要的好处:1.可以防止意外的内存泄漏。
2、当服务器负载降低时,子进程数量会自动减少。
因此,可以根据服务器的负载来调整该值。
在Apache2.3.9之前,它被称为MaxRequestsPerChild。
注1:MaxRequestWorkers是这些指令中最重要的一个,它设置Apache一次可以处理的请求数,是对Apache性能影响最大的参数。
如果请求总数达到了这个值(可以通过ps-ef|grephttp|wc-l确认),那么后续的请求将会排队,直到一个处理的请求完成。
这就是系统资源剩余很多,但是HTTP访问却很慢的主要原因。
虽然理论上这个值越大,可以处理的请求就越多,但建议将初始值设置为(最大物理内存,单位为Mb/2),然后根据负载动态调整。
例如,对于4G内存的机器,初始值为4000/2=2000。
注2:prefork控制进程首先创建“StartServers”子进程后,为了满足MinSpareServers设置的需要,它创建一个进程,等待一秒,继续创建两个,再等待一秒,继续。
生成4...按指数方式增加生成的进程数,每秒最多32个,直到满足MinSpareServers设置的值。
这种方式消除了请求到达时创建新进程的需要,从而减少了系统开销并提高了性能。
MaxSpareServers设置最大空闲进程数,如果空闲进程数大于这个值,Apache会自动杀掉一些冗余进程。
不要将此值设置得太大,但如果该值小于MinSpareServers,Apache会自动将其调整为MinSpareServers+1。
如果站点负载较重,请考虑同时增加MinSpareServers和MaxSpareServers。
注3:ServerLimit和MaxClients(MaxRequestWorkers)有什么区别?这是因为在apache1时代,唯一控制最大进程数的参数是MaxClients,而这个参数的最大值是256,设置超过256是无效的,这是由于服务器时代的硬件限制阿帕奇1。
但由于apache2时代服务器硬件的改进,硬件不再是限制,因此使用ServerLimit参数来控制最大进程数ServerLimit值>=MaxClient值。
ServerLimit必须设置在MaxClients之前,且值不能小于MaxClients。
注4:如何查看Apache加载的模块[root@www~]#apachectl-t-DDUMP_MODULES或[root@www~]#apachectl-M或[root@www~]#apachectl–l(字母小写L,仅显示静态模块)如何检查Apache的工作方式?可以使用httpd-V命令查看,也可以使用httpd-l查看注5:如何修改prefork参数并启用prefork模式1.[root@www~]#vi/usr/local/http-2.4.23/conf/extra/httpd-mpm.conf2.[root@www~]#vi/usr/local/http-2.4.23/conf/httpd.confLoadModulempm_prefork_modulemodules/mod_mpm_prefork.soIncludeconf/extra/httpd-mpm.conf3重新启动httpdWorker模式(多线程进程):与模式相比prefork时,worker采用的是多进程和多线程混合的模式,worker模式也会派生出若干个子进程,然后每个子进程创建若干个线程,其中包括一个监听线程,每个请求都会被分配一个线程来服务。
线程比进程轻,因为线程共享父进程的内存空间,因此,在高并发场景下,线程数会比prefork多,性能会更好,如果一个线程出现问题,也会导致同一进程下的线程出现问题,如果多个线程出现问题,只会影响Apache的一部分,而不是全部。
由于使用多进程和多线程,使用长连接时必须考虑线程安全,给定的线程将永远处于繁忙状态,即使其间没有请求,也不会发生这种情况。
直到超时才释放(prefork模式也存在这个问题)一般来说,prefork模式比worker稍快,但也比worker需要稍多的CPU和内存资源。
Worker模式下影响Apache性能的重要参数说明#workerMPMStartServers3#apache启动时默认启动的子进程数MinSpareThreads75#最小空闲工作线程数MaxSpareThreadrethreadsumChild25#每个子进程创建的线程数MaxRequestWorkers400#Equalasprefork模式MaxConnectionsPerChild0#与prefork模式相同注1:Worker从主控进程生成子进程“StartServers”,每个固定子进程包含多个ThreadsPerChild线程,每个线程独立处理请求。
同样,为了在请求到达时不生成线程,MinSpareThreads和MaxSpareThreads设置工作线程的最小和最大数量,MaxRequestWorkers设置同时连接的最大客户端数量。
如果现有子进程中的线程总数无法满足负载,控制进程将创建一个新的子进程。
MinSpareThreads和MaxSpareThreads默认最大值分别为75和250,这两个参数对Apache性能影响不大,可以根据实际情况进行相应调整。
注2:ThreadsPerChild是workerMPM中与性能最相关的指令。
ThreadsPerChild的默认最大值是64。
如果负载很重,64就不够了。
这时,应该显式地使用ThreadLimit指令。
注3:Worker模式下可以同时处理的请求总数由子进程总数乘以ThreadsPerChild值确定,该值必须大于或等于MaxRequestWorkers。
如果负载过大,现有的子进程数量无法填满,控制进程就会创建新的子进程。
默认最大子进程总数为16,当它增加时,还必须显式声明ServerLimit(系统中配置的最大进程数,最大值为20000)。
需要注意的是,如果显式声明了ServerLimit,则乘以ThreadsPerChild的值必须大于等于MaxRequestWorkers,并且MaxRequestWorkers必须是ThreadsPerChild的整数倍,否则Apache会自动调整为相应的值。
注4:进程和线程的区别是指进程内的一个执行单元,也是进程内的一个调度实体一个进程至少有一个线程。
它们共享进程地址空间;它有自己独立的地址空间(2)资源所有权:进程是资源分配和所有权的单位,同一进程中的线程共享进程资源。
但进程则不然。
(4)进程和线程都是操作员控制的。
系统所经历的程序执行的基本单位系统就是利用这个基本单位来实现系统应用程序的并发性。
进程和线程的区别在于:简单来说,一个程序至少有一个进程,而一个进程至少有一个线程。
另外,进程在执行时拥有独立的内存单元,多个线程共享内存,从而大大提高了程序执行的效率。
事件模式:这是Apache最新的操作模式。
它将服务进程与连接分开,当维持长时间运行的连接时,问题在于,在事件模式运行时,会有几个特殊的线程,用于管理这些keep-alive线程执行完成后,将被允许腾出。
这改善了高并发场景下请求的处理。
事件模式不能很好地支持https登录(与HTTP认证相关的问题)。

IO模型及select,poll,epoll和kqueue的区别

(1)首先介绍几种常见的I/O模型及其区别,分别是:BlockingI/OnonblockingI/OI/OMultiplexing(selectandpoll)signaldrivenI/O(SIGIO)asynchronousI/O(thePOSIXaio_functions)————异步I/O模型最大的特点是完成后会发回通知。
是否阻塞取决于I/O交换是如何实现的。
异步锁定是基于选择的。
select函数本身的实现是阻塞的。
使用select函数的好处是可以同时监听多个文件句柄。
异步非阻塞会在完成后立即通知用户进程。
只需要启动I/O操作。
然后立即返回。
一旦I/O操作实际完成,应用程序将收到I/O操作已完成的通知。
此时用户进程只需要处理数据即可,没有必要。
执行实际的读写I/O操作,因为实际的读写I/O操作已经由内核完成。
1blockingI/O不言自明,阻塞套接字。
下图说明了调用的过程:重点对上图的解释,下面的例子进行讨论。
应用程序首先调用Recvfrom()函数将其传递给内核。
请注意,内核有两个进程:waitforddata和copydatafromkerneltouser。
在最终副本完成之前,Recvfrom()不会返回。
这个过程总是被阻塞的。
2nonblockingI/O:与BlockingI/O不同,非阻塞socket,调用流程图是这样的:可以看到,如果直接使用的话,是轮询的。

直到数据出现在内核缓冲区中。
3I/O复用(selectandpoll)最常见的I/O复用模型,select。
Select首先阻塞,仅当存在活动套接字时才返回结果。
与阻塞I/O相比,select将有两个系统调用,但select可以处理多个套接字。
4signaldrivenI/O(SIGIO)仅在UNIX系统上受支持。
如果您有兴趣,可以参考相关资料。
与I/O多路复用(selectandpoll)相比,它的优点是消除了选择阻塞和轮询。
正在由注册处理程序处理的活动套接字。
5*nix系统很少支持异步I/O(POSIXaio_functions)。
WindowsIOCP是该模型的完全异步I/O多路复用机制,因为如果您查看上面的其他四个模型,它们在使用kernelcopydatatoapplication时至少会阻塞。
该模型仅在复制完成时通知应用程序,因此可以看出它是纯异步的。
看起来这只是Windows的一个修改端口,这是一个模型,而且效率也很出色。
6下面是上述五种模型的比较。
可以看出,越往后,阻塞越少,理论上效率最优。
======分割线====================================五款车型对比比较清除。
剩下的就是将select、epoll、iocp和kqueue按数字排列就可以了。
select和iocp分别对应第三种和第五种模型,但是epoll和kqueue呢?其实它和select属于同一模型,但更高级。
可以看作具有第四种模型的一些特征,比如回调机制。
为什么epoll和kqueue比select更先进?答案是他们不做调查。
因为他们用回调替换了它。
想一想:当socket数量较多时,每个select()方法都必须通过FD_SETSIZE个socket来完成调度。
无论哪个套接字处于活动状态,都会被遍历一次。
这浪费了大量的CPU时间。
如果您可以为套接字注册回调函数并在活动时自动执行适当的操作,则可以避免轮询。
这就是epoll和kqueue的作用。
windowsor*nix(IOCPorkqueue/epoll)?确实Windows上的IOCP非常好,而且目前支持异步I/O的系统很少。
但由于系统本身的限制,大型服务器仍然运行UNIX。
正如所提到的上面,与IOCP相比,kqueue/epoll从内核复制数据到应用程序级别多了一层阻塞,因此不能认为它是异步I/O类。
然而,这一小层阻塞是微不足道的,kqueue和epoll已经在这方面做得很好了。
提供一致的IODesignPatterns接口。
事实上,无论模型类型如何,都可以对其进行抽象并提供一致的接口。
众所周知的有ACE、Libevent(基于reactor模式),它们都是跨平台的。
他们会自动这样做。
用户只需调用该接口即可选择最优的I/O复用机制。
说到这里,我们需要谈谈两种设计模式:Reactor和Proactor。
请参阅:Reactor模式-VS-Proactor模式。
Libevent是Reactor模型,ACE是Proac.tor模型。
本质上,它们是各种I/O复用机制的封装。
Javanio包是什么I/O机制?现在我们可以确定Java的当前实体是select()模型,可以通过检查/jre/bin/nio.dll找到它。
至于为什么Java服务器效率相当高。

我不知道,也许设计得更好。

-_-。
======分割线====================================总结一些关键点:仅限IOCP是异步I/O,其他机制或多或少都会阻塞。
select效率很低,因为每次都需要轮询。
但效率低下也是相对的。
根据情况,epoll、kqueue、select也可以通过良好的设计来改进,而IOCP就是Proactor模式。
javanio包是选择的模型。

(二)epoll和select的区别1、使用多处理或多线程,但这种方式会增加程序的复杂度,而且创建和维护进程和线程的成本也较高。
(Apache服务器使用subprocess方式,优点是隔离用户)(同步I/O阻塞)2.更好的方式是I/O复用(貌似也转换为复用)),首先创建相关句柄列表(epoll中的队列),然后调用该函数,在这些句柄之一准备好之前,它不会返回。
当它返回时,它会告诉进程哪些I/O已准备好。
select和epoll机制是多路径I/O机制的解决方案。
select是POSIX标准中的,epoll是Linux特有的。
主要有以下三个区别(epoll相对于select的优点):1.选择描述符的数量有限。
linux/posix_types.h头文件中有这样一句话:#define__FD_SETSIZE1024表示select最多可以跟踪1024个FD。
同时。
但epoll不这样做;它的限制是打开文件描述符的最大数量。
2、epoll最大的优点是不会随着FD数量的增加而降低效率。
Selec使用轮询处理。
数据结构类似于数组,epoll支持队列。
队列留空即可。
epoll只能在“活动”套接字上工作-这是因为在内核实现中,epoll是基于每个fd上的回调函数来实现的。
然后只有“活动”套接字会主动调用回调函数(将该句柄添加到队列中),但其他空闲状态句柄不会。
至此,epoll实现了一个“伪”AIO。
但如果大部分I/O都是“活跃的”,并且每个I/O端口的利用率都很高,那么epoll的效率不一定比select的效率高(队列可能很难维护)。
3、使用mmap来加速内核和用户空间之间的消息传递。
无论是select、poll还是epoll,内核都需要将FD消息通知给用户空间。
如何避免不必要的内存复制。
此时,epoll就是通过用户空间同一块内存的mmap来实现的。
核。
关于epollET工作模式,LTepoll有两种ET工作模式:EdgeTriggered、EdgeTriggered。
仅当状态改变时通知,epoll_wait才返回。
换句话说,一个事件仅报告一次。
并且它只支持非阻塞套接字。
LT:LevelTriggered,电平被触发(默认操作模式)。
与select/poll类似,只要有未处理的事件就会一直得到通知。
当调用epoll接口时LT模式,这相当于更快的轮询。
它支持阻塞和非阻塞套接字。
三种Linux并行网络编程模型。
1.Apache模型称为PPC(ProcessPerConnection):为每个连接分配一个进程。
主机为每个连接分配的时间和空间是昂贵的,并且随着连接数量的增加,在更多进程之间切换的开销也随之增加。
处理大量并发客户端连接是很困难的。
2TPC(ThreadPerConnection)模型:每个连接一个线程。
类似于库尔德工人党。
3选择型号:I/O复用技术。
.1每个连接都有一个描述。
选择模型受到值FD_SETSIZE的限制,这意味着Linux2.6.35中一个进程的最大打开句柄数是1024。
但是,每个Linux进程可以打开的句柄数仅受内存大小的限制。
,在设计select系统调用时,而是指的是FD_SETSIZE值。
可以通过重新编译内核来改变这个值,但是这个问题无法根治。
对于数百万用户的连接请求,即使增加相关进程的数量,仍然显得不够。
车薪。
.2select每次扫描一组文件描述符。
该集合的大小是作为第一个要选择的参数传递的值。
但是,随着每个进程可以打开的文件描述符的增加,扫描效率也会降低。
.3内核使用内存副本向用户空间传输文件描述中包含的信息。
Model4poll:I/O复用技术。
轮询模型不会受到FD_SETSIZE的限制,因为内核扫描的文件描述符集合的大小是用户指定的,这是第二个轮询参数。
但扫描效率和内存复印仍存在问题。
模型5pselect:I/O复用技术。
和选择一样。
模型6epoll:.1)文件描述符的大小没有限制,仅与内存大小2)当epoll返回结果时,哪个socket发生了,哪个事件发生了,就一目了然了,不需要比较。
例如,一一选择。
.3)用户空间的内核使用共享内存来传递消息。
四:常见问题1.单个epoll并不能解决所有问题,特别是如果每​​个操作都需要很长时间,因为epoll是顺序处理的。
所以还是需要创建线程池来获得更好的性能。
2.如果fd注册在两个epoll中,到时候两个epoll都会触发事件。
3、如果epoll中注册的FD被关闭,则会自动从epoll监听列表中移除。
4、如果多个事件同时触发epoll,多个事件会一起返回。
5.epoll_wait会一直监听epollhup事件,所以不需要添加到事件中。
6、为避免大量数据I/O,et模式下只处理一个fd,其他fd被耗尽。
Linux建议在fd关联的结构中添加一个就绪位,然后仅在epoll_wait触发事件后将其设置为就绪模式,然后轮询下面的Readyfd列表。

Apache服务器中prefork和worker工作模式的区别以及性能优化

每个prefork线程都是独立的,一开始就创建对应的进程,所以消耗CPU较多,而且Memworker子线程下有多个线程。
如果一个进程挂起并影响另一个进程并且使用较少的资源,这是不安全的。