Nginx的模块化体系结构

模块概述

Nginx的内部结构是核心部分和一系列的功能模块所组成。

我们一般将Nginx core称为Nginx核心,其提供了web服务器的基础功能,同时提供了web服务反向代理,email服务反向代理,Nginx核心实现了底层的通讯协议,为其他模块和Nginx进程构建了基本的运行时环境。

Nginx将各功能模块组成成一条链,请求依次经过这条链上的部分或者全部模块进行处理。

模块的分类

  • event module:搭建了独立于操作系统的事件处理机制框架,及提供了各具体事件的处理。包括ngx_event_module,ngx_event_core_module和ngx_epoll_module等。
  • phase handler:此模型又被称为handler模块,主要负责处理客户端请求并产生响应内容的
  • output filter:filter模块,主要负责对输出的内容进行处理,可以对输出进行修改。
  • upstream:此模块实现反向代理功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端
  • load-balancer:负载进行模块,实现特点的算法,在众多后端服务器中,选择一个服务器来作为某个请求的转发服务器。

Nginx的请求处理

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

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

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

  1. 操作系统提供的机制产生相应的事件
  2. 接受和处理这些事件,如是接收到 数据,则产生更高层的request对象
  3. 处理request的headerbody
  4. 产生响应,并发送回客户端
  5. 完成request的处理
  6. 重新初始化定时器和其他事件

请求的处理流程

HTTP Request为例

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

  1. 初始化HTTP Request
  2. 处理请求头
  3. 处理请求体
  4. 调用与此请求相关的handler(如果有的话)
  5. 依次调用各phase handler进行处理

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

  1. 获取location配置
  2. 产生适当的响应
  3. 发送response header
  4. 发送response body

当Nginx读取到header的实收,会查找与这个请求相关的虚拟主机的配置,然后执行以下几个阶段:

在内容产生阶段,为了给一个request产生正确的响应,Nginx必须把这个request交给一个合适的content handler进行处理,如果这个request对应的location在配置文件中被明确指定了一个content handler,那么Nginx就可以通过对location的匹配直接找到这个对应的handler,并把这个request交给这个handler。

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

  1. 如果location里面配置有random_index on,那么随机选择一个文件,发给客户端。
  2. 如果location配置有index指定,那么发送index指令指明的文件。
  3. 如果location里面有配置autoindex on,那么就发送请求地址对应的服务端路径下的文件列表给客户端
  4. 如果location有设置gzip_static on,那么查找是否有对应的.gz文件存在,有就发送
  5. 请求的URL如果对应一个静态文件,static module就发送静态文件的内容到客户端

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

参考文献

[1] Nginx开发从入门到精通
全部评论

相关推荐

牛客771574427号:恭喜你,华杰
点赞 评论 收藏
分享
10-17 12:16
同济大学 Java
7182oat:快快放弃了然后发给我,然后让我也泡他七天最后再拒掉,狠狠羞辱他一把😋
点赞 评论 收藏
分享
评论
1
1
分享
正在热议
# 25届秋招总结 #
440737次浏览 4493人参与
# 春招别灰心,我们一人来一句鼓励 #
41503次浏览 524人参与
# 北方华创开奖 #
107314次浏览 599人参与
# 地方国企笔面经互助 #
7930次浏览 18人参与
# 同bg的你秋招战况如何? #
75684次浏览 552人参与
# 虾皮求职进展汇总 #
114355次浏览 884人参与
# 阿里云管培生offer #
119890次浏览 2219人参与
# 实习,投递多份简历没人回复怎么办 #
2454094次浏览 34848人参与
# 实习必须要去大厂吗? #
55687次浏览 960人参与
# 提前批简历挂麻了怎么办 #
149836次浏览 1977人参与
# 投递实习岗位前的准备 #
1195731次浏览 18546人参与
# 你投递的公司有几家约面了? #
33180次浏览 188人参与
# 双非本科求职如何逆袭 #
661934次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4734次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157604次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11381次浏览 271人参与
# 发工资后,你做的第一件事是什么 #
12431次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35621次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20091次浏览 240人参与
# 我的上岸简历长这样 #
451933次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39241次浏览 314人参与
# 非技术岗是怎么找实习的 #
155852次浏览 2120人参与
牛客网
牛客企业服务