About Apache

Apache简介

本节将阐述Apache的概念和原理

概念

apache logo

Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。

Apache取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。

Apache是基于模块化设计的,它的核心代码并不多,大多数的功能都被分散到各个模块中,各个模块在系统启动的时候按需载入。

像PHP的解析运行也是Apache依靠加载众多模块中的PHP Module来完成的。下面我讲介绍一下Apache的运行原理,这部分内容将作为选读内容,了解即可。

Apache的运行原理

正如上文所说,Apache需要依靠多个模块来运行,MPM(Multi -Processing Modules,多重处理模块)就是是Apache的核心组件之一,Apache通过MPM来使用操作系统的资源,对进程和线程池进行管理。

Apache为了能够获得最好的运行性能,针对不同的平台 (Unix/Linux、Window)做了优化,为不同的平台提供了不同的MPM,用户可以根据实际情况进行选择,其中最常使用的MPM有prefork和worker两种。至于您的服务器正以哪种方式运行,取决于安装Apache过程中指定的MPM编译参数,在X系统上默认的编译参数为 prefork。

顾名思义,Prefork就是Apache为了处理即将到来的请求而提前预备的,Apache对于每一个请求都要启动一个单独的进程来处理,保证客户端无需等待开启进程而增加时间的消耗。在Unix系统中,父进程通常以root身份运行以便邦定80端口,而Apache产生的子进程通常以一个低特权的用户运行。User和Group指令用于配置子进程的低特权用户。运行子进程的用户必须要对他所服务的内容有读取的权限,但是对服务内容之外的其他资源必须拥有尽可能少的权限。

Apache将请求处理循环分为11个阶段,依次是:Post-Read-RequestURI TranslationHeader ParsingAccess ControlAuthenticationMIME Type CheckingFixUp,ResponseLoggingCleanUp

阶段分析

Apache阶段分析

在正常请求处理流程中,这是模块可以插入钩子的第一个阶段。对于那些想很早进入处理请求的模块来说,这个阶段可以被利用。
Apache在本阶段的主要工作:检查请求的头部。由于模块可以在请求处理流程的任何一个点上执行检查请求头部的任务,因此这个钩子很少被使用。mod_setenvif就是利用这个阶段工作的。
Apache在本阶段的主要工作:根据配置文件检查是否允许访问请求的资源。Apache的标准逻辑实现了允许和拒绝指令。modauthzhost就是利用这个阶段工作的。
Apache在本阶段的主要工作:按照配置文件设定的策略对用户进行认证,并设定用户名区域。模块可以在这阶段插入钩子,实现一个认证方法。
Apache在本阶段的主要工作:根据配置文件检查是否允许认证过的用户执行请求的操作。模块可以在这阶段插入钩子,实现一个用户权限管理的方法。
Apache在本阶段的主要工作:根据请求资源的MIME类型的相关规则,判定将要使用的内容处理函数。标准模块modnegotiation和modmime实现了这个钩子。
这是一个通用的阶段,允许模块在内容生成器之前,运行任何必要的处理流程。和PostReadRequest类似,这是一个能够捕获任何信息的钩子,也是最常使用的钩子。
Apache在本阶段的主要工作:生成返回客户端的内容,负责给客户端发送一个恰当的回复。这个阶段是整个处理流程的核心部分。
Apache在本阶段的主要工作:在回复已经发送给客户端之后记录事务。模块可能修改或者替换Apache的标准日志记录。
Apache在本阶段的主要工作:清理本次请求事务处理完成之后遗留的环境,比如文件、目录的处理或者Socket的关闭等等,这是Apache一次请求处理的最后一个阶段。
About Nginx

Nginx简介

本节将阐述Nginx的概念和原理

概念

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:京东、新浪、网易、腾讯、淘宝等。目前,nginx已经是互联网上第二流行的开源web服务器软件。

最近几年,web架构拥抱解耦的理念并且将应用层设施从web服务器中分离。虽然现在仅仅是将原先基于LAMP(Linux, Apache, MySQL, PHP, Python or Perl)所构建的网站,变为基于LEMP(E表示Engine x)的。但是,越来越多的实践是将web服务器推入基础设施的边缘,并且用不同的方法整合这些相同或更新的应用和数据库工具集。

Nginx很适合做这些工作。他提供了必要的关键功能用于方便将下列功能从应用层剥离到更高效的边缘web服务器层:并发、长连接处理、SSL,静态内容、压缩和缓存、连接和请求限速,以及HTTP媒体流等。Nginx同时也允许直接整合memcached、Redis或者其他的NoSQL解决方案,增强为处理大规模并发用户的性能。

随着现代编程语言和开发包广泛使用,越来越多的公司改变了应用开发和部署的方式。Nginx已经成为这些改变范例之中的最重要的部件之一,并且已经帮助许多公司在预算内快速启动和开发他们的web服务。

架构以及运行原理

Nginx的架构以及运行原理

传统基于进程或线程的模型使用单独的进程或线程处理并发连接,因而会阻塞于网络或I/O操作。根据不同的应用,就内存和CPU而言,这是非常低效的。派生进程或线程需要准备新的运行环境,包括在内存上分配堆和栈、生成一个新的运行上下文。创建这些东西还需要额外的CPU时间,而且过度的上下文切换引起的线程抖动最终会导致性能低下。所有这些复杂性在如Apache web服务器的老架构上一览无遗。在提供丰富的通用应用功能和优化服务器资源使用之间需要做一个权衡。

最早的时候,nginx希望为动态增长的网站获得更好的性能,并且密集高效的使用服务器资源,所以其使用了另外一个模型。受不断发展的在不同操作系统上开发基于事件模型的技术驱动,最终一个模块化,事件驱动,异步,单线程,非阻塞架构成为nginx代码的基础。

Nginx大量使用多路复用和事件通知,并且给不同的进程分配不同的任务。数量有限的工作进程(Worker)使用高效的单线程循环处理连接。每个worker进程每秒可以处理数千个并发连接、请求。

Nginx的模块从结构上分为核心模块、基础模块和第三方模块:

核心模块:HTTP模块、EVENT模块和MAIL模块.

基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite.

第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块.

Nginx的模块从功能上分为如下三类:

Handlers(处理器模块):此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。

Filters (过滤器模块):此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。

Proxies (代理类模块):此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。

Nginx和FastCGI

FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等。同时,FastCGI也被许多脚本语言支持,其中就有PHP。

FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后将结果返回给HTTP服务器。这在处理高并发访问时几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少使用了。

FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

Nging和FastCGI合作

Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。

接下来以Nginx下PHP的运行过程来说明。PHP-FPM是管理FastCGI的一个管理器,它作为PHP的插件存在。

FastCGI进程管理器php-fpm自身初始化,启动主进程php-fpm和启动start_servers个CGI 子进程。主进程php-fpm主要是管理fastcgi子进程,监听9000端口。fastcgi子进程等待来自Web Server的连接。

当客户端请求到达Web Server Nginx是时,Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,即Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理。

FastCGI进程管理器PHP-FPM选择并连接到一个子进程CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程。

FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。

FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。

Apache VS Nginx

Apache和Nginx的比较

介绍了这么多 到底谁才是web里最好用的服务器?

Nginx和Apache一样,都是HTTP服务器软件,在功能实现上都采用模块化结构设计,都支持通用的语言接口,如PHP、Perl、Python等,同时还支持正向和反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输等。

在功能实现上,Apache的所有模块都支持动、静态编译,而Nginx模块都是静态编译的,对FastCGI的支持,Apache对Fcgi的支持不好,而Nginx对Fcgi的支持非常好;在处理连接方式上,Nginx支持epoll,而Apache却不支持;在空间使用上,Nginx安装包仅仅只有几百K,和Nginx比起来Apache绝对是庞然大物。

Nginx相对apache的优点

  • 轻量级,同样起web 服务,比apache 占用更少的内存及资源
  • 静态处理,Nginx 静态处理性能比 Apache 高 3倍以上
  • 抗并发,nginx 处理请求是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。在Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出现Apache进程数飙升,从而拒绝服务的现象。
  • 高度模块化的设计,编写模块相对简单
  • 社区活跃,各种高性能模块出品迅速啊

apache相对nginx的优点

  • rewrite,比nginx 的rewrite 强大
  • 模块超多,基本想到的都可以找到
  • 超稳定,少bug,nginx的bug相对较多
  • Apache对PHP支持比较简单,Nginx需要配合其他后端用

Apache不再适用?

Apache web服务器软件发源于1990年代,目前在互联网网站上占有率第一。Apache的架构适合当时的操作系统和硬件,并且也符合当时的互联网状况:一个网站通常使用一台物理服务器运行一个Apache实例。2000年之后,显然这种单服务器模型已经无法简单扩展来满足日益增长的web服务需求。虽然Apache为新功能开发提供了坚实的基础,但他为每个新连接派生一个进程的做法(译注:Apache从2.4版本起已经支持事件模型),不适合网站的非线性扩展。

最终,Apache成为一个通用的web服务器软件,聚焦于功能多样化,第三方扩展开发,以及web应用开发的通用性。然而,当硬件成本越来越低,每个连接消耗的CPU和内存越来越多,使用这样功能繁多的单一软件不再具有可伸缩性。

因而,当服务器硬件、操作系统和网络设施不再成为网站增长的主要限制因素时,网站开发者开始寻求更高效的手段来架设web服务器。大约十年前,著名软件工程师Daniel Kegel提出:“是时候让web服务器支持同时处理10000客户端了”,并且预言了现在称为云服务的技术。Kegel的C10K设想明显推动了许多人尝试解决这个问题--通过优化web服务器软件来支持大规模客户端连接的并发处理,nginx是其中做的最成功者之一。

为了解决10000个并发连接的C10K问题,nginx基于一个完全不同的架构—更适合每秒同时连接数和请求数非线性增长。Nginx基于事件模型,而没有模仿Apache为每个请求派生新进程或线程的做法。最终结果就是即使负载增加了,内存和CPU使用事件始终保持可预期。Nginx使用普通的硬件就能在一个服务器上处理数万的并发连接。

Nginx的第一个版本发布之后,一般被用来同Apache一同部署,HTML、CSS、JavaScript脚本和图片等静态内容由nginx处理,来降低Apache应用服务器的并发和延时。随着开发演进的过程,nginx增加了FastCGI、uswge和SCGI等协议的支持,以及对分布式内存对象缓存系统如memcached的支持。也增加了其他有用的功能,例如支持负载均衡和缓存的反向代理。这些附加功能使nginx成为一个高效的工具集,用于构建可伸缩的web基础设施.

2012年2月,Apache 2.4.x版本发布。虽然增加了新的并发处理核心模块和代理模块,用于加强可伸缩性和性能,但要说性能、并发能力和资源利用率是否能赶上或超过纯事件驱动模型的web服务器还为时尚早。Apache新版本具有了更好的性能值得高兴,对于nginx+Apache的web网站架构,虽然这能够缓解后端潜在的瓶颈,但并不能解决全部问题。

为什么都在转向Nginx

作为Web服务器: Nginx处理静态文件、索引文件,自动索引的效率非常高。

作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度。

作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡。

在性能方面,Nginx是专门为性能优化而开发的,在实现上非常注重效率。它采用内核Poll模型(epoll and kqueue ),可以支持更多的并发连接,最大可以支持对50 000个并发连接数的响应,而且只占用很低的内存资源。

在稳定性方面,Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,Nginx保持10 000个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的。

在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7×24小时不间断地运行。

参考以上的Nginx的优点,Apache显得不太适应目前的互联网形式了,面对高并发,流量大的网站,显然是不能满足的。但是像一般的小型网站,或者你要追求网站的稳定性和安全性,Apache依然是你的首选服务器。

同时使用Nginx和Apache

由于Nginx和Apache各自的优势,现在很多人选择了让两者在服务器中共存。在服务器端让Nginx在前,Apache在后。由Nginx做负载均衡和反向代理,并且处理静态文件,讲动态请求(如PHP应用)交给Apache去处理。

请登录

WOWPHP 账号登录 GitHub 账号登录

还没有账号?现在去注册一个~