Nginx 由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个 location block(location 是 Nginx 配置中的一个指令,用于 URL 匹配),而在这个 location 中所配置的每个指令,将会启动不同的模块去完成相应的工作。 Nginx 的模块从结构上分为核心模块、基础模块和第三方模块:
Nginx 的模块从功能上分为如下三类:
下图展示了 Nginx 模块常规的 HTTP 请求和响应的过程。
Nginx 本身做的工作实际很少。当它接到一个 HTTP 请求时,它仅仅是通过查找配置文件,将此次请求映射到一个 location block,而此 location 中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做 Nginx 真正的劳动工作者。通常一个 location 中的指令会涉及一个 handler 模块和多个 filter 模块(当然,多个 location 可以复用同一个模块)。
注:模块属于静态编译方式,因为可以直接被编译进 Nginx。启动 Nginx 后,Nginx 的模块被自动加载(不像 Apache,首先将模块编译为一个 so 文件,然后在配置文件中指定是否进行加载)。在解析配置文件时,Nginx 的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。