1. Apache DSO
1.1 Apache DSO是什么
DSO (Dynamic Shared Object) 动态共享目录的缩写, 是类Unix 操作系统中存在的一种动态连接机制, 在程序运行是将需要的部分从外部调入内存执行的方法.
apache 1.3 版本开始支持这种方法, 应为早期 apache 一直使用一个模块来扩展功能, 并在内部使用一个调度机制 来链接扩展模块 到核心模块.
1.2 Apache DSO 实现
每个单个模块的动态加载, 都是基于 mod_so 的模块来实现的, 该mod_so 必须被静态的编译 http 服务器内核中, 除了 core 以外的唯一不可以动态方式编译的模块, 实际操作中, apache 模块在编译服务器程序时通过单独制定其来编译为DSO 文件, 应当在编译时制定
--enable-xxx=shared
(xxx为模块名, 如 rewrite), 动态编译的模块可以在配置文件中使用LoadModule
动态加载Apache 模块(尤其是第三方模块)的DSO 文件过程, apache 提供了工具 apxs (Apache eXtenSion) 动态将模块编译成 DSO 文件, 对具体平台编译器设置一些标志, 便于创建DSO 文件.
1.3 DSO 优势和劣势
-
DSO 优势
- 服务器运行时更加灵活实际服务器进程可以通过配置文件动态加载组件, 不需要在编译时通过配合参数指定,
- 服务器可以方便扩展第三方模块.
-
DSO 劣势
- DSO 不是任何平台都可以使用, 一些平台不支持动态将代码加载到另一个程序地址空间中.
- 服务器启动时会更慢一点.
1.4 查看模块
-
查看安装了的模块: (包含动态加载的)
- httpd -M
-
查看静态安装的模块:
- httpd -l
2. Apache MPM
2.1 MPM 介绍
- Apache 2.x开始迟滞并行处理模块, 称为多路处理模块(MPM), 在编译apache 时 必须选择且只能选择一种MPM, 对于类似Unix系统, 有多个不用的 MPM 可以选择, 会影响到apache 速度和可升缩性.
2.2 Apache2.4 支持的MPM
- apache2.4 支持多种模块
2.2.1 Prefork MPM:
这个多路处理模块(MPM) 实现了一些非线程, 预派生的 web 服务器, 工作方式类似于 Apache1.3, 适合没有现成安全库, 需要避免线程兼容性问题影响系统. 要求将每个请求相互独立的情况最好的 MPM, 请求出现问题就不会影响其他请求.
MPM 具有很强自我调节能力, 需要很少的配置指令调整,
设置:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule mpm_prefork_module>
-------------
StartServers
服务启动时, 启动的进程
MinSpareServers
服务闲置时, 保留的最小进程数
MaxSpareServers
服务闲置时, 保留的最大进程数
MaxRequestWorkers
工作时会启动的 最多的进程数
MaxConnectionPerChild
服务器杀死就进程和重启的频率, 0表示永不杀死, 设置100 表示进程服务100次后, 就会被杀死
2.2.2 Worker MPM
该多路处理模块(MPM) 使用网络服务器 支持混合的多线程多进程, 由于使用线程来处请求, 所以可以处理海量请求, 系统资源开销小于 基于进程的MPM, 但是也是用了很多进程, 每个进程有多个线程, 以获得基于进程的 MPM 稳定性.
每个进程可拥有的线程数量是固定的, 服务器会根据负载情况增 加或减少进程数量, 一个单独的控制进程(父进程)负责子进程的建立. 每个子进程可以建立 ThreadPerChild 数量的服务线程 和一个监听线程, 该监听线程 监听接入请求并将其传入传递服务线程处理和应答.
不论Worker 模式或者 Prefork 模式, Apache 总是试图保持一些备用(spare) 或者空闲子进程(空闲的服务线程池) 用于迎接即将到来的请求, 客户端不需要得到自己成产生,
设置:
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule mpm_worker_module>
----------------
StartServers
启动时启动的进程数
MinSpareThreads
保留的最小线程数
MaxSpareThreads
保留的最大 线程数,
ThreadsPerChild
每个子进程创建的线程数,
MaxRequestWorkers
可以启动工作 的最大进程数量
MaxConnectionsPerChild
工作的继承在处理指定次连接后 会被杀死, 0 表示永不杀死
2.2.2 Event MPM
Event 处理模块(MPM), 在以上两种MPM 非常繁忙的服务器应用下都是有些不足的, HTTP 的 Keepalive 方式能减少TCP 连接数量和网络负载, 但是 Keepalive 需要和服务 进程/线程 绑定, 就会导致繁忙的服务器会耗光 进程/线程.
Event MPM 可以解决上面的问题, 它把服务进程从连接中分离出来, 在服务器处理速度很快, 具有很高的点击率, 可用的线程数量就是关键的资源限制, 此时 Event MPM 方式是最有效的, Worker MPM 方式工作的 繁忙的服务器可以承受 10k/s 访问.
使用
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule mpm_event_module>
------------------------
END