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 还需要发送包体。
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 还需要发送包体。
相关文章推荐
- Nginx编写HTTP模块:“Hello World”的第二种写法(HTTP模块介入阶段的2种方法)
- nginx 编写简单HTTP模块以及nginx http handler的hello world示例编写
- Nginx编写HTTP模块:第一个Nginx HTTP模块 “Hello World!”
- nginx 编写简单HTTP模块 hello world
- 解剖Nginx·模块开发篇(5)解读内置非默认模块 ngx_http_stub_status_module
- nginx模块学习——nginx_http_push_module模块深入讲解和聊天室实现
- 高性能Web服务器Nginx的配置与部署研究(9)核心模块之HTTP模块基本常用指令
- 高性能Web服务器Nginx的配置与部署研究(10)核心模块之HTTP模块Location相关指令
- Nginx服务器工作状态ngx_http_stub_status_module 模块
- 详细解释:nginx中ngx_http_auth_basic_module模块(HTTP Auth Basic 模块)配置及各个参数含义 .
- 解剖Nginx·模块开发篇(3)ngx_http_hello_world_module 模块的基本函数实现
- nginx 整合 ngx_http_accesskey_module 模块的应用
- Nginx的HTTP Access模块
- 详细解释:nginx中ngx_http_access_module模块(HTTP Access 模块)配置及各个参数含义
- 详细解释:nginx中ngx_http_access_module模块(HTTP Access 模块)配置及各个参数含义
- nginx模块学习——nginx_http_push_module模块深入讲解和聊天室实现
- nginx版本变化引起的自定义http模块的运行异常
- Nginx Http模块开发
- 高性能Web服务器Nginx的配置与部署研究(9)核心模块之HTTP模块基本常用指令
- 详细解释:nginx中ChsHttpProxyModule模块各项配置及其含义