看到了后面才发现其实自己在server块命令这一部分并没有搞的太清楚,因而会影响到以后对代码的理解,因而从头又来看一遍,一定要把它搞明白。
首先我们来看ngx_http_core_module的main_conf结构:
typedef struct {
/**
* 存储所有的ngx_http_core_srv_conf_t,元素的个数等于server块的个数。 ,因为同一个http块命令可以配置多个server
*/
ngx_array_t servers; /* ngx_http_core_srv_conf_t */
/**
* 包含所有phase,以及注册的phase handler,这些handler在处理http请求时,
* 会被依次调用,通过ngx_http_phase_handler_t的next字段串联起来组成一个
* 链表。
*/
ngx_http_phase_engine_t phase_engine;
/**
* 以hash存储的所有request header
*/
ngx_hash_t headers_in_hash;
/**
* 被索引的nginx变量 ,比如通过rewrite模块的set指令设置的变量,会在这个hash
* 中分配空间,而诸如$http_XXX和$cookie_XXX等内建变量不会在此分配空间。
*/
ngx_hash_t variables_hash;
/**
* ngx_http_variable_t类型的数组,所有被索引的nginx变量被存储在这个数组中。
* ngx_http_variable_t结构中有属性index,是该变量在这个数组的下标。
*/
ngx_array_t variables; /* ngx_http_variable_t */
ngx_uint_t ncaptures;
/**
* server names的hash表的允许的最大bucket数量,默认值是512。
*/
ngx_uint_t server_names_hash_max_size;
ngx_uint_t server_names_hash_bucket_size;
ngx_uint_t variables_hash_max_size;
ngx_uint_t variables_hash_bucket_size;
ngx_hash_keys_arrays_t *variables_keys;
/**
* 监听的所有端口,ngx_http_conf_port_t类型,其中包含socket地址信息。
*/
ngx_array_t *ports; //保存ngx_http_conf_port_t结构的元素,在ngx_http_optimize_servers函数中,将会用到ports中的元素来创建监听
ngx_uint_t try_files; /* unsigned try_files:1 */
/**
* 所有的phase的数组,其中每个元素是该phase上注册的handler的数组。
*/
ngx_http_phase_t phases[NGX_HTTP_LOG_PHASE + 1];
} ngx_http_core_main_conf_t;
其有几个比较重要的域是:
(1)servers,因为整个http块命令中创建的配置结构的main_conf结构都是统一的,但是同一个http块命令中却可以配置多个server块命令,servers数组就是用来保存这些独立的server块配置的,其保存的没一个元素都是ngx_http_core_srv_conf_t类型的。
(2)ports,其也是一个数组,我们在listen指令中会指定监听的地址端口的信息,由于可能会同时监听多个,所以ports数组就用来保存所有的这些监听的信息,在listen指令的回调函数中会将这些配置信息保存到ports数组中,其中保存的元素是ngx_http_conf_port_t结构,而且最后会调用ngx_http_optimize_servers函数来根据其中保存的信息来生成最后的ngx_listening_t结构。
接下来我们来看ngx_http_core_module模块的srv_conf结构:
typedef struct {
/* array of the ngx_http_server_name_t, "server_name" directive */
ngx_array_t server_names; //server的名字数组 ngx_http_server_name_t
/* server ctx */
ngx_http_conf_ctx_t *ctx; // 指向包含它的ngx_http_conf_ctx_t结构,因为在server块命令的回调函数中会重新创建ngx_http_conf_ctx_t结构,但是其中的main_conf结构都是统一的
ngx_str_t server_name; //名字
size_t connection_pool_size; //connection池的大小
size_t request_pool_size;
size_t client_header_buffer_size;
ngx_bufs_t large_client_header_buffers;
ngx_msec_t client_header_timeout; //请求超时时间
ngx_flag_t ignore_invalid_headers;
ngx_flag_t merge_slashes;
ngx_flag_t underscores_in_headers;
unsigned listen:1; //区别当前server是否监听
#if (NGX_PCRE)
unsigned captures:1;
#endif
ngx_http_core_loc_conf_t **named_locations; //该srv配置的location配置数组
} ngx_http_core_srv_conf_t;
其中有几个比较重要的域:
(1)ctx,我们已经知道在每一个server块命令中都会重新创建ngx_http_conf_ctx_t结构,它的main_conf中的数据都是统一的,ctx就是用来指向当前server块命令中自己创建的ngx_http_conf_ctx_t结构。