apache-httpd的三种模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了apache-httpd的三种模式相关的知识,希望对你有一定的参考价值。

参考技术A apache httpd-2.4

新增模块;

mod_proxy_fcgi(可提供 fcgi 代理)

mod_ratelimit(限制用户带宽)

mod_request(请求模块,对请求做过滤)

mod_remoteip(匹配客户端的 IP 地址)

对于基于 IP 的访问控制做了修改,不再支持 allow,deny,order 机制,而是统一使用 require进行

还新增以下几条新特性;

1、MPM 支持在运行时装载;不过要开启这种特性,在编译安装要启用这三种功能;

--enable-mpms-shared=all --with-mpm=event

2、支持 event

3、支持异步读写

4、在每个模块及每个目录上指定日志级别

5、增强版的表达式分析器

6、每请求配置:<If>, <Elseif>

7、毫秒级别的 keepalive timeout

8、基于 FQDN 的虚拟主机不再需要 NameVirtualHost 指令

9、支持使用自定义变量

安装时HTTPd 可以添加许多模块

相关模块解析:

--enable-so:支持动态共享模块(即打开 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 二进制文件的模块,<MODULE-LIST>为

空格分隔的模块名列表、all 或者 most,all 表示包含所有模块,most 表示包含大部分常用模



--enable-mpms-shared=all:启用 MPM 所有支持的模式,这样 event、worker、prefork 就会以

模块化的方式安装,要用哪个就在 httpd.conf 里配置就好了。

--with-mpm=event:指定启用的 mpm 模式,默认使用 enevt 模式,在 apache 的早期版本 2.0

默认 prefork,2.2 版本是 worker,2.4 版本是 event.

--with-pcre=/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:激活彧通过配置文件控制 HTTP 的“Expires:”和“Cache-Control:”头内容,即

对网站图片、js、css 等内容,提供客户端浏览器缓存的设置。这个是 apache 调优的一个重

要选项之一。

--enable-deflate:提供对内容的压缩传输编码支持,一般是 html、js、css 等内容的站点。使

用此参数会打打提高传输速度,提升访问者访问的体验。在生产环境中,这是 apache 调优

的一个重要选项之一。

Apache 的优化配置:

apache 所运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好

给 apache 一个单独的主机以免受到其他应用的干扰。各个硬件指标中,对性能影响最大的

是内存,对于静态内容(图片、javascript 文件、css 文件等),它决定了 apache 可以缓存多

少内容,它缓存的内容越多,在硬盘上读取内容的机会就越少,大内存可以极大提高静态站

点的速度;对动态高负载站点来说,每个请求保存的时间更多一些,apache 的 mpm 模块会

为每个请求派生出相应的进程或线程分别处理,而进程或线程的数量与内存的消耗近似成正

比,因此增大内存对提高动态站点的负载和运行速度也极为有利

其次是硬盘的速度,静态站点尤为突出,apache 不断的在读取文件并发送给相应的请求,

硬盘的读写是极其频繁的;动态站点也要不断的加载 web 程序(php 等),一个请求甚至要读

取十几个文件才能处理完成,因此尽可能的提高硬盘速度和质量对提高 apache 的性能是有

积极意义的。

最后是 cpu 和网络,cpu 影响的是 web 程序执行速度,网络影响流量大小。

apache  的工作模式:

Apache HTTP 服务器被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的服

务器。这种模块化的设计就叫做“多进程处理模块”(Multi-Processing Module,MPM),也叫

做工作模式。

Prefork 模式(一个非线程型的):

其主要工作方式是:当 Apache 服务器启动后,mpm_prefork 模块会预先创建多个子进程(默

认为 5 个),每个子进程只有一个线程,当接收到客户端的请求后,mpm_prefork 模块再将

请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。如果当前的请求数将

超过预先创建的子进程数时,mpm_prefork 模块就会创建新的子进程来处理额外的请求。

Apache 总是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求。这样客户

端的请求就不需要在接收后等候子进程的产生。

由于在 mpm_prefork 模块中,每个请求对应一个子进程,因此其占用的系统资源相对其他

两种模块而言较多。不过 mpm_prefork 模块的优点在于它的每个子进程都会独立处理对应

的单个请求,这样,如果其中一个请求出现问题就不会影响到其他请求。Prefork 在效率上

要比 Worker 要高,但是内存使用大得多不擅长处理高并发的场景。

Apache 在 prefork 工作模式下影响性能的重要参数说明

# prefork MPM

<IfModule mpm_prefork_module>

StartServers 5

#apache 启动时候默认开始的子进程数

MinSpareServers 5

#最小的闲置子进程数

MaxSpareServers 10

#最大的闲置子进程数

MaxRequestWorkers 250

#MaxRequestWorkers 设 置 了 允 许 同 时 的 最 大 接 入 请 求 数 量 。 任 何 超 过MaxRequestWorkers 限制的请求将进入等候队列,在 apache2.3.1 以前的版本

MaxRequestWorkers 被称为 MaxClients,旧的名字仍旧被支持。

MaxConnectionsPerChild 500

#设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxConnectionsPerChild”

个请求后将自动销毁。0 意味着无限,即子进程永不销毁。虽然缺省设为 0 可以使每个

子进程处理更多的请求,但如果设成非零值也有两点重要的好处:1、可防止意外的内

存泄漏。2、在服务器负载下降的时侯会自动减少子进程数。因此,可根据服务器的负

载来调整这个值。在 Apache2.3.9 之前称之为 MaxRequestsPerChild。

</IfModule>

注 1:MaxRequestWorkers 是这些指令中最为重要的一个,设定的是 Apache 可以同时处理

的请求,是对 Apache 性能影响最大的参数。如果请求总数已达到这个值(可通过 ps -ef|grep

http|wc -l 来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源

还剩下很多而 HTTP 访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越

多,建议将初始值设为(以 Mb 为单位的最大物理内存/2),然后根据负载情况进行动态调整。

比如一台 4G 内存的机器,那么初始值就是 4000/2=2000。

注 2:prefork 控制进程在最初建立“StartServers”个子进程后,为了满足 MinSpareServers 设

置的需要创建一个进程,等待一秒钟,继续创建两 个,再等待一秒钟,继续创建四个……如

此按指数级增加创建的进程数,最多达到每秒 32 个,直到满足 MinSpareServers 设置的值为

止。这种模式 可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。

MaxSpareServers 设置了最大的空闲进程数,如果空闲进程数大于这个 值,Apache 会自动 kill

掉一些多余进程。这个值不要设得过大,但如果设的值比 MinSpareServers 小,Apache 会自

动把其调整为 MinSpareServers+1。如果站点负载较大,可考虑同时加大 MinSpareServers 和

MaxSpareServers。

注 3:ServerLimit 和 MaxClients(MaxRequestWorkers)有什么区别呢?

是因为在 apache1 时代,控制最大进程数只有 MaxClients 这个参数,并且这个参数最大值为

256,并且是写死了的,试图设置为超过 256 是无效的,这是由于 apache1 时代的服务器硬

件限制的。但是 apache2 时代由于服务器硬件的升级,硬件已经不再是限制,所以使用

ServerLimit 这个参数来控制最大进程数,ServerLimit 值>=MaxClient 值才有效。ServerLimit

要放在 MaxClients 之前,值要不小于 MaxClients。

注 4:查看 Apache 加载的模块

[root@www ~]#apachectl -t -D DUMP_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.conf

2.[root@www ~]# vi /usr/local/http-2.4.23/conf/httpd.conf

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

Include conf/extra/httpd-mpm.conf

3 重启httpd

Worker 模式(多线程多进程):

和 prefork 模式相比,worker 使用了多进程和多线程的混合模式,worker 模式也同样会先预

派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会

被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,

因此,内存的占用会减少一些,在高并发的场景下会比 prefork 有更多可用的线程,表现会

更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是

多个线程出现问题,也只是影响 Apache 的一部分,而不是全部。由于用到多进程多线程,

需要考虑到线程的安全了,在使用 keep-alive 长连接的时候,某个线程会一直被占用,即使

中间没有请求,需要等待到超时才会被释放(该问题在 prefork 模式下也存在)

总的来说,prefork 方式速度要稍高于 worker,然而它需要的 cpu 和 memory 资源也稍多于

woker。

Apache 在 worker 工作模式下影响性能的重要参数说明

# worker MPM

<IfModule mpm_worker_module>

StartServers 3

#apache 启动时候默认开始的子进程数

MinSpareThreads 75

#最小空闲数量的工作线程

MaxSpareThreads 250

#最大空闲数量的工作线程

ThreadsPerChild 25

#每个子进程产生的线程数量

MaxRequestWorkers 400

#与 prefork 模式相同

MaxConnectionsPerChild 0

#与 prefork 模式相同

</IfModule>

注 1:Worker 由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的

ThreadsPerChild 线程数,各个线程独立地处理请求。同样, 为了不在请求到来时再生成线

程,MinSpareThreads 和 MaxSpareThreads 设置了最少和最多的空闲线程数;

而 MaxRequestWorkers 设置了同时连入的 clients 最大总数。如果现有子进程中的线程总数不

能满足负载,控制进程将派生新的子进程

MinSpareThreads 和 MaxSpareThreads 的最大缺省值分别是 75 和 250。这两个参数对 Apache

的性能影响并不大,可以按照实际情况相应调节 。

注 2:ThreadsPerChild 是 worker MPM 中与性能相关最密切的指令。ThreadsPerChild 的最大

缺省值是 64,如果负载较大,64 也是不够的。这时要显式使用 ThreadLimit 指令,它的最大

缺省值是 20000。

注 3:Worker 模式下所能同时处理的请求总数是由子进程总数乘以 ThreadsPerChild 值决定

的,应该大于等于 MaxRequestWorkers。如果负载很大,现有的子进程数不能满足时,控制

进程会派生新的子进程。默认最大的子进程总数是 16,加大时 也需要显式声明 ServerLimit

(系统配置的最大进程数量,最大值是20000)。需要注意的是,如果显式声明了 ServerLimit,

那么它乘以 ThreadsPerChild的值必须大于等于MaxRequestWorkers,而且MaxRequestWorkers

必须是 ThreadsPerChild 的整数倍,否则 Apache 将会自动调节到一个相应值。

注 4:进程与线程的区别

线程是指进程内的一个执行单元,也是进程内的可调度实体.

与进程的区别:

(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程

有自己独立的地址空间;

(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

(3)线程是处理器调度的基本单位,但进程不是.

(4)二者均可并发执行.

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对

应用的并发性。

进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

线程的划分尺度小于进程,使得多线程程序的并发性高。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程

序的运行效率。

Event 模式:

这是 Apache 最新的工作模式,是 worker 模式的变种,它把服务进程从连接中分离出来,一

worker 模式不同的是在于它解决了 keep-alive 长连接的时候占用线程资源被浪费的问题,在

event 工作模式中,会有一些专门的线程用来管理这些 keep-alive 类型的线程,当有真实请

求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并

发场景下的请求处理。event 模式不能很好的支持 https 的访问(HTTP 认证相关的问题)。

以上是关于apache-httpd的三种模式的主要内容,如果未能解决你的问题,请参考以下文章

Apache的三种工作模式

Apache的三种工作模式

apache的三种工作模式

Centos7之Apache的三种工作模式

Apache的三种工作模式

解析 Apache 的三种 MPM 工作模式