您的位置:首页 > 理论基础 > 计算机网络

nginx HTTP模块的hello world

2014-08-13 21:36 323 查看
借这个hello world可以了解开发一个HTTP模块的流程

HTTP框架定义了11个处理阶段,此处我们的模块在NGX_HTTP_CONTENT_PHASE阶段。
比如定义个我们自己的HTTP模块。
ngx_module_t ngx_http_mytest_module;
这里ngx_module_t 是一个nginx模块的数据结构。该结构中最重要的就是ctx与commands这两个成员。
void * ctx;
ngx_command_t * commands;
ctx用于指向一类模块的上下文结构体,比如事件类型的模块、HTTP类型的模块。我们这里需要指向 ngx_http_module_t
commands将处理nginx.conf中的配置项。

HTTP框架在读取、重载配置文件时定义了由ngx_http_module_t接口描述的8个阶段,HTTP框架在启动过程中会在每个阶段中调用ngx_http_module_t中相应的方法。这个8个阶段比如:
1,在解析配置文件前调用,
2,完成配置文件的解析后调用,
3,当需要创建数据结构用于存储main级别的全局配置项时,等等阶段。

nginx在解析配置文件中的一个配置项时首先会遍历所有的模块,对于每一个模块而言,即通过遍历commands数组进行。
commands数组用于定义模块的配置文件参数,其元素是一个ngx_command_t的结构体,每个结构体定义了自己感兴趣的一个配置项。
这个结构体的成员有
ngx_str_t name; //配置项的名称,比如“gzip",
ngx_uint_t type;//配置项类型,type将制定配置项可以出现的位置,例如,出现在server{},或location {}中,
char * (*set)(ngx_conf_t * cf , ngx_command_t * cmd, void * conf); // 出现了name中制定的配置项后,将会调用set方法处理配置项的参数。
。。。

处理方法在set方法中。我们可以举个set的例子
static char * ngx_http_mytest(ngx_conf_t * cf, ngx_command_t * cmd, void * conf)
{
ngx_http_core_loc_confg_t * clcf;
// 首先找到mytest配置项所属的配重块
clcf = ngx_http_confg_get_module_loc_confg(cf, ngx_http_core_module);

//HTTP框架在处理用户请求进行到NGX_HTTP_CONTENT_PHASE阶段时,如果命中这个配重块,就将调用下面的ngx_http_mytest_handler方法处理这个请求
clcf-> handler = ngx_http_mytest_handler;
return NGX_CONF_OK;
}

如何处理用户请求呢?看下面
HTTP框架在接收完HTTP请求的头部后,会调用handler指向的方法,如下是handler成员的原型ngx_http_handler_ptr;
typedef ngx_int_t (*ngx_http_handler_pt) (ngx_http_request_t * r);
这个r参数就是请求中的参数,包括头部、get、post的内容。在ngx_http_mytest_handler的返回值中,如果是正常的HTTP返回码,nginx就会按照规范构造合法的响应包发送给用户。
除了这些正常的HTTP响应吗,nginx全局定义的几个错误码,
#defined NGX_ERROR -1 等等
最后我们还要调用ngx_http_output_filter向用户发送数据包,可以将ngx_http_output_filter的返回值作为ngx_http_mytest_handler方法的返回值使用。
在NGX_HTTP_CONTENT_PHASE阶段后,调用ngx_http_mytest_handler后,,HTTP框架会将ngx_http_mytest_handler的返回值作为参数传给ngx_http_finalize_request方法。

发送相应。
分两种,1,只发送HTTP头部; 2 还需要发送包体。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐