Handler 模块
Handler 模块简介
Handler 模块就是接受来自客户端的请求并产生输出的模块。
配置文件中使用 location 指令可以配置 content handler 模块,当 Nginx 系统启动的时候,每个 handler 模块都有一次机会把自己关联到对应的 location上。如果有多个 handler 模块都关联了同一个 location,那么实际上只有一个 handler 模块真正会起作用。
handler 模块处理的结果通常有三种情况: 处理成功,处理失败(处理的时候发生了错误)或者是拒绝处理。在拒绝处理的情况下,这个 location 的处理就会由默认的 handler 模块来进行处理。
模块基本结构
模块配置结构
Nginx 的配置信息分成了几个作用域(scope),这就是 main,server 以及 location。同样的每个模块提供的配置指令也可以出现在这几个作用域里。那对于这三个作用域的配置信息,每个模块就需要定义三个不同的数据结构去进行存储。不过不是每个模块都会在这三个作用域都提供配置指令的,所以不一定每个模块都需要定义三个数据结构去存储这些配置信息了。
对于模块配置信息的定义,命名习惯如下
ngx_http_<module name>_(main|srv|loc)_conf_t
例如:
typedef struct{ ngx_str_t hello_string; ngx_int_t hello_counter; }ngx_http_hello_loc_conf_t;
模块配置指令
一个模块的配置指令定义在一个静态数组中。
ngx_command_t 的定义如下:
struct ngx_command_s { ngx_str_t name; ngx_uint_t type; char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); ngx_uint_t conf; ngx_uint_t offset; void *post; };
name: 配置指令的名称。
type: 该配置的类型,准确地说,是该配置指令属性的集合。Nginx 提供了很多预定义的属性值(一些宏定义),通过逻辑或运算符可组合在一起,形成对这个配置指令的详细的说明。下面列出可在这里使用的预定义属性值及说明。
- NGX_CONF_NOARGS:配置指令不接受任何参数。
- NGX_CONF_TAKE1:配置指令接受 1 个参数。
- NGX_CONF_TAKE2:配置指令接受 2 个参数。
- NGX_CONF_TAKE3:配置指令接受 3 个参数。
- NGX_CONF_TAKE4:配置指令接受 4 个参数。
- NGX_CONF_TAKE5:配置指令接受 5 个参数。
- NGX_CONF_TAKE6:配置指令接受 6 个参数。
- NGX_CONF_TAKE7:配置指令接受 7 个参数。
可以组合多个属性,比如一个指令即可以不填参数,也可以接受1个或者2个参数。那么就是NGX_CONF_NOARGS|NGX_CONF_TAKE1|NGX_CONF_TAKE2
。如果写上面三个属性在一起,你觉得麻烦,那么Nginx 提供了一些定义,使用起来更简洁。
- NGX_CONF_TAKE12:配置指令接受 1 个或者 2 个参数。
- NGX_CONF_TAKE13:配置指令接受 1 个或者 3 个参数。
- NGX_CONF_TAKE23:配置指令接受 2 个或者 3 个参数。
- NGX_CONF_TAKE123:配置指令接受 1 个或者 2 个或者 3 参数。
- NGX_CONF_TAKE1234:配置指令接受 1 个或者 2 个或者 3 个或者 4 个参数。
- NGX_CONF_1MORE:配置指令接受至少一个参数。
- NGX_CONF_2MORE:配置指令接受至少两个参数。
- NGX_