Apache 工作模式简介
Apache 2.X 支持插入式并行处理模块, 称为多进程处理模块(MPM). 在编译 apache 时必须选择也只能选择一个 MPM, 对类 UNIX 系统, 有几个不同的 MPM 可供选择, 它们会影响到 apache 的速度和可伸缩性.
Apache 的三种工作模式
1,prefork 模式
prefork 是一个非线程型的, 预派生的 MPM, 使用多个进程, 每个进程在某个确定的时间只单独处理一个连接, 效率高, 但内存使用比较大.
优点:
适合于没有线程安全库, 需要避免线程兼容性问题的系统. 它是要求将每个请求相互独立的情况下最好的 MPM, 这样若一个请求出现问题就不会影响到其他请求.
缺点:
一个进程相对占用更多的系统资源, 消耗更多的内存. 而且, 它并不擅长处理高并发请求, 在这种场景下, 它会将请求放进队列中, 一直等到有可用进程, 请求才会被处理.
2,worker 模式
worker 使用了多进程和多线程的混合模式, worker 模式也同样会先预派生一些子进程, 然后每个子进程创建一些线程, 同时包括一个监听线程, 每个请求过来会被分配到一个线程来服务.
优点:
线程比起进程会更轻量, 因为线程是通过共享父进程的内存空间, 因此, 内存的占用会减少一些, 在高并发, 高流量的场景下会比 prefork 有更多可用的线程, 表现会更优秀一些.
缺点:
如果一个线程出现了问题也会导致同一进程下的线程出现问题, 如果是多个线程出现问题, 也只是影响 Apache 的一部分, 而不是全部. 由于用到多进程多线程, 需要考虑到线程的安全了, 在使用 keep-alive 长连接的时候, 某个线程会一直被占用, 即使中间没有请求, 需要等待到超时才会被释放(prefork 模式也有这个问题).
注: Worker 模式下所能同时处理的请求总数是由子进程总数乘以 ThreadsPerChild 值决定的, 应该大于等于 MaxRequestWorkers. 如果负载很大, 现有的子进程数不能满足时, 控制进程会派生新的子进程. 默认最大的子进程总数是 16, 加大时 也需要显式声明 ServerLimit(最大值是 20000). 需要注意的是, 如果显式声明了 ServerLimit, 那么它乘以 ThreadsPerChild 的值必须大于等于 MaxRequestWorkers, 而且 MaxRequestWorkers 必须是 ThreadsPerChild 的整数倍, 否则 Apache 将会自动调节到一个相应值.
3,Event 模式
Apache 最新的工作模式, 它和 worker 模式很像.
优点:
不同的是在于它解决了 keep-alive 长连接的时候占用线程资源被浪费的问题(HTTP 的 Keepalive 方式能减少 TCP 连接数量和网络负载), 在 event 工作模式中, 会有一些专门的线程用来管理这些 keep-alive 类型的线程, 当有真实请求过来的时候, 将请求传递给服务器的线程, 执行完毕后, 又允许它释放. 这增强了在高并发场景下的请求处理
缺点:
event MPM 在遇到某些不兼容的模块时, 会失效, 将会回退到 worker 模式, 一个工作线程处理一个请求. 官方自带的模块, 全部是支持 event MPM 的. 注意一点, event MPM 需要 Linux 系统 (Linux 2.6+) 对 EPoll 的支持, 才能启用.
注: HTTPS 的连接(SSL), 它的运行模式仍然是类似 worker 的方式, 线程会被一直占用, 知道连接关闭. 部分比较老的资料里, 说 event MPM 不支持 SSL, 那个说法是几年前的说法, 现在已经支持了.
Apache 三种工作模式的使用
1, 使用 yum 或者 rpm 安装 httpd
注: 默认使用的是 prefork 工作模式.
vi /etc/httpd/conf.modules.d/00-mpm.conf
注: Centos7 修改 apache 工作模式, 直接将前边注释去掉即可, 切记将不用的也要注释掉!
2, 源码安装 httpd
两种编译方式指定参数
方式一:
指定具体工作模式 --with-mpm=prefork/worker/event
注: 真实环境指定后边其中一种即可!
方式二:
指定同时支持三种工作模式 --enable-mpms-shared=all
注: 建议使用这种, 防止后期根据业务优化网站减少麻烦!
来源: http://www.bubuko.com/infodetail-2921148.html