nginx之http模块配置项

常见的nginx配置文件大概如下:

http {
    include       mime.types;
    access_log  logs/access.log;
    gzip  on;

    server {
        listen      80;
        server_name www.test.com;

        location / {
           proxy_pass http://127.0.0.1:9001;
        }
    }
}

        基本可以概括为http{}配置块、server{}配置块以及location{}配置块,并且http{}块是包含server{}块和location{}块的,而server{}块又包含location{}块。而且这几个配置块中可能会出现相同的配置项,届时以哪个配置块下的配置为准,则由http模块自身决定。nginx对这几个不同级别的配置块也分别做了定义:

  • 直接隶属于http{}块内的配置项称为main配置项
  • 直接隶属于server{}块内的配置项称为srv配置项
  • 直接隶属于location{}块内的配置项称为loc配置项

        http框架对于上述配置项则是通过ngx_http_module_t接口中方法来管理的,看下ngx_http_module_t结构体定义:

typedef struct {
    ...
    #创建用于存储http全局配置项的结构体,该结构体成员将保存直属于http{}块的配置项参数,在解析main配置项前调用
    void *(*create_main_conf)(ngx_conf_t *cf);
    #解析main配置项后回调
    char *(*init_main_conf)(ngx_conf_t *cf, void *conf);
    #创建用于存储可同时出现在main、srv级别配置项的结构体,该结构体成员与servers配置相关联
    void *(*create_srv_conf)(ngx_conf_t *cf);
    #create_srv_conf()方法产生的结构体所要解析的配置项,可能同时出现在main和srv级别中,merge_srv_conf()方法
    #可以把出现在main级别中的配置项合并到srv级别配置项中
    char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf);
    #创建用于存储可同时出现在main、srv、loc级别配置项的结构体,该结构体成员与location配置相关联
    void *(*create_loc_conf)(ngx_conf_t *cf);
    #create_loc_conf()方法产生的结构体所要解析的配置项,可能同时出现在main、srv以及loc级别中,
    #merge_loc_conf()方法可以把分别出现在main级别和srv级别中的配置项合并到srv级别的配置项中
    char *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);
} ngx_http_module_t;

         可以看到ngx_http_module_t结构体完全就是围绕着配置项来的,每一个http模块都将根据mainsrvloc这些不同级别的配置项来决定自己的行为。

        当处理或解析http{}块内的main级别配置项时,将会分别调用create_main_conf()create_srv_conf()以及create_loc_conf()方法分别创建3个结构体,用于存储http全局配置项、server配置项以及location配置项。找到对应级别的配置项后,又如何获取各个配置项参数呢?这时就要看一个叫ngx_http_conf_ctx_t的结构体:

typedef struct {
	#指向一个指针数组,数组中的每个成员都是由所有http模块中的create_main_conf()方法创建的存放全局配置项的结构体,
    #它们存放着解析直属http{}块内的main{}级别的配置项参数
    void **main_conf;
    #指向一个指针数组,数组中的每个成员都是由所有http模块中的create_srv_conf()方法创建的与server相关的结构体,
    #它们或存放main级别配置项,或存放srv级别配置项,这与当前的ngx_http_conf_ctx_t是在解析http{}或者server{}块时创建的有关
    void **srv_conf;
    #指向一个指针数组,数组中的每个成员都是由所有http模块中的create_loc_conf()方法创建的与server相关的结构体,
    #它们或存放main级别配置项,或存放srv级别配置项、或loc级别配置项,这与当前的ngx_http_conf_ctx_t是在解析http{}、server{}或者location{}块时创建的有关
    void **loc_conf;
} ngx_http_conf_ctx_t;

        结构体ngx_http_conf_ctx_t只有三个成员,并分别指向三个指针数组。内存示意图如下:

        由于ngx_http_core_module模块是第一个http模块,它的ctx_index序号是0,因此数组中的第一个指针将指向由ngx_http_core_module模块生成的ngx_http_core_main_conf_t等结构体。同时我们也只需要知道序号ctx_index就可以获取main级别或其它级别下的配置结构体。

        这里补充介绍下ngx_cycle_t结构体,nginx框架是围绕ngx_cycle_t结构体来控制进程运行的,其中的prefixconf_prefixconf_file等字符串类型成员保存着nginx配置文件的路径,而nginx的可配置性完全依赖于nginx.conf文件,并且模块的可定制性、可伸缩性等诸多特性也依赖于nginx.conf文件。有了配置文件后,nginx框架就根据配置项来加载所有模块。

typedef struct ngx_cycle_s ngx_cycle_t;
struct ngx_cycle_s {
	#该成员保存着所有模块存储配置项的结构体的指针,首先是一个数组,每个数组成员又是一个指针,
    #这个指针又指向另外一个存储着指针的数组,所以会看到void ****
	void ****conf_ctx;
	...
}

        这里注释中说这个指针有指向的是另外一个指针数组,实际上也就是上图中提到的ngx_http_conf_ctx_t结构体中的三个成员。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值