透过现象看本质——Nginx模块

前言

​ 上篇文章主要讲述了有关Nginx的主配置文件,为什么需要非常关注Nginx的主配置文件呢?这是因为它是我们与nginx的核心,这里的核心不是说nginx的内核部分,而是人机交互的核心,除非基于nginx做二次开发,例如开发第三方模块,一般我们只需要使用nginx实现我们的业务需求。无论是web网站、负载均衡还是反向代理,都需要对其主配置文件熟悉,这样才能玩好其优化。

​ 本文就接着来讲述有关nginx模块的相关内容。

Nginx核心工作者——模块

​ Nginx由内核和各种模块组成。Nginx本身的工作实际很少,当它响应一个HTTP请求时,是通过配置文件将请求映射到一个location block,根据定位中所配置的各个指令启动不同的模块完成工作,所以这就是为什么说模块是Nginx的核心工作者。

当然,Nginx的核心部分也不可以忽略,因为它实现了底层的通讯协议,为其他模块和Nginx进程构建了基本的运行时环境,且构建了其他模块之间的协作的基础。

​ 一般一个location中的指令会涉及一个handler模块和多个filter模块(多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。用户根据自己的需要所二次开发的模块都是第三方模块。这也是nignx功能可以如此强大而经久不衰的主要原因。

1、Nginx模块概述

​ 首先,模块和功能对应,一般一个模块对应一个或多个功能(一般不会很多,而且同一个模块中,功能类似,可以类比面向对象编程中的重载)。其实这样的做法也是人性化的体现,一方面支持模块扩展,一方面便于开发和维护。这也是解耦思想的应用之一。

那究竟什么是Nginx模块呢?

​ 模块可以简单理解为一个个封装好的函数,每个函数实现一个或几个类似的功能,Nginx将这些功能模块组织为一个链,用来应对请求。当一个请求到达的时候,会依次经过这条链上的部分或全部功能模块,进行处理。实现的功能例如:实现对请求解压缩的模块,实现 SSI 的模块,实现与上游服务器进行通讯的模块,实现与 FastCGI 服务进行通讯的模块。

​ 比较特殊的两个模块分别是http模块和mail模块,它们两个居于核心功能部分和各个功能模块之间,从而处理与HTTP协议和email协议有关的事件,同时确保这些事件被以正确的顺序调用其他的一些功能模块。

2、Nginx模块分类

(1)、Nginx的模块基于其结构分为核心模块、基础模块和第三方模块

核心模块

​ 由HTTP模块、EVENT模块和MAIL模块构成。

基础模块

​ 由HTTP Access 模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite 模块构成。

第三方模块

​ 由HTTP Upstream Request Hash模块、Notice 模块和 HTTP Access Key模块构成。

(2)、Nginx的模块基于其功能分为Handlers模块、Filters模块和Proxies模块

Handlers

​ Nginx的处理器模块——直接处理请求,并且进行输出内容和修改headers信息等操作,一般情况下Handlers处理器模块只能有一个。

​ Handlers 模块处理的结果通常有三种情况: 处理成功,处理失败(处理的时候发生了错误)或者是拒绝处理。在拒绝处理的情况下,这个 location 的处理就会由默认的 handler 模块来进行处理。例如,当请求一个静态文件的时候,如果关联到这个 location 上的一个 handler 模块拒绝处理,就会由默认的 ngx_http_static_module 模块进行处理,该模块是一个典型的 handler 模块。

Filters

​ Nginx的过滤器模块——主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。它的处理时间在获取回复内容之后,向用户发送响应之前。它的处理过程分为两个阶段,过滤 HTTP 回复的头部和主体,在这两个阶段可以分别对头部和主体进行修改。

Proxies

​ Nginx的代理类模块——类似于HTTP Upstream 的模块,这类模块主要与后端一些服务如Fastcgi等进行交互,实现服务代理和负载均衡(load-balancer)等功能。upstream 这类的模块将使得Nginx跨越单机完成网络数据的接收、处理和转发。这也是在云时代,Nginx可以作为有能力的中间件(做转发)的关键网络应用组件。

​ 负载均衡模块用于从upstream指令定义的后端主机列表中选取一台主机。Nginx 先使用负载均衡模块找到一台主机,再使用 upstream 模块实现与这台主机的交互。

这三类功能模块也是基本上作为第三方开发者最可能开发的三种类型的模块