HTTP协议的结构_第1页
HTTP协议的结构_第2页
HTTP协议的结构_第3页
HTTP协议的结构_第4页
HTTP协议的结构_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、HTTP协议的结构2004-11-08 09:18:54     我来说两句       收藏    我要投稿 Internet是由各个协议连接起来的,而我们现在使用最广的莫过于HTTP协议了,也就是超文本传输协议,与FTP(文件传输协议)不同,由于主要用于超文本传输,因此HTTP协议显得更简单一点。今天我们来介绍一下HTTP协议的基本格式。在这里,我们所谈及的HTTP协议以HTTP/1.1为标准,并且使用Net Vampire Pro 4.0来取得与HTTP服务器的通信Log,您也可

2、以使用其它的HTTP下载工具来取得通信Log。在HTTP协议中,服务端是指提供HTTP服务的部分,客户端是指你使用的浏览器或者下载工具等等。在通讯时,由客户端发出请求连接,服务端建立连接;然后,客户端发出HTTP请求(Request),服务端返回响应信息(Respond),由此完成一个HTTP操作。我们来通过一个例子来了解这个过程:(以下是Net Vampire进行的一次连接,以下红色字体为作者添加)P 01-5-26 16:10:43 Connecting to . /连接服务器P 01-5-26 16:10:44 Connected to 48 /解析IP地址,以下为

3、HTTP操作S 01-5-26 16:10:44 GET /minift/epretty/pretty.zip HTTP/1.1 /请求行(Request Line),表示使用GET方式取得文件,使用HTTP/1.1协议 /以下为请求头部(Request Head)S 01-5-26 16:10:44 Connection: close /表示非持续性连接S 01-5-26 16:10:44 Host: /主机名称S 01-5-26 16:10:44 Accept: */* /接受的数据类型S 01-5-26 16:10:44 Pragma: no-cache /参数(与以前的服务器兼容)S

4、01-5-26 16:10:44 Cache-Control: no-cache /不使用缓存S 01-5-26 16:10:44 Referer: /从该网址转来S 01-5-26 16:10:44 User-Agent: Mozilla/4.04 en (Win95; I ;Nav)/客户端标识S 01-5-26 16:10:44 Cookie: AdId=ACDDAAAAAAAS 01-5-26 16:10:44 /以下为RespondR 01-5-26 16:10:47 HTTP/1.0 200 OK /响应行(Respond Line),服务器使用HTTP/1.0协议,状态值(Sta

5、tus Code)为200,状态为OK,表示文件可以读取R 01-5-26 16:10:47 Date: Sat, 26 May 2001 08:15:54 GMT /现在的时间,用格林威治时间表示R 01-5-26 16:10:47 Server: Apache/1.3.14 (Unix) mod_layout/2.9.9 /服务器类型R 01-5-26 16:10:47 Last-Modified: Fri, 04 May 2001 02:42:56 GMT /文件最后更新时间R 01-5-26 16:10:47 ETag: "e614cf-37965-3af21730"

6、;R 01-5-26 16:10:47 Accept-Ranges: bytes /接受的范围单位R 01-5-26 16:10:47 Content-Length: 227685 /文件长度 R 01-5-26 16:10:47 Content-Type: application/zip /MIME类型R 01-5-26 16:10:47 X-Cache: MISS from shca8R 01-5-26 16:10:47 X-Cache-Lookup: MISS from shca8:80R 01-5-26 16:10:47 Connection: close /表示文件传输完毕就关闭连接

7、。R 01-5-26 16:10:47 /以下为文件传输P 01-5-26 16:10:47 Data transfer started 下面来讲解使用的格式(LRCF=1310,即回车,SP=SPACE,即空格)Request:协议方式 SP 文件URI SP 协议版本 LRCF (请求行)(以下为头部)头部类型 : 头部值 LRCF头部类型 : 头部值 LRCF头部类型 : 头部值 LRCF. LRCF 表示头部结束(如果有体部,以下为体部)Respond:协议版本 SP 状态值 SP 状态描述 LRCF (响应行)(以下为头部)头部类型 : 头部值 LRCF头部类型 : 头部值 LRCF

8、头部类型 : 头部值 LRCF. LRCF 表示头部结束(如果有体部,以下为体部)由上可见,请求与相应的格式只有部分不同,是很容易理解的,现在你应该基本了解HTTP协议了吧,也能看懂那些通信Log了吧,下一次我们讲专门讲解在响应行中的状态值含义及一些特殊情况。 3.1如何调用HTTP模块2013-03-27 12:03 陶辉 机械工业出版社 字号:T | T深入理解Nginx:模块开发与架构解析第3章开发一个简单的HTTP模块,本章讲述了如何开发一个基本的HTTP模块,这里除了获取请求的包体外没有涉及异步处理问题。本节为大家介绍。 AD: 51CTO学院:IT精品课程在线看! 第二部分 如何编

9、写HTTP模块本部分内容第3章开发一个简单的HTTP模块第4章配置、error日志和请求上下文第5章访问第三方服务第6章开发一个简单的HTTP过滤模块第7章Nginx提供的高级数据结构第3章开发一个简单的HTTP模块当通过开发HTTP模块来实现产品功能时,是可以完全享用Nginx的优秀设计所带来的、与官方模块相同的高并发特性的。不过,如何开发一个充满异步调用、无阻塞的HTTP模块呢?首先,需要把程序嵌入到Nginx中,也就是说,最终编译出的二进制程序Nginx要包含我们的代码(见3.3节);其次,这个全新的HTTP模块要能介入到HTTP请求的处理流程中(具体参见3.1节、3.4节、3.5节)。

10、满足上述两个前提后,我们的模块才能开始处理HTTP请求,但在开始处理请求前还需要先了解一些Nginx框架定义的数据结构(见3.2节),这是后面必须要用到的;正式处理请求时,还要可以获得Nginx框架接收、解析后的用户请求信息(见3.6节);业务执行完毕后,则要考虑发送响应给用户(见3.7节),包括将磁盘中的文件以HTTP包体的形式发送给用户(见3.8节)。本章最后会讨论如何用C+语言来编写HTTP模块,这虽然不是Nginx官方倡导的方式,但C+向前兼容C语言,使用C+语言开发的模块还是可以很容易地嵌入到Nginx中。本章不会深入探讨HTTP模块与Nginx的各个核心模块是如何配合工作的,而且这

11、部分提到的每个接口将只涉及用法而不涉及实现原理,在第3部分我们才会进一步阐述本章提到的许多接口是如何实现异步访问的。3.1如何调用HTTP模块在开发HTTP模块前,首先需要了解典型的HTTP模块是如何介入Nginx处理用户请求流程的。图3-1是一个简化的时序图,这里省略了许多异步调用,忽略了多个不同的HTTP处理阶段,仅标识了在一个典型请求的处理过程中主要模块被调用的流程,以此帮助读者理解HTTP模块如何处理用户请求。完整的流程将在第11章中详细介绍。从图3-1中看到,worker进程会在一个for循环语句里反复调用事件模块检测网络事件。当事件模块检测到某个客户端发起的TCP请求时(接收到SY

12、N包),将会为它建立TCP连接,成功建立连接后根据nginx.conf文件中的配置会交由HTTP框架处理。HTTP框架会试图接收完整的HTTP头部,并在接收到完整的HTTP头部后将请求分发到具体的HTTP模块中处理。这种分发策略是多样化的,其中最常见的是根据请求的URI和nginx.conf里location配置项的匹配度来决定如何分发(本章的例子正是应用这种分发策略,在第10章中会介绍其他分发策略)。HTTP模块在处理请求的结束时,大多会向客户端发送响应,此时会自动地依次调用所有的HTTP过滤模块,每个过滤模块可以根据配置文件决定自己的行为。例如,gzip过滤模块根据配置文件中的gzip o

13、n|off来决定是否压缩响应。HTTP处理模块在返回时会将控制权交还给HTTP框架,如果在返回前设置了subrequest,那么HTTP框架还会继续异步地调用适合的HTTP模块处理子请求。开发HTTP模块时,首先要注意的就是HTTP框架到具体的HTTP模块间数据流的传递,以及开发的HTTP模块如何与诸多的过滤模块协同工作(第10章、第11章会详细介绍HTTP框架)。下面正式进入HTTP模块的开发环节。 【责任编辑:b深入理解Nginx:模块开发与架构解析第3章开发一个简单的HTTP模块,本章讲述了如何开发一个基本的HTTP模块,这里除了获取请求的包体外没有涉及异步处理问题。本节为大家

14、介绍定义自己的HTTP模块。 3.4HTTP模块的数据结构(1)定义HTTP模块方式很简单,例如:1. ngx_module_t ngx_http_mytest_module; 其中,ngx_module_t 是一个Nginx模块的数据结构(详见8.2节)。下面来分析一下Nginx模块中所有的成员,如下所示:1. typedef struct ngx_module_s      ngx_module_t;  2. struct ngx_module_s   

15、;3.     /* 下面的ctx_index、index、spare0、spare1、spare2、spare3、version变量不需要在定义时赋值,可以用Nginx准备好的宏NGX_MODULE_V1来定义,它已经定义好了这7个值。  4. #define NGX_MODULE_V1          0, 0, 0, 0, 0, 0, 1  5. &

16、#160;6.     对于一类模块(由下面的type成员决定类别)而言,ctx_index表示当前模块在这类模块中的序号。这个成员常常是由管理这类模块的一个Nginx核心模块设置的,对于所有的HTTP模块而言,ctx_index是由核心模块ngx_http_module设置的。ctx_index非常重要,Nginx的模块化设计非常依赖于各个模块的顺序,它们既用于表达优先级,也用于表明每个模块的位置,借以帮助Nginx框架快速获得某个模块的数据(HTTP框架设置ctx_index的过程参见10.7节)*/  7.   

17、60; ngx_uint_t            ctx_index;  8.  9.     /*index表示当前模块在ngx_modules数组中的序号。注意,ctx_index表示的是当前模块在一类模块中的序号,而index表示当前模块在所有模块中的序号,它同样关键。Nginx启动时会根据ngx_modules数组设置各模块的index值。例如:  10. ngx_max_module&

18、#160;= 0;  11. for (i = 0; ngx_modulesi; i+)   12.     ngx_modulesi->index = ngx_max_module+;  13.  14. */  15.     ngx_uint_t          &

19、#160; index;  16.  17.     /spare系列的保留变量,暂未使用  18.     ngx_uint_t            spare0;  19.     ngx_uint_t        

20、60;   spare1;  20.     ngx_uint_t            spare2;  21.     ngx_uint_t            spare3;  22.   &

21、#160; /模块的版本,便于将来的扩展。目前只有一种,默认为1  23.     ngx_uint_t            version;  24.  25.     /*ctx用于指向一类模块的上下文结构体,为什么需要ctx呢?因为前面说过,Nginx模块有许多种类,不同类模块之间的功能差别很大。例如,事件类型的模块主要处理I/O事件相关的功能,HT

22、TP类型的模块主要处理HTTP应用层的功能。这样,每个模块都有了自己的特性,而ctx将会指向特定类型模块的公共接口。例如,在HTTP模块中,ctx需要指向ngx_http_module_t结构体*/  26.     void                 *ctx;  27.  28.     /commands将

23、处理nginx.conf中的配置项,详见第4章  29.     ngx_command_t        *commands;  30.  31.     /*type表示该模块的类型,它与ctx指针是紧密相关的。在官方Nginx中,它的取值范围是以下5种:NGX_HTTP_MODULE、NGX_CORE_MODULE、NGX_CONF_MODULE、NGX_EVENT_MODULE、NGX_MAIL_M

24、ODULE。这5种模块间的关系参考图8-2。实际上,还可以自定义新的模块类型*/  32.     ngx_uint_t            type;  33.  34.     /*在Nginx的启动、停止过程中,以下7个函数指针表示有7个执行点会分别调用这7种方法(参见8.4节8.6节)。对于任一个方法而言,如果不需要Nginx在某个时刻执行它,那么简单地把它

25、设为NULL空指针即可*/  35.  36.     /*虽然从字面上理解应当在master进程启动时回调init_master,但到目前为止,框架代码从来不会调用它,因此,可将init_master设为NULL */  37.     ngx_int_t           (*init_master)(ngx_log_t *log);  38

26、.     /*init_module回调方法在初始化所有模块时被调用。在master/worker模式下,这个阶段将在启动worker子进程前完成*/  39.     ngx_int_t           (*init_module)(ngx_cycle_t *cycle);  40. /* init_process回调方法在正常服务前被调用。在master/w

27、orker模式下,多个worker子进程已经产生,在每个worker进程的初始化过程会调用所有模块的init_process函数*/  41.     ngx_int_t           (*init_process)(ngx_cycle_t *cycle);  42. /* 由于Nginx暂不支持多线程模式,所以init_thread在框架代码中没有被调用过,设为NULL*/  43. &#

28、160;   ngx_int_t           (*init_thread)(ngx_cycle_t *cycle);  44. / 同上,exit_thread也不支持,设为NULL  45.     void             

29、60;  (*exit_thread)(ngx_cycle_t *cycle);  46. /* exit_process回调方法在服务停止前调用。在master/worker模式下,worker进程会在退出前调用它*/  47.     void                (*exit_process)(ngx_cycle_t

30、60;*cycle);  48. / exit_master回调方法将在master进程退出前被调用  49.     void                (*exit_master)(ngx_cycle_t *cycle);  50.  51.     /*以下8个spare_hook变量也是

31、保留字段,目前没有使用,但可用Nginx提供的NGX_MODULE_V1_PADDING宏来填充。看一下该宏的定义:#define NGX_MODULE_V1_PADDING  0, 0, 0, 0, 0, 0, 0, 0*/  52.     uintptr_t             spare_hook0; &#

32、160;53.     uintptr_t             spare_hook1;  54.     uintptr_t             spare_hook2;  55.     

33、uintptr_t             spare_hook3;  56.     uintptr_t             spare_hook4;  57.     uintptr_t    

34、;         spare_hook5;  58.     uintptr_t             spare_hook6;  59.     uintptr_t         &

35、#160;   spare_hook7;  60. ; 定义一个HTTP模块时,务必把type字段设为NGX_HTTP_MODULE。对于下列回调方法:init_module、init_process、exit_process、exit_master,调用它们的是Nginx的框架代码。换句话说,这4个回调方法与HTTP框架无关,即使nginx.conf中没有配置http .这种开启HTTP功能的配置项,这些回调方法仍然会被调用。因此,通常开发HTTP模块时都把它们设为NULL空指针。这样,当Nginx不作为Web服务器使用时,不会执行HTTP模

36、块的任何代码。定义HTTP模块时,最重要的是要设置ctx和commands这两个成员。对于HTTP类型的模块来说,ngx_module_t中的ctx指针必须指向ngx_http_module_t接口(HTTP框架的要求)。下面先来分析ngx_http_module_t结构体的成员。 3.4HTTP模块的数据结构(2)HTTP框架在读取、重载配置文件时定义了由ngx_http_module_t接口描述的8个阶段,HTTP框架在启动过程中会在每个阶段中调用ngx_http_module_t中相应的方法。当然,如果ngx_http_module_t中的某个回调方法设为NULL空指针,那么H

37、TTP框架是不会调用它的。 1. typedef struct   2.     /解析配置文件前调用  3.     ngx_int_t   (*preconfiguration)(ngx_conf_t *cf);  4.     /完成配置文件的解析后调用  5.     ngx_int_t   

38、;(*postconfiguration)(ngx_conf_t *cf);  6.  7.     /*当需要创建数据结构用于存储main级别(直属于http.块的配置项)的全局配置项时,可以通过create_main_conf回调方法创建存储全局配置项的结构体*/  8.     void       *(*create_main_conf)(ngx_conf_t *cf);  9.

39、     /常用于初始化main级别配置项  10.     char       *(*init_main_conf)(ngx_conf_t *cf, void *conf);  11.  12.     /*当需要创建数据结构用于存储srv级别(直属于虚拟主机server.块的配置项)的配置项时,可以通过实现create_srv_conf回调方

40、法创建存储srv级别配置项的结构体*/  13.     void       *(*create_srv_conf)(ngx_conf_t *cf);  14.     / merge_srv_conf回调方法主要用于合并main级别和srv级别下的同名配置项  15.     char      

41、; *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf);  16.  17.     /*当需要创建数据结构用于存储loc级别(直属于location.块的配置项)的配置项时,可以实现create_loc_conf回调方法*/  18.     void       *(*create_loc

42、_conf)(ngx_conf_t *cf);  19.     / merge_loc_conf回调方法主要用于合并srv级别和loc级别下的同名配置项  20.     char       *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);  21.  ngx_ht

43、tp_module_t; 不过,这8个阶段的调用顺序与上述定义的顺序是不同的。在Nginx启动过程中,HTTP框架调用这些回调方法的实际顺序有可能是这样的(与nginx.conf配置项有关):1)create_main_conf2)create_srv_conf3)create_loc_conf4)preconfiguration5)init_main_conf6)merge_srv_conf7)merge_loc_conf8)postconfigurationcommands数组用于定义模块的配置文件参数,每一个数组元素都是ngx_command_t类型,数组的结尾用ngx_nul

44、l_command表示。Nginx在解析配置文件中的一个配置项时首先会遍历所有的模块,对于每一个模块而言,即通过遍历commands数组进行,另外,在数组中检查到ngx_null_command时,会停止使用当前模块解析该配置项。每一个ngx_command_t结构体定义了自己感兴趣的一个配置项: 1. typedef struct ngx_command_s     ngx_command_t;  2. struct ngx_command_s   3.  

45、60;  /配置项名称,如"gzip"  4.     ngx_str_t             name;  5.     /*配置项类型,type将指定配置项可以出现的位置。例如,出现在server或location中,以及它可以携带的参数个数*/  6.     ngx_

46、uint_t            type;  7.     /出现了name中指定的配置项后,将会调用set方法处理配置项的参数  8.     char               *(*set)(ngx_conf_t

47、60;*cf, ngx_command_t *cmd, void *conf);  9.     /在配置文件中的偏移量  10.     ngx_uint_t            conf;  11.     /*通常用于使用预设的解析方法解析配置项,这是配置模块的一个优秀设计。它需要

48、与conf配合使用,在第4章中详细介绍*/  12.     ngx_uint_t            offset;  13.     /配置项读取后的处理方法,必须是ngx_conf_post_t结构的指针  14.     void       

49、60;         *post;  15. ;  16. ngx_null_command只是一个空的ngx_command_t,如下所示:  17. #define ngx_null_command   ngx_null_string, 0, NULL, 0, 0, NULL  3.5定义自己的HTTP模块(1)上文中我们了解了定义HTTP模块时需要定义哪些成员

50、以及实现哪些方法,但在定义HTTP模块前,首先需要确定自定义的模块应当在什么样的场景下开始处理用户请求,也就是说,先要弄清楚我们的模块是如何介入到Nginx处理用户请求的流程中的。从2.4节中的HTTP配置项意义可知,一个HTTP请求会被许多个配置项控制,实际上这是因为一个HTTP请求可以被许多个HTTP模块同时处理。这样一来,肯定会有一个先后问题,也就是说,谁先处理请求谁的“权力”就更大。例如,ngx_http_access_module模块的deny选项一旦得到满足后,Nginx就会决定拒绝来自某个IP的请求,后面的诸如root这种访问静态文件的处理方式是得不到执行的。另外,由于同一个配置

51、项可以从属于许多个server、location配置块,那么这个配置项将会针对不同的请求起作用。因此,现在面临的问题是,我们希望自己的模块在哪个时刻开始处理请求?是希望自己的模块对到达Nginx的所有请求都起作用,还是希望只对某一类请求(如URI匹配了location后表达式的请求)起作用?Nginx的HTTP框架定义了非常多的用法,我们有很大的自由来定义自己的模块如何介入HTTP请求的处理,但本章只想说明最简单、最常见的HTTP模块应当如何编写,因此,我们这样定义第一个HTTP模块介入Nginx的方式:1)不希望模块对所有的HTTP请求起作用。2)在nginx.conf文件中的http、se

52、rver或者location块内定义mytest配置项,如果一个用户请求通过主机域名、URI等匹配上了相应的配置块,而这个配置块下又具有mytest配置项,那么希望mytest模块开始处理请求。在这种介入方式下,模块处理请求的顺序是固定的,即必须在HTTP框架定义的NGX_HTTP_CONTENT_PHASE阶段开始处理请求,具体内容下文详述。下面开始按照这种方式定义mytest模块。首先,定义mytest配置项的处理。从上文中关于ngx_command_t结构的说明来看,只需要定义一个ngx_command_t数组,并设置在出现mytest配置后的解析方法由ngx_http_mytest“担

53、当”,如下所示:1. static ngx_command_t  ngx_http_mytest_commands =   2.  3.      ngx_string("mytest"),  4. NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_NOARGS,  5.     &#

54、160; ngx_http_mytest,  6.       NGX_HTTP_LOC_CONF_OFFSET,  7.       0,  8.       NULL ,  9.  10.       ngx_null_command  11. ; 其中,ngx_h

55、ttp_mytest是ngx_command_t结构体中的set成员(完整定义为char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);),当在某个配置块中出现mytest配置项时,Nginx将会调用ngx_http_mytest方法。下面看一下如何实现ngx_http_mytest方法。1. static char *  2. ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *con

56、f)  3.  4.     ngx_http_core_loc_conf_t  *clcf;  5.  6.     /*首先找到mytest配置项所属的配置块,clcf看上去像是location块内的数据结构,其实不然,它可以是main、srv或者loc级别配置项,也就是说,在每个http和server内也都有一个ngx_http_core_loc_conf_t结构体*/  7.     clcf

57、60;= ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);  8.  9.     /*HTTP框架在处理用户请求进行到NGX_HTTP_CONTENT_PHASE阶段时,如果请求的主机域名、URI与mytest配置项所在的配置块相匹配,就将调用我们实现的ngx_http_mytest_handler方法处理这个请求*/  10.     clcf->handler = 

58、;ngx_http_mytest_handler;  11.  12.     return NGX_CONF_OK;  13.  当Nginx接收完HTTP请求的头部信息时,就会调用HTTP框架处理请求,另外在11.6节描述的NGX_HTTP_CONTENT_PHASE阶段将有可能调用mytest模块处理请求。在ngx_http_mytest方法中,我们定义了请求的处理方法为ngx_http_mytest_handler,举个例子来说,如果用户的请求URI是/test/example,而在配置文件中有这

59、样的location块: 1. Location /test   2.     mytest;  3.  那么,HTTP框架在NGX_HTTP_CONTENT_PHASE阶段就会调用到我们实现的ngx_http_mytest_handler方法来处理这个用户请求。事实上,HTTP框架共定义了11个阶段(第三方HTTP模块只能介入其中的7个阶段处理请求,详见10.6节),本章只关注NGX_HTTP_CONTENT_PHASE处理阶段,多数HTTP模块都在此阶段实现相关功能。下面简单说明一下这11个

60、阶段。1. typedef enum   2.     /在接收到完整的HTTP头部后处理的HTTP阶段  3.     NGX_HTTP_POST_READ_PHASE = 0,  4.  5.     /*在还没有查询到URI匹配的location前,这时rewrite重写URL也作为一个独立的HTTP阶段*/  6.     NGX_HTTP

61、_SERVER_REWRITE_PHASE,  7.  8.     /*根据URI寻找匹配的location,这个阶段通常由ngx_http_core_module模块实现,不建议其他HTTP模块重新定义这一阶段的行为*/  9.     NGX_HTTP_FIND_CONFIG_PHASE,  10.  11.     /*在NGX_HTTP_FIND_CONFIG_PHASE阶段之后重写URL的意义与NGX_HTTP_S

62、ERVER_REWRITE_PHASE阶段显然是不同的,因为这两者会导致查找到不同的location块(location是与URI进行匹配的)*/  12.     NGX_HTTP_REWRITE_PHASE,  13.  14.     /*这一阶段是用于在rewrite重写URL后重新跳到NGX_HTTP_FIND_CONFIG_PHASE阶段,找到与新的URI匹配的location。所以,这一阶段是无法由第三方HTTP模块处理的,而仅由ngx_http_core_module模

63、块使用*/  15.     NGX_HTTP_POST_REWRITE_PHASE,  16.  17.     /处理NGX_HTTP_ACCESS_PHASE阶段前,HTTP模块可以介入的处理阶段  18.     NGX_HTTP_PREACCESS_PHASE,  19.  20.     /*这个阶段用于让HTTP模块判断是否允许这个请求访问Nginx服务器 

64、60;21.     NGX_HTTP_ACCESS_PHASE,  22.  23.     /*当NGX_HTTP_ACCESS_PHASE阶段中HTTP模块的handler处理方法返回不允许访问的错误码时(实际是NGX_HTTP_FORBIDDEN或者NGX_HTTP_UNAUTHORIZED),这个阶段将负责构造拒绝服务的用户响应。所以,这个阶段实际上用于给NGX_HTTP_ACCESS_PHASE阶段收尾*/  24.     NGX_

65、HTTP_POST_ACCESS_PHASE,  25.  26.     /*这个阶段完全是为了try_files配置项而设立的。当HTTP请求访问静态文件资源时,try_files配置项可以使这个请求顺序地访问多个静态文件资源,如果某一次访问失败,则继续访问try_files中指定的下一个静态资源。另外,这个功能完全是在NGX_HTTP_TRY_FILES_PHASE阶段中实现的*/  27.     NGX_HTTP_TRY_FILES_PHASE,  28. 

66、0;29.     /用于处理HTTP请求内容的阶段,这是大部分HTTP模块最喜欢介入的阶段  30.     NGX_HTTP_CONTENT_PHASE,  31.  32.     /*处理完请求后记录日志的阶段。例如,ngx_http_log_module模块就在这个阶段中加入了一个handler处理方法,使得每个HTTP请求处理完毕后会记录access_log日志*/  33.     

67、NGX_HTTP_LOG_PHASE  34.  ngx_http_phases; 3.5定义自己的HTTP模块(2)当然,用户可以在以上11个阶段中任意选择一个阶段让mytest模块介入,但这需要学习完第10章、第11章的内容,完全熟悉了HTTP框架的处理流程后才可以做到。暂且不管如何实现处理请求的ngx_http_mytest_handler方法,如果没有什么工作是必须在HTTP框架初始化时完成的,那就不必实现ngx_http_module_t的8个回调方法,可以像下面这样定义ngx_http_module_t接口。1. static ngx_htt

68、p_module_t  ngx_http_mytest_module_ctx =   2.     NULL,                       /* preconfiguration */  3.    &#

69、160;NULL,                   /* postconfiguration */  4.  5.     NULL,                

70、       /* create main configuration */  6.     NULL,                       /* init main co

71、nfiguration */  7.  8.     NULL,                       /* create server configuration */  9.     NULL,

72、60;                      /* merge server configuration */  10.  11.     NULL,          

73、60;        /* create location configuration */  12.     NULL                    /* merge location co

74、nfiguration */  13. ; 最后,定义mytest模块:1. ngx_module_t  ngx_http_mytest_module =   2.     NGX_MODULE_V1,  3.     &ngx_http_mytest_module_ctx,           /* module context */  4.     ngx_http_mytest_comma

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论