Apache和Nginx运行原理解析
Web服务器
Web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。
应用层使用HTTP协议。
HTML文档格式。
浏览器统一资源定位器(URL)。
Web服务器常常以B/S(Browser/Server)方式提供服务。浏览器和服务器的交互方式如下:
GET /index.php HTTP/1.1
+---------------+ +----------------+
| +-------------------> |
| Browser | | Server |
| <-------------------+ |
+---------------+ +----------------+
HTTP/1.1 200 OK
浏览器向服务器发出HTTP请求(Request)。
服务器收到浏览器的请求数据,经过分析处理,向浏览器输出响应数据(Response)。
浏览器收到服务器的响应数据,经过分析处理,将最终结果显示在浏览器中。
Apache和Nginx都属于Web服务器,两者都实现了HTTP 1.1协议。
Apache生命周期
"text"> +--------------------------------------------------------------+
| +---------------------+ 启动阶段 |
| | 系统启动, 配置 | |
| +----------+----------+ |
| | |
| +----------v----------+ |
| | 模块的初始化 | |
| +-+--------+--------+-+ |
| | | | |
| +-------------+ | +------v-------+| +--------------+ |
| | 子进程初始化 |<+ | 子进程初始化 |+>| 子进程初始化 | |
| +------+------+ +-------+------+ +-------+------+ |
+--------------------------------------------------------------+
| | | | 运行阶段 |
| +----v----+ +----v----+ +----v----+ |
| | 请求循环 | | 请求循环 | | 请求循环 | |
| +----+----+ +----+----+ +----+----+ |
| | | | |
| +------v------+ +------v------+ +------v------+ |
| | 子进程结束 | | 子进程结束 | | 子进程结束 | |
| +-------------+ +-------------+ +-------------+ |
+--------------------------------------------------------------+
这个生命周期是在perfork工作下的示意,从图中可以看出,Apache对于每一个请求都要启动一个单独的进程来处理。
Apache的工作模式 prefork的工作原理
一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的 (spare)或是空闲的子进程用于迎接即将到来的请求。这样客户端就无需在得到服务前等候子进程的产生。在Unix系统中,父进程通常以root身份运行以便邦定80端口,而 Apache产生的子进程通常以一个低特权的用户运行。User和Group指令用于配置子进程的低特权用户。运行子进程的用户必须要对他所服务的内容有读取的权限,但是对服务内容之外的其他资源必须拥有尽可能少的权限。
worker的工作原理
每个进程能够拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程能够建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。Apache总是试图维持一个备用(spare)或是空闲的服务线程池。这样,客户端无须等待新线程或新进程的建立即可得到处理。在Unix中,为了能够绑定80端口,父进程一般都是以root身份启动,随后,Apache以较低权限的用户建立子进程和线程。User和Group指令用于配置Apache子进程的权限。虽然子进程必须对其提供的内容拥有读权限,但应该尽可能给予他较少的特权。另外,除非使用了suexec ,否则,这些指令配置的权限将被CGI脚本所继承。
Apache的运行 启动阶段
+---------+
| 开始 |
+----+---+
|
+----------v------------+ 解析主配置文件http.conf中配置信息,
| 解析配置文件 | 像LoadModule, AddType
+----------+------------+ 等指令被加载至内存
|
+----------v------------+ 依据AddModule, LoadModule等指令
| 加载静态/动态模块 | 加载Apache模块,像mod_php5.so被
+----------+------------+ 加载至内存,映射到Apache地址空间。
|
+----------v------------+ 日志文件、共享内存段,数据库链接
| 系统资源初始化 | 等初始化
+----------+------------+
|
+---v----+
| 结束 |
+--------+
运行阶段
1、接受请求
2、将请求的URL映射到本地文件系统
3、检查请求头部
4、根据配置判断是否能访问所请求的资源
5、用户认证
6、用户权限管理(认证)
7、根据请求资源的MIME类型,选择相应的处理函数
8、捕获消息
9、Response,生成返回客户端内容
10、发送后,记录日志
11、清理请求遗留环境,Socket关闭
//======================================//
Nginx的模块与工作原理
Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
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等进行交互,实现服务代理和负载均衡等功能。
"text"> + ^
Http Request | | Http Response
| |
+---------+------v-----+ +----+----+
| Conf | Nginx Core | | FilterN |
+---------+------+-----+ +----^----+
| |
| +----+----+
| | Filter2 |
choose a handler | +----^----+
based conf | |
| +----+----+
| | Filter1 |
| +----^----+
| | Generate content
+-----v--------------------+----+
| Handler |
+-------------------------------+
Nginx架构及工作流程
上图是Nginx的架构,这个架构类似于Apache的Worker工作状态,Nginx的每一个Worker进程都管理着大量的线程,真正处理请求的是Worker之下的线程。
所有实际上的业务处理逻辑都在worker进程。worker进程中有一个函数,执行无限循环,不断处理收到的来自客户端的请求,并进行处理,直到整个nginx服务被停止。Worker中这个函数执行内容如下:
操作系统提供的机制(例如epoll, kqueue等)产生相关的事件。
接收和处理这些事件,如是接受到数据,则产生更高层的request对象。
处理request的header和body。
产生响应,并发送回客户端。
完成request的处理。
重新初始化定时器及其他事件。
详细请访问原文地址 :http://www.server110.com/nginx/201402/6543.html