文档章节

nginx模块描述,模块分类,处理流程

d
 daydayup08
发布于 2016/06/28 17:18
字数 1907
阅读 78
收藏 9

一,模块概述


nginx将各功能模块组织成一条链,当有请求到达的时候,请求依次经过这条链上的部分或者全部模块,进行处理。每个模块实现特定的功能。例如,实现对请求解压缩的模块,实现SSI的模块,实现与上游服务器进行通讯的模块,实现与FastCGI服务进行通讯的模块。

有两个模块比较特殊,他们居于nginx core和各功能模块的中间。这两个模块就是http模块和mail模块。这2个模块在nginx core之上实现了另外一层抽象,处理与HTTP协议和email相关协议(SMTP/POP3/IMAP)有关的事件,并且确保这些事件能被以正确的顺序调用其他的一些功能模块。

目前HTTP协议是被实现在http模块中的,但是有可能将来被剥离到一个单独的模块中,以扩展nginx支持SPDY协议。

二,模块的分类


nginx的模块根据其功能基本上可以分为以下几种类型:

event module: 搭建了独立于操作系统的事件处理机制的框架,及提供了各具体事件的处理。包括ngx_events_module, ngx_event_core_module和ngx_epoll_module等。nginx具体使用何种事件处理模块,这依赖于具体的操作系统和编译选项。

phase handler: 此类型的模块也被直接称为handler模块。主要负责处理客户端请求并产生待响应内容,比如ngx_http_static_module模块,负责客户端的静态页面请求处理并将对应的磁盘文件准备为响应内容输出。

output filter: 也称为filter模块,主要是负责对输出的内容进行处理,可以对输出进行修改。例如,可以实现对输出的所有html页面增加预定义的footbar一类的工作,或者对输出的图片的URL进行替换之类的工作。

upstream: upstream模块实现反向代理的功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端。upstream模块是一种特殊的handler,只不过响应内容不是真正由自己产生的,而是从后端服务器上读取的。

load-balancer: 负载均衡模块,实现特定的算法,在众多的后端服务器中,选择一个服务器出来作为某个请求的转发服务器。

三,nginx的请求处理


nginx使用一个多进程模型来对外提供服务,其中一个master进程,多个worker进程。master进程负责管理nginx本身和其他worker进程。

所有实际上的业务处理逻辑都在worker进程。worker进程中有一个函数,执行无限循环,不断处理收到的来自客户端的请求,并进行处理,直到整个nginx服务被停止。

worker进程中,ngx_worker_process_cycle()函数就是这个无限循环的处理函数。在这个函数中,一个请求的简单处理流程如下:

#) 操作系统提供的机制(例如epoll, kqueue等)产生相关的事件。
#) 接收和处理这些事件,如是接受到数据,则产生更高层的request对象。
#) 处理request的header和body。
#) 产生响应,并发送回客户端。
#) 完成request的处理。
#) 重新初始化定时器及其他事件。

四,请求的处理流程
 

为了让大家更好的了解nginx中请求处理过程,我们以HTTP Request为例,来做一下详细地说明。

从nginx的内部来看,一个HTTP Request的处理过程涉及到以下几个阶段。

#) 初始化HTTP Request(读取来自客户端的数据,生成HTTP Request对象,该对象含有该请求所有的信息)。
#) 处理请求头。
#) 处理请求体。
#) 如果有的话,调用与此请求(URL或者Location)关联的handler。
#) 依次调用各phase handler进行处理。

在这里,我们需要了解一下phase handler这个概念。phase字面的意思,就是阶段。所以phase handlers也就好理解了,就是包含若干个处理阶段的一些handler。

在每一个阶段,包含有若干个handler,再处理到某个阶段的时候,依次调用该阶段的handler对HTTP Request进行处理。

通常情况下,一个phase handler对这个request进行处理,并产生一些输出。通常phase handler是与定义在配置文件中的某个location相关联的。

一个phase handler通常执行以下几项任务:

#) 获取location配置。
#) 产生适当的响应。
#) 发送response header。
#) 发送response body。


当nginx读取到一个HTTP Request的header的时候,nginx首先查找与这个请求关联的虚拟主机的配置。如果找到了这个虚拟主机的配置,那么通常情况下,这个HTTP Request将会经过以下几个阶段的处理(phase handlers):

NGX_HTTP_POST_READ_PHASE:      读取请求内容阶段
NGX_HTTP_SERVER_REWRITE_PHASE: Server请求地址重写阶段
NGX_HTTP_FIND_CONFIG_PHASE:    配置查找阶段:
NGX_HTTP_REWRITE_PHASE:        Location请求地址重写阶段
NGX_HTTP_POST_REWRITE_PHASE:   请求地址重写提交阶段
NGX_HTTP_PREACCESS_PHASE:      访问权限检查准备阶段
NGX_HTTP_ACCESS_PHASE: 访问权限检查阶段
NGX_HTTP_POST_ACCESS_PHASE:    访问权限检查提交阶段
NGX_HTTP_TRY_FILES_PHASE:      配置项try_files处理阶段
NGX_HTTP_CONTENT_PHASE:        内容产生阶段
NGX_HTTP_LOG_PHASE:    日志模块处理阶段


在内容产生阶段,为了给一个request产生正确的响应,nginx必须把这个request交给一个合适的content handler去处理。如果这个request对应的location在配置文件中被明确指定了一个content handler,那么nginx就可以通过对location的匹配,直接找到这个对应的handler,并把这个request交给这个content handler去处理。这样的配置指令包括像perl,flv,proxy_pass,mp4等。

如果一个request对应的location并没有直接有配置的content handler,那么nginx依次尝试:

#) 如果一个location里面有配置random_index on,那么随机选择一个文件,发送给客户端。
#) 如果一个location里面有配置index指令,那么发送index指令指明的文件,给客户端。
#) 如果一个location里面有配置autoindex on,那么就发送请求地址对应的服务端路径下的文件列表给客户端。
#) 如果这个request对应的location上有设置gzip_static on,那么就查找是否有对应的.gz文件存在,有的话,就发送这个给客户端(客户端支持gzip的情况下)。
#) 请求的URI如果对应一个静态文件,static module就发送静态文件的内容到客户端。

内容产生阶段完成以后,生成的输出会被传递到filter模块去进行处理。filter模块也是与location相关的。所有的fiter模块都被组织成一条链。输出会依次穿越所有的filter,直到有一个filter模块的返回值表明已经处理完成。

这里列举几个常见的filter模块,例如:

#) server-side includes。
#) XSLT filtering。
#) 图像缩放之类的。
#) gzip压缩。


在所有的filter中,有几个filter模块需要关注一下。按照调用的顺序依次说明如下:

write: 写输出到客户端,实际上是写到连接对应的socket上。
postpone: 这个filter是负责subrequest的,也就是子请求的。
copy: 将一些需要复制的buf(文件或者内存)重新复制一份然后交给剩余的body filter处理。
 

本文转载自:

共有 人打赏支持
上一篇: vim命令基本操作
下一篇: tomcat基本优化
d
粉丝 0
博文 36
码字总数 25914
作品 0
深圳
技术主管
私信 提问
nginx源码分析——模块

模块介绍 高度模块化的设计是nginx的架构基础。在nginx中,除了少量的核心代码,其他一切皆为模块。这种模块化设计同时具有以下几个特点: 高度抽象的模块接口 所有的模块都遵循着同样的 ng...

hncscwc
2016/06/17
120
0
【充电】《Nginx核心知识100讲》nginx模块

极客专栏《Nginx核心知识100讲》33-34小节的笔记 Nginx的模块究竟是什么? 1.了解Nginx 模块 有的模块编译进去就可以使用。有的模块只有配置了配置项才可以使用。 看源码的方式,看看每个配置...

言十年
2018/12/29
0
0
nginx源码分析——http多阶段处理

多阶段处理概述 nginx将一个http请求分为顺序的多个处理阶段,前一个阶段的结果会影响后一个阶段的处理。例如,ngxhttpaccess_module模块根据IP信息拒绝一个用户请求后,本应接着执行的其他H...

hncscwc
2016/07/04
252
0
Nginx之模块处理流程

nginx的内部结构是由核心部分和一系列的功能模块所组成。这样划分是为了使得每个模块的功能相对简单,便于开发,同时也便于对系统进行功能扩展。这样的模块化设计类似于面向对象中的接口类,...

于学康
2017/05/23
0
0
深度好文:Nginx 是如何启动并处理 http 请求的?

很早之前就有看nginx的冲动,但是一直被一些事耽搁着,最近在繁忙之中,抽出点时间,看了下Nginx代码,发现整体上并不是很难看懂,而且刚好想学习nginx+lua开发。 nginx 在互联网公司使用很广...

高效运维
2018/08/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

equals()的重写规则

自反性。对于任何非null的引用值x,x.equals(x)应返回true。 对称性。对于任何非null的引用值x与y,当且仅当:y.equals(x)返回true时,x.equals(y)才返回true。 传递性。对于任何非null的引用...

无精疯
11分钟前
0
0
Go基础系列:双层channel用法示例

双层通道的解释见Go的双层通道 以下是一个双层通道的使用示例。注意下面的示例中使用了"信号通道"(Signal channel),但这里的信号通道是多余的,仅仅只是为了介绍。 信号通道不用来传递数据,...

echojson
19分钟前
0
0
PHP文件上传error的错误类型

PHP文件上传error的错误类型 - $_FILES['file']['error'] 有以下几种类型 1、UPLOAD_ERR_OK 其值为 0,没有错误发生,文件上传成功。 2、UPLOAD_ERR_INI_SIZE 其值为 1,上传的文件超过了 ph......

小良下山化了个缘
46分钟前
2
0
分布式项目(四)Mapping Server 数据映射

上回说道CoAp client和server的实现,数据也安装定义的格式发送到了kafka中,接下来就是Mapping server的实现,物理设备数据映射到抽象设备上,并赋予数据业务含义。 iot-mapping 构建iot-m...

lelinked
55分钟前
3
0
使用data pump驱动的外部表移动数据

使用data pump驱动的外部表移动数据 比如我们有一个报表的数据,准备从一个数据库A中移动到另一个数据库B中,如何实现? 这个问题,我们使用带data pump驱动的外部表方式,很容易实现,具体方法如下...

突突突酱
58分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部