nginx的filter调用
来源:互联网 发布:淘宝门 编辑:程序博客网 时间:2024/05/22 15:22
很早就该写这篇了,没想到一拖就是差不多半年。。。今天把它补上,不然的话,这部分的内容总是觉得差点什么。。。。
前面的文章已经说过了,在nginx对http的request处理完成后,会对每一个request都走一遍phase,最后真正向请求方发送返回则是调用filter来实现的。。。
首先来看filter的结构。。。。
在nginx中利用单链表将各种filter组织起来,首先在Ngx_http.c文件中定义了两个全局的变量,
ngx_int_t (*ngx_http_top_header_filter) (ngx_http_request_t *r);ngx_int_t (*ngx_http_top_body_filter) (ngx_http_request_t *r, ngx_chain_t *ch);这里也可以看到最终的filter也是分成两种类型的,分别是head和body的filter。。
顾名思义,header类型的filter用于处理返回的头部,body类型的filter则是用于处理返回的body。好了,接下来我们来看是如何将这些filter组织成链表结构的吧。。。。
Ngx_http_write_filter_module.c,它定义了一个body类型的filter,它的初始化函数如下:
static ngx_int_tngx_http_write_filter_init(ngx_conf_t *cf){ ngx_http_top_body_filter = ngx_http_write_filter; return NGX_OK;}这里,直接将全局的top_body_filter指向该模块中定义的函数。。。最后我们可以看到因为nfx_http_write_filter是最后调用的body类型的filter,所以它不用指向下一个调用的filter,、
接下来我们来看一个另外的filter,ngx_http_gzip_filter,在它的源文件中定义了两个static作用域的变量:
static ngx_http_output_header_filter_pt ngx_http_next_header_filter;static ngx_http_output_body_filter_pt ngx_http_next_body_filter;其实看名字就能够明白这两个变量是干嘛用的了吧。。。。
好了,接下来我们来看他的初始化函数吧:
static ngx_int_tngx_http_gzip_filter_init(ngx_conf_t *cf){ ngx_http_next_header_filter = ngx_http_top_header_filter; ngx_http_top_header_filter = ngx_http_gzip_header_filter; ngx_http_next_body_filter = ngx_http_top_body_filter; ngx_http_top_body_filter = ngx_http_gzip_body_filter; return NGX_OK;}嗯,其实很简单吧,最开始先用源文件中定义的static作用域的变量保存现在这个时刻的topfilter,接着更新top filter的值,让其指向当前定义的filter函数。。。。这样,当在下次调用当前定义的filter函数的时候,就可以利用next filter变量来执行下一个filter了,也就实现了filter的链式调用。。。
好了,filter的结构也就算差不多说的比较清楚了。。整个ngx的大体的框架也就弄的差不多了。。接下来就是涉及到一些细小的细节的实现了。。。。
- nginx的filter调用
- Filter的调用顺序
- nginx的filter的处理
- nginx的filter的处理
- nginx-filter
- Servlet Filter的调用顺序
- 点睛--filter的调用顺序
- DirectX--Filter属性页的调用
- Tomcat调用两次Filter的init()方法
- SpringSecurity的Filter链式调用机制
- Nginx的phase的调用
- Nginx filter 模块解析
- Nginx filter分析
- nginx 学习五 filter模块简介和实现一个简单的filter模块
- nginx header filter and body filter
- 调用filter中的函数
- web.xml中Servlet Filter的调用顺序
- Servlet、Filter 和 Listener 调用顺序、生命周期的实验分析
- 使用多线程还是用IO复用select/epoll?
- error: default argument given for parameter 2 默认的参数只能给一次
- VMWare虚拟机下网络设置
- Js apply 方法 详解
- printf("%d %d ",n,~n)^10&&main(n+2);
- nginx的filter调用
- extern "C"
- C语言宏定义实现闰年判断并输出指定月的天数
- 转载_keril中不能定义全局变量时初始化的原因
- fedora matlab下载安装
- Toast显示和关闭自个控制的方法
- 在Linux下编写异步I/O的模型探讨
- IOS/iphone开发文件操作
- ffmpeg和SDL教程(一)文件读取和保存