httpd的运行模式prefork、worker、event

httpd的运行模式prefork、worker、event,第1张

httpd-2.x版本引入了插入式的并行处理模式,多路处理模块(MPM),其有三种运行模式,分别是prefork、worker和event,对于event模式在httpd-2.2来说还在于测试阶段,通常来说不会在生成环境上面运行,而在httpd-2.4上event模式已经完成测试,可以在生产环境上运行了。

prefork是一个两级进程模型,非线程的模式,其实通过由父进程管理创建子进程,子进程相应的相应的请求的方式来运行的。以prefork模式运行的httpd,在启动之际就预派生fork了一些子进程,然后等待请求。每个子进程只有一个线程,在一个时间点内只能处理一个请求。

优点 :成熟、稳定、兼容所有新老模块。进程之间完全独立,无须担心线程安全的问题。

缺点 :一个进程相对会占用更多的系统资源,消耗更多的内存。不适合处理高并发请求,因其会把请求放进队列中,一直等到有可用进程才会处理相应的请求。

在httpd-2.2中的配置:

worker是一个三级结构、多进程多线程的模式,其在启动时也预先fork了几个子进程,每个子进程能够生产若干个服务线程和若干个监听线程,每个服务线程处理一个请求,监听线程负责接入请求并将其传递给服务线程处理和应答。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此内存的占用会减少些,在高并发的场景下表现比prefork模式好。

优点 :占用内存少,高并发性能更优秀。

缺点 :当一个线程出现问题的时候会导致同一进程下的线程也会出现问题。在keep-alive长连接的方式下,某个线程会被一直占用,即使中间没有请求,也需要等待到超时才会被释放。

在httpd-2.2中的配置:

event模式是最新的运行模式,在httpd-2.4中已经是稳定可用的模式。其运行原理与worker类似,区别在于,event模式解决了在keep-alive模式下,线程被长期占用直到超时,从而导致资源浪费的问题。

在event模块中,有一个专门的线程来管理这些keep-alive类型的线程,当接收到真实的请求时,会将请求传递给服务线程,执行完毕后,会将对应的服务线程释放,这样就能实现线程的异步非阻塞。

在httpd-2.2中的配置:

在Centos 6.9上安装httpd 2.2:

安装完成后,httpd的默认运行模式为prefork,查看其运行模式为:

在/etc/httpd.conf中查看其对应prefork配置:

启动httpd服务并查看相关的进程状态:

修改 /etc/httpd/conf/httpd.conf中的prefork配置:

重启httpd服务并查看相应的进程:

使用ab工具对相应的URL进行压力测试并观察进程的状况:

对于httpd-2.2版本来说,要更改运行模式为worker模式,需先修改配置文件/etc/sysconfig/httpd:

重启httpd服务后,查看进程状态:

修改 /etc/httpd/conf/httpd.conf文件中的worker的配置:

重启httpd服务后,使用ab工具进行压力测试:

压测命令: ab -n 200000 -c 300 http://188.88.88.171/index.html

http-2.2的event模式还处于测试阶段,因此不建议在生产环境上运行,httpd-2.4的event模式为正式版可在生产环境上部署。

修改配置文件/etc/sysconfig/httpd:

重启httpd服务,并查看httpd服务:

修改/etc/httpd/conf/httpd.conf,添加event配置:

压测命令: ab -n 200000 -c 300 http://188.88.88.171/index.html

在测试启动httpd 的各种模式的过程中,我曾尝试编译安装后启动worker模式,但是发现其worker进程状态跟配置文件里头的worker设置并不一致,最初以为是配置错误,但是后来经测试验证发现,通过yum安装后配置同样的设置,得出的结果是正确的,所以初步判断为编译安装的问题,相比yum安装,我做的编译安装缺少了挺多文件的,但是因为水平有限,无法完整编译出正确的安装。因此在此记录下相关的问题和现象,以便后续学习研究透了后进行回顾。

编译安装httpd-2.2的命令:

在Redhat Linux的主要版本as4上,apache版本为httpd-2.0.5x,

默认为prefork模式,主要是考虑到稳定性的原因。

要切换到worker模式,则需要登录到linux上,进行如下 *** 作:

进入/usr/sbin目录

cd /usr/sbin

将当前的prefork模式启动文件改名

mv httpd httpd.prefork

将worker模式的启动文件改名

mv httpd.worker httpd

修改配置文件vi /etc/httpd/conf/httpd.conf

找到里边的如下一段,可适当修改负载等参数:

<IfModule worker.c>

StartServers 2

MaxClients 150

MinSpareThreads 25

MaxSpareThreads 75

ThreadsPerChild 25

MaxRequestsPerChild 0

</IfModule>

重新启动服务

/etc/init.d/httpd restart

即可换成worker方式启动apache2

注意这里可能会遇到错误:

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP. Pre-configuration failed!

解决方法是将/etc/httpd/conf.d/php.conf文件中的LoadModule开头的那行代码注释掉。

--------------------------

注意:处于稳定性和安全性考虑,不建议更换apache2的运行方式,使用系统默认prefork即可

另外很多php模块不能工作在worker模式下,例如redhat linux自带的php也不能支持线程安全

所以最好不要切换工作模式。

=========================================

# /etc/init.d/httpd stop

[root@web ~]# which apachectl

/usr/sbin/apachectl

[root@web ~]# which httpd

/usr/sbin/httpd

[root@web ~]# cd /usr/sbin/

[root@web ~]# mv httpd httpd.prefork

# mv httpd.worker httpd

# httpd -k start


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11762208.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存