Apache端口-进程-模块化-DSO和MPM

2016-02-15 16:45:37 4773

【apche的端口和进程】

Apache默认安装完之后监听的是TCP协议的80端口,如果是加密的https协议的话就是443端口。

我们可以通过命令  netstat tupln | grep 80 来查看。

Apache默认会启动一个主进程(也叫控制进程)也多个子进程

我们可以通过命令 ps aux | grep httpd 来查看,默认会启用多个子进程,

这些进程里面有一个主进程,怎么区分呢?

首先,主进程由root运行,其它进程是由apache用户来运行

其次,因为主进程是第一个启动,子进程都是由主进程来运行的,所以我们可以通过

          进程的id来判断,主进程的id是最小的

最后我们也可以通过查看 /etc/httpd/run/httpd.pid 文件来查看主进程的id

真正处理请求的是子进程。



【DSO动态加载】

apache本身是一个模块设计的服务,各个的功能,特性是独立分开的,

这样设计的好处在于可扩展很强,各个模块相互依耐性较低,有利于后期的升级或者添加新功能比较方便

核心只包含主要功能,扩展功能通过模块实现。不同模块可以被静态的编译进程序,也可以动态加载

DSO  动态共享对象,模块的动态加载就是通过DSO来实现的,动态加载指的是当我们需要新的功能的时候,

我们把需要的功能编译出来,通过配置文件加载进apche的服务当中。不需要重新编译apahce。

通过apache的apxs就可以独立的去编译的动态模块,这个工具是属于httpd-devel开发相关的软件包中的。

可以通过http -M(httpd -l 查看静态模块) 查看当前都编译了哪些模块,其中static为静态编译进apache的,shared为动态编译进入的。

DSO的实现是通过so_module静态模块实现的。 mod_so.c是DSO本身的模块



【MPM 多进程模块】

MPM(Multi Process Modules)

因为apache本身是一个跨平台的,但是不同操作系统,对底层网络请求的处理,操作系统为我们提供的接口都不同。

如果强行使用一种统一的方式去实现就没有最大化的利用操作系统的最大优势,所以在不同平台下使用不同的MPM

其中Linux下有  prefork 和worker     Windows下有 mpm_winnt

Linux下默认的是使用prefork,我们来分析一些prefork与worker的区别

Prefork (预先生成) 是非线程,预生成进程型MPM,prefork会预先启动一些子进程,每个子进程一个时间点只能处理一个请求,并且会根据并发请求数量动态生成更多子进程。优势是线程安全的

Worker worker是线程化,多进程的MPM,每个进程可以生成多个线程,每个线程处理一个请求。优势是不需要启用多个子进程,这样可以节约内存,缺点是效率没有prefork高。

如果要使用其他的MPM需要重新编译Apache。





提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: