本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名原文链接~~~

Apache/httpd(1)之介绍

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:


httpd是什么?

httpd 又称 Apache,是一个超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。
Apache HTTP Server(简称 Apache)是 Apache 软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的 API 扩展,将 Perl/Python 等解释器编译到服务器中。
Apache HTTP 服务器是一个模块化的服务器,源于 NCSAhttpd 服务器,经过多次修改,成为世界使用排名第一的 Web 服务器软件。
它可以运行在几乎所有广泛使用的计算机平台上。
Apache 源于 NCSAhttpd 服务器,经过多次修改,成为世界上最流行的 Web 服务器软件之一。Apache 取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。

httpd的特性

  1. 支持最新的 HTTP/1.1 通信协议;
  2. 拥有简单而强有力的基于文件的配置过程;
  3. 支持通用网关接口;
  4. 支持基于 IP 和基于域名的虚拟主机;
  5. 支持多种方式的 HTTP 认证;
  6. 集成 Perl 处理模块;
  7. 集成代理服务器模块;
  8. 支持实时监视服务器状态和定制服务器日志;
  9. 支持服务器端包含指令(SSI);
  10. 支持安全 Socket 层(SSL);
  11. 提供用户会话过程的跟踪;
  12. 支持 FastCGI;
  13. 通过第三方模块可以支持 JavaServlets;
  14. 高度模块化;

多路处理模块MPM

众所周知,Apache 是一个跨平台的、采用模块化设计的服务器。为了应对不同的平台和不同的环境产生的各种不同的需求,也为了在具体的平台或环境下达到最佳的效果,Apache 在 web 服务器的基础功能方面(端口绑定、接收请求等)也同样采用了模块化设计,这个 Apache 的核心模块就叫做多路处理模块(Multi-ProcessingModule,简称 MPM)。

Apache 针对不同的操作系统提供了多个不同的 MPM 模块,例如:mpm_beos、mpm_event、mpm_netware、mpmt_os2、mpm_prefork、mpm_winnt、mpm_worker。如果条件允许,我们可以根据实际需求将指定的 MPM 模块编译进我们自己的 Apache 中(Apache 的源码是开放的,允许用户自行编译)。不过,如果在编译时我们没有选择,Apache 将按照如下表格根据不同的操作系统自行选择对应的 MPM 模块,这也是 Apache 针对不同平台推荐使用的 MPM 模块。

操作系统MPM 模块描述
Windowsmpm_winnt下面单独介绍。
Unix/Linuxmpm_prefork下面单独介绍。
BeOSmpm_beos由 Be 公司开发的一种多媒体操作系统,官方版已停止更新。
Netwarempm_netware由 NOVELL 公司推出的一种网络操作系统。
OS/2mpm_os2一种最初由微软和 IBM 共同开发的操作系统,现由 IBM 单独开发(微软放弃 OS/2,转而开发 Windows)。

当然,Apache 在其官方网站上也提供了根据不同操作系统已经编译好对应 MPM 模块的成品 Apache。你可以进入 Apache 官方网站下载。
此外,如果我们想要知道某个 Apache 内部使用的是何种 MPM 模块,我们可以以命令行的方式进入 Apache 安装目录 \bin,然后键入命令 httpd -l,即可查看到当前 Apache 内部使用的何种 MPM 模块。

由于在平常的开发工作中,BeOS、NetWare、OS/2 等操作系统并不常见,这里我们主要针对 Windows 和 Unix/Linux 操作系统上的 MPM 模块进行讲解。在 Windows 和 Unix/Linux 操作系统上,MPM 模块主要有mpm_winnt、mpm_prefork、mpm_worker三种。

mpm_prefork模块

mpm_prefork 模块主要应用于 Unix/Linux 平台的 Apache 服务器,其主要工作方式是:当 Apache 服务器启动后,mpm_prefork 模块会预先创建多个子进程(默认为 5 个),当接收到客户端的请求后,mpm_prefork 模块再将请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。如果当前的请求数将超过预先创建的子进程数时,mpm_prefork模 块就会创建新的子进程来处理额外的请求。Apache 总是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求。这样客户端的请求就不需要在接收后等候子进程的产生。
由于在 mpm_prefork 模块中,每个请求对应一个子进程,因此其占用的系统资源相对其他两种模块而言较多。不过 mpm_prefork 模块的优点在于它的每个子进程都会独立处理对应的单个请求,这样,如果其中一个请求出现问题就不会影响到其他请求。同时,mpm_prefork 模块可以应用于不具备线程安全的第三方模块(比如 PHP 的非线程安全版本),且在不支持线程调试的平台上易于调试。

mpm_worker模块

mpm_worker 模块也主要应用于 Unix/Linux 平台的 Apache 服务器,它可以看作是 mpm_prefork 模块的改进版。mpm_worker 模块的工作方式与 mpm_prefork 模块类似。不过,由于处理相同请求的情况下,基于进程(例如 mpm_prefork)比基于线程的处理方式占用的系统资源要多。因此,与 mpm_prefork 模块不同的是,mpm_worker 模块会让每个子进程创建固定数量的服务线程和一个监听线程,并让每个服务线程来处理客户端的请求,监听线程用于监听接入请求并将其传递给服务线程处理和应答。Apache 总是试图维持一个备用或是空闲的服务线程池。这样,客户端无须等待新线程或新进程的建立即可得到处理。
与 mpm_prefork 模块相比,mpm_worker 模块可以进一步减少系统资源的开销。再加上它也使用了多进程,每个进程又有多个线程,因此它与完全基于线程的处理方式相比,又增加了一定的稳定性。

mpm_event 模块可以看作是 mpm_worker 模块的一个变种,不过其具有实验性质,一般不推荐使用。

mpm_winnt模块

mpm_winnt 模块是专门针对 Windows 操作系统而优化设计的 MPM 模块。它只创建一个单独的子进程,并在这个子进程中轮流产生多个线程来处理请求。

httpd 官方文档:https://httpd.apache.org/docs/

# Apache/httpd  

如果这篇文章对您有帮助,可点击下方链接分享给你的朋友们😋,如果遇到问题欢迎评论、留言~~~😇

评论

公众号:zze_coding

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×