nginx的内部结构是由核心部分和一系列的功能模块所组成。这样划分是为了使得每个模块的功能相对简单,便于开发,同时也便于对系统进行功能扩展。为了便于描述,下文中我们将使用nginx core来称呼nginx的核心功能部分。

nginx提供了web服务器的基础功能,同时提供了web服务反向代理,email服务反向代理功能。nginx core实现了底层的通讯协议,为其他模块和nginx进程构建了基本的运行时环境,并且构建了其他各模块的协作基础。除此之外,或者说大部分与协议相关的,或者应用相关的功能都是在这些模块中所实现的。

模块概述

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()函数就是这个无限循环的处理函数。在这个函数中,一个请求的简单处理流程如下:

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

请求的处理流程

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

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

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

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

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

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

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

  1. 获取location配置。
  2. 产生适当的响应。
  3. 发送response header.
  4. 发送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依次尝试:

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

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

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

  1. server-side includes。
  2. XSLT filtering。
  3. 图像缩放之类的。
  4. gzip压缩。

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

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

nginx的模块化体系结构相关推荐

  1. 学习《apache源代码全景分析》之模块化体系结构摘录

    1.Apache1.3系列的模块结构如下: Apache 2.0模块构成部分如下: 2.Apache核心和模块的交互示意图: 核心模块必须与非核心模块进行交互,目前有两种交互方式. (1) 核心模块通 ...

  2. Nginx深入详解之模块化体系结构

    在开始唠叨之前,先简单介绍下配置系统,因为之后的东东会与这个有一定的关系. 一.配置系统 Nginx的配置系统由一个主配置文件和一些辅助配置文件构成,这些配置文件默认在/etc/nginx/目录下. ...

  3. Nginx开发从入门到精通

    Nginx开发从入门到精通 缘起 nginx由于出色的性能,在世界范围内受到了越来越多人的关注,在淘宝内部它更是被广泛的使用,众多的开发以及运维同学都迫切的想要了解nginx模块的开发以及它的内部原理 ...

  4. Nginx 入门指南

    Nginx 入门指南 简介: Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强.本教程根据淘宝核心系统服务器平台组的 ...

  5. nginx 官方文档翻译

    nginx(发音为"engine x")是一个由俄罗斯软件工程师Igor Sysoev编写的免费开源Web服务器.自2004年公开发布以来,nginx专注于高性能,高并发性和低内存 ...

  6. 浅浅浅学 Nginx 基基基础(较为完整)

    文章目录 一.关于 Nginx 二.Nginx 的特点 三.Nginx 架构 1.多进程单线程 2.IO多路复用模型 3.worker 进程工作流程 4.惊群效应 四.Nginx 基本数据结构 五.N ...

  7. Tengine---nginx平台初探

    nginx的配置系统 1. nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成.这些配置文件均是纯文本文件,全部位于nginx安装目录下的conf目录下 2. 配置文件中以#开始的行,或 ...

  8. nginx 转发慢_为啥 Nginx 能轻松淦到几万并发?

    Nginx以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名.本文了解一下 Nginx为什么这么快! ❝为了防止不提供原网址的转载,特加原文链接:ningg.top/nginx-series ...

  9. Nginx 为什么这么快?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:ningg 来源:ningg.top/nginx-serie ...

最新文章

  1. 图像理解之物体检测object detection,模型rcnn/fastrcnn/fasterrcnn原理及概念
  2. 关于会计科目表,科目组,字段状态组
  3. Lua源码分析 - 基础篇 - Lua源码的结构和架构图(01)
  4. 在鹅厂做了14年开发
  5. 敏捷结果: 学习笔记
  6. 总结 构造函数与非构造函数 原型继承的一个方法
  7. 企业实战_17_MyCat水平扩展_跨分片查询_ER分片
  8. 20211027:《Labuladong的算法小抄》学习记录(一)
  9. tvs二极管5.0SMDJ24CA-H ISO7637 测试报告
  10. 六大场景,看懂声纹识别技术怎样“抗疫防疫” 小快
  11. 在官网下载linux版本的tomcat
  12. 李理:自动梯度求解——使用自动求导实现多层神经网络
  13. 尚学堂Spring视频教程(七):AOP XML
  14. 2023必火的5种服装店装修风格,看看哪种风格适合你家店?
  15. c语言 编程显示图案*,C语言中怎么编程在计算机屏幕上显示如下图案?
  16. tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】
  17. 【LayIM】开发者文档
  18. HDU 1728 逃离迷宫
  19. 毕业设计《宠物医院挂号系统》
  20. Linux入门真经-029MBR格式分区与fdisk

热门文章

  1. fat32转ntfs工具无损数据安全转换_干货真香! 无损制作UD三分区教程,新手小白的福利来了...
  2. python统计缺失值
  3. python正则表达式使用修饰符
  4. api-ms-win-crt-process-l1-1-0.dll 丢失的处理,遇到问题和完美解决
  5. 多行文本溢出显示省略号(…) text-overflow: ellipsis
  6. UIImagePickerController拍照与摄像
  7. Intra Chroma Prediction
  8. 2014校招 百度试题及答案
  9. 11、MFC中自定义消息
  10. 用Visual C#实现文件下载