Nginx的请求上下文

2017-05-09  本文已影响0人  Spike_3154

Nginx的配置项

nginx 在每一个http 块, server 块, location 块下, 都会生成独立的数据结构用来存放配置项

使用Http配置

分配用于保存配置参数的数据结构

typedef struct { 
  ngx_str_t my_str; 
  ngx_int_t my_num; 
  ngx_flag_t my_flag; 
  size_t my_size; 
  ngx_array_t * my_str_array; 
  ngx_array_t * my_keyval; 
  off_t my_off; 
  ngx_msec_t my_msec; 
  time_t my_sec; 
  ngx_bufs_t my_bufs; 
  ngx_uint_t my_enum_seq; 
  ngx_uint_t my_bitmask; 
  ngx_uint_t my_access; 
  ngx_path_t * my_path; 
} ngx_http_mytest_conf_t; 

设定配置项的解析方式

nginx中,配置项主要通过ngx_command_t结构进行解析。


自定义配置项处理方法

 static char * ngx_conf_set_myconfig(ngx_conf_t * cf, ngx_command_t * cmd, void * conf);
static char* ngx_conf_set_myconfig(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    //注意,参数conf就是http框架传给我们的,在ngx_http_mytest_create_loc_conf
//回调方法中分配的结构体ngx_http_mytest_conf_t
    ngx_http_mytest_conf_t  *mycf = conf;

    // cf->args是1个ngx_array_t队列,它的成员都是ngx_str_t结构。
//我们用value指向ngx_array_t的elts内容,其中value[1]就是第1
//个参数,同理value[2]是第2个参数
    ngx_str_t* value = cf->args->elts;

    //ngx_array_t的nelts表示参数的个数
    if (cf->args->nelts > 1)
    {
        //直接赋值即可, ngx_str_t结构只是指针的传递
        mycf->my_config_str = value[1];
    }
    if (cf->args->nelts > 2)
    {
        //将字符串形式的第2个参数转为整型
        mycf->my_config_num = ngx_atoi(value[2].data, value[2].len);
        //如果字符串转化整型失败,将报"invalid number"错误,
//nginx启动失败
        if (mycf->my_config_num == NGX_ERROR)
        {
            return "invalid number";
        }
    }

    //返回成功
    return NGX_CONF_OK;
}

合并配置项

如果http{}, server{}, location{} 下面都出现了同名的配置项, 根据 merge_loc_conf(merge_srv_conf)进行合并, 如果他们被设置为 null, * 忽略上一级中的同名配置项 *

// cf 表示全局配置的设置, prev 表示父级配置结构体, void * conf 为当前配置结构体
char * (*merge_loc_conf)(ngx_conf_t * cf, void * prev, void * conf)

HTTP 配置模型

typedef struct {
    void ** main_conf;
    void ** srv_conf;
    void ** loc_conf; // 指针数组, 数组的每个元素指向相应 HTTP 模块 的 create_loc_conf 方法产生的结构体的地址
} ngx_http_conf_ctx_t;

HTTP 框架为所有的HTTP 模块建立 3个数组, 分别存放 create_main_conf, create_srv_conf, create_loc_conf 方法所返回的地址指针。即ngx_http_conf_ctx_t 结构保存了所有HTTP 模块的配置数据结构的入口。

解析HTTP 配置的流程

HTTP配置模型的内存结构


预设配置项处理方法的工作原理

error日志

请求上下文

struct ngx_http_request_s {
...
void ** ctx;
...
}
```
- ngx_http_get_module_ctx 和 ngx_http_set_ctx 的原理就是去获取或设置 ctx 数组中相应的 HTTP 模块的指针

上一篇下一篇

猜你喜欢

热点阅读