在简单的http模块中,mytest
配置项后面没有跟任何参数。本篇博客学习讨论HTTP模块是怎样获得感兴趣的配置项。
处理http配置项可以分为下面4个步骤:
(1)创建数据结构用于存储配置项对应的参数。
(2)设定配置项在nginx.conf中出现时的限制条件与回调方法。
(3)实现第二步中的回调方法,或者使用Nginx框架预设的14个回调方法。
(4)合并不同级别的配置块中出现的同名配置项。
这四个步骤是通过ngx_http_module_t
以及ngx_command_t
有机的结合起来。
本例中将在nginx.conf
中添加一些配置项来自己编写模块进行解析。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
location = / {
root html;
index index.html index.htm;
}
location = /zxtest{
test_str "zhangxiaoha";
test_num 23;
test_flag off;
test_size 10k;
mytest;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
我们希望通过自己模块将配置项中的参数保存到数据结构中,并通过访问localhost/zxtest
将内容显示到浏览器上。
1.数据结构 |
用一个结构体来包含所有我们感兴趣的参数,上述配置文件中,有4个带配置项值的配置项,因此我们的结构体与之对应:
typedef struct{
ngx_str_t my_str;
ngx_int_t my_num;
ngx_flag_t my_flag;
size_t my_size;
}ngx_http_mytest_conf_t;
在陶辉老师的《深入理解Nginx》一书中为了说明14种预设配置项的解析方法,因此在结构体中包含了14个成员,我为了简单起见,就用了4个。
2.预设的配置项解析方法 |
配置项解析方法通过ngx_command_t中的char *(*set)(ngx_conf_t *cf,ngx_command_t*cmd,void *conf)
回调成员设置,关于ngx_command_t结构的详细声明见core/ngx_conf_file.h
。
Nginx有14种预设的配置项解析方式:
(1)ngx_conf_set_flag_slot
配置项的参数是on或者off,当为on时结构体中对应变量被设置为1,否则被设置为0。
本例中,我们希望在nginx.conf中有一个配置项的名称为test_flag
,并且它后面携带的参数是on或者off,
那么我们可以使用生成的ngx_http_mytest_conf_t结构体中的以下成员保存:
ngx_flag_t my_flag;
当test_flag
配置项的值为on时,结构体中my_flag的值将设置为1
(2)ngx_conf_set_str_slot
用来设置