一. Nginx 的模块与工作原理
Nginx 由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个 location block(location 是 Nginx 配置中的一个指令,用于 URL 匹配),而在这个 location 中所配置的每个指令,将会启动不同的模块去完成相应的工作。
Nginx 的模块从结构上分为核心模块、基础模块和第三方模块:
- 核心模块:HTTP 模块、EVENT 模块和 MAIL 模块
- 基础模块:HTTP Access 模块、HTTP FastCGI 模块、HTTP
- 第三方模块:HTTP Upstream Request Hash 模块、Notice 模块和 HTTPAccess Key 模块;
- 用户根据自己的需要开发的模块都属于第三方模块。正是有了这么多模块的支撑,Nginx 的功能才会如此强大。
Nginx 的模块从功能上分为如下三类:
- Handlers:即处理器模块。此类模块直接处理请求,并进行输出内容和修改 headers 信息等操作。Handlers 处理器模块一般只能有一个。
- Filters:即过滤器模块。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由 Nginx 输出。
- Proxies:即代理类模块。此类模块是 Nginx 的 HTTP Upstream 之类的模块,这些模块主要与后端一些服务比如 FastCGI 等进行交互,实现服务代理和负载均衡等功能。
下图展示了 Nginx 模块常规的 HTTP 请求和响应的过程。
Nginx 本身做的工作实际很少。当它接到一个 HTTP 请求时,它仅仅是通过查找配置文件,将此次请求映射到一个 location block,而此 location 中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做 Nginx 真正的劳动工作者。通常一个 location 中的指令会涉及一个 handler 模块和多个 filter 模块(当然,多个 location 可以复用同一个模块)。
注:模块属于静态编译方式,因为可以直接被编译进 Nginx。启动 Nginx 后,Nginx 的模块被自动加载(不像 Apache,首先将模块编译为一个 so 文件,然后在配置文件中指定是否进行加载)。在解析配置文件时,Nginx 的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。