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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)