zoukankan      html  css  js  c++  java
  • 简单的HTTP过滤模块

    简单的HTTP过滤模块

    一、Nginx的HTTP过滤模块特征

      一个请求可以被任意个HTTP模块处理

      在普通HTTP模块处理请求完毕并调用ngx_http_send_header()发送HTTP头部或调用ngx_http_output_filter()发送HTTP包体时,才会由这两个方法一次调用所有的HTTP过滤模块来处理这个请求。HTTP过滤模块仅处理服务器发送到客户端的响应,而不处理客户端发往服务器的HTTP请求。

      多个过滤模块的顺序的形成以及Nginx自带的过滤模块请参考原书。

    二、编写一个HTTP过滤模块

       以向返回给用户的文本格式响应包体前加一段字符串"[my filter prefix]"为例,展示如何编写一个HTTP过滤模块。源代码来自于《深入理解Nginx》。

    1.config文件的编写

      与前几篇博文的HTTP模块不同,HTTP过滤模块需要HTTP_FILTER_MODULES一项以把所有过滤模块一同编译,因此config写作:

    复制代码
    ngx_addon_name=ngx_http_myfilter_module
    HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES ngx_http_myfilter_module"
    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_myfilter_module.c"
    复制代码

      进行configure时,--add-module=PATH是一样的。

    2.编写模块基本内容:模块定义、配置项处理

      由于需要在nginx.conf中加入一项flag类型的add_fix来控制这个过滤模块的使用与否,与这个配置项处理相关的ngx_http_myfilter_create_conf()、ngx_http_myfilter_merge_conf()、ngx_http_mytest_commands[]需要对应地进行处理。

    复制代码
    typedef struct {
        ngx_flag_t enable;
    } ngx_http_myfilter_conf_t;
    
    typedef struct {
        ngx_int_t add_prefix;
    } ngx_http_myfilter_ctx_t;
    复制代码
    复制代码
     ngx_http_myfilter_create_conf()
    复制代码
    复制代码
     ngx_http_myfilter_merge_conf
    复制代码
    复制代码
     ngx_http_mytest_commands[]
    复制代码

      这样之后才是模块的上下文和模块定义:

    复制代码
     ngx_http_myfilter_module_ctx
    复制代码
    复制代码
     ngx_http_myfilter_module
    复制代码

      从模块上下文可以看出,过滤功能在模块完成配置项处理后开始,其初始化方法为ngx_myfilter_init()。

    3.过滤功能实现

      初始化方法ngx_myfilter_init()的功能仅仅是把当前过滤模块插入Nginx所有过滤模块的链表中。

    复制代码
     ngx_int_t ngx_http_myfilter_init()
    复制代码

      头部处理方法是为了确定返回的类型是否为text/plain。如果是,则包体处理方法需要添加前缀。这里把前缀硬编码至模块源码中。

    复制代码
     ngx_http_myfilter_header_filter()
    复制代码

      包体处理方法根据头部处理方法的结果来为包体添加前缀。

    复制代码
     ngx_http_myfilter_body_filter()
    复制代码

    三、过滤模块测试

      根据原作者编写的nginx.conf

    复制代码
        server {
            listen 8080;
    
            location / {
                root /;
                add_prefix on;
            }
        }
    复制代码

    可以看出,需要在/目录下(系统根目录)添加一个或多个任意内容的文本文件来进行测试。我写了一个内容为test的文本文件test.txt,并放在。

      输入curl http://localhost:8080/test.txt,可以看到返回的内容是[my filter prefix]test。

      当然,如果你放在/的不是纯文本文件,而是html文件或者其他类型文件,是不会增加这个前缀的。

      另外,把on改成off,你会发现前缀不再出现,说明过滤模块功能已经关闭。

      p.s.此书的后续章节是源码分析,实践环节比较少,“《深入理解Nginx》阅读与实践”系列可能到此为止。


    作者:五岳 
    出处:http://www.cnblogs.com/wuyuegb2312 
    对于标题未标注为“转载”的文章均为原创,其版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
     
    分类: nginx网络编程
    标签: nginx
  • 相关阅读:
    SynchronousQueue 的联想
    Spring Cache
    CSUOJ 1011 Counting Pixels
    CSUOJ 1973 给自己出题的小X DFS
    CSUOJ 1726 你经历过绝望吗?两次!BFS+优先队列
    CSUOJ 1900 锋芒不露
    CSUOJ 1808 地铁
    CSUOJ 1895 Apache is late again
    CSUOJ 1781 阶乘除法
    CSUOJ 1560 图书管理员的表白方式
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3273262.html
Copyright © 2011-2022 走看看