nginx c语言模块开发

看了几篇相关模块,总感觉没有将清楚,这里整理一下思路,希望给同行一些帮助。

1. 编译安装nginx
cd /usr/local
wget http://nginx.org/download/nginx-1.12.1.tar.gz
tar zxf nginx-1.0.0.tar.gz
cd nginx-1.12.1
./configure --prefix=/usr/local/nginx
make&make install

2. 创建模块插件目录
一个 nginx module 一般都以个文件夹的方式存在,module源文件和该module的配置文件都在这个文件下面。
mkdir ngx_module_test
cd ngx_module_test

3. 编写模块配置文件
vi config
以下为文件内容:
ngx_addon_name=ngx_module_test
HTTP_MODULES="$HTTP_MODULES ngx_module_test"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_module_test.c"

注: 
ngx_addon_name: 给你的模块取个名字
HTTP_MODULES: 配置HTTP_MODULES变量,HTTP module,后面的名字与第一个行保存一致
NGX_ADDON_SRCS: module的源文件路径,$ngx_addon_dir 这个变量是 nginx 的内置脚本的内置变量,代表了这个 module 的文件夹的绝对路径,这里就是 /usr/local/nginx-1.12.1/ngx_module_test

4. 编写源码文件
这里的文件名和路径必须与上面 config 文件中的一致
vi ngx_module_test.c

代码主要流程:
  1)nginx 会生成一个 ngx_modules.c 文件,该文件里会引用 ngx_module_t 结构体变量(ngx_module_test),变量名称与配置文件的 ngx_addon_name 变量相同,所以必须保持一致。
     在执行 ./configure 完后,在nginx-1.12.1源码的根目录会多出来一个文件夹objs,在这里可以找到ngx_modules.c文件。
  2)在 ngx_module_t 结构体变量(ngx_module_test)中指定 ngx_command_t 结构体数组(ngx_module_test_commands)
     ngx_command_t 是一个数组,说明一个nginx模块中可以定义多个指令
  3)在 ngx_command_t 结构体数组(ngx_module_test_commands)中指定入口回调函数(ngx_module_test_entry)
  4) 在入口回调函数(ngx_module_test_entry)指定消息处理回调函数
  5)编写消息处理函数

4.1) 定义 ngx_module_t 结构体的全局对象,对象名称为config指定的模块名称
    ngx_module_t ngx_module_test = {
            NGX_MODULE_V1,   
            &ngx_module_test_ctx,                                    //ctx,对于HTTP模块来说,ctx必须是 ngx_http_module_t 接口
            ngx_module_test_commands,                                //commands 结构体数组,因此在此之前需要定义该结构体
            //定义http模块时,必须设置成NGX_HTTP_MODULE
            NGX_HTTP_MODULE,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NGX_MODULE_V1_PADDING
    };


在 ngx_module_test 之前定义
    static ngx_http_module_t ngx_module_test_ctx = {
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL
    };
   注:全是NULL,没啥用?

    static ngx_command_t ngx_module_test_commands[] = {
            {
                    ngx_string("module_test"),                     // 命令名,与 nginx.conf 配置的 location 里面的模块名称一致
                    NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_NOARGS,
                    //set回调函数,
                    //char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
                    //当某个配置快中出现ngx_module_test时,就会回调此函数
                    ngx_module_test_entry,
                    NGX_HTTP_LOC_CONF_OFFSET,
                    0,
                    NULL
            },
            //空的ngx_command_t用于表示数组结束
            //#define ngx_null_command  { ngx_null_string, 0, NULL, 0, 0, NULL }
            ngx_null_command
    };


    //配置项对应的回调函数
    static char* ngx_module_test_entry(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
    {
        ngx_http_core_loc_conf_t *clcf;

        clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);

        //在NGX_HTTP_CONTENT_PHASE阶段会调用此回调函数
        clcf->handler = ngx_module_test_handler;

        return NGX_CONF_OK;
    }


4.2) 编写处理函数
    //实际完成处理的回调函数
    /*
     * r 是nginx已经处理完了的http请求头
     */
    static ngx_int_t ngx_module_test_handler(ngx_http_request_t *r)
    {
        return NGX_HTTP_NOT_ALLOWED;
    }

5. 配置 nginx.conf, 注意是运行目录(/usr/local/nginx)下的配置文件,而不是编译目录
在server里面,location / { ... } 后面增加:
location /test {
    module_test;
 }
# 注意,module_test 必须与ngx_command_t结构体里面定义的一致

6. 测试,用浏览器输入 http://xxx/test, 返回405
 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值