返回首页
当前位置: 主页 > 网络编程 > Jsp实例教程 >

Nginx 源码分析

时间:2017-09-13 21:06来源:betway必威官网www.etsupport.net 编辑:麦田守望者

ngx_cycle_t 分析
struct ngx_cycle_s {
void ****conf_ctx; //配置上下文数组(含所有模块)
ngx_pool_t *pool; //内存池

ngx_log_t *log; //日志
ngx_log_t new_log;

ngx_connection_t **files; //连接文件
ngx_connection_t *free_connections; //空闲连接
ngx_uint_t free_connection_n; //空闲连接个数

ngx_queue_t reusable_connections_queue; //再利用连接队列

ngx_array_t listening; //监听数组
ngx_array_t pathes; //路径数组
ngx_list_t open_files; //打开文件链表
ngx_list_t shared_memory; //共享内存链表

ngx_uint_t connection_n; //连接个数
ngx_uint_t files_n; //打开文件个数

ngx_connection_t *connections; //连接
ngx_event_t *read_events; //读事件
ngx_event_t *write_events; //写事件

ngx_cycle_t *old_cycle; //old cycle指针

ngx_str_t conf_file; //配置文件
ngx_str_t conf_param; //配置参数
ngx_str_t conf_prefix; //配置前缀
ngx_str_t prefix; //前缀
ngx_str_t lock_file; //锁文件
ngx_str_t hostname; //主机名
};


nginx struct

模块初始化

在http/ngxhttp.c文件中,ngxhttpblock函数会依次判断模块类型,如果模块类型为NGXHTTP_MODULE,则调用模块的三个初始化函数。
for (m = 0; cf->cycle->modules[m]; m++) {
if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) {
continue;
}

module = cf->cycle->modules[m]->ctx;

mi = cf->cycle->modules[m]->ctx_index;

if (module->create_main_conf) {

ctx->main_conf[mi] = module->create_main_conf(cf);
if (ctx->main_conf[mi] == NULL) {
return NGX_CONF_ERROR;
}
}

if (module->create_srv_conf) {

ctx->srv_conf[mi] = module->create_srv_conf(cf);
if (ctx->srv_conf[mi] == NULL) {
return NGX_CONF_ERROR;
}
}

if (module->create_loc_conf) {

ctx->loc_conf[mi] = module->create_loc_conf(cf);
if (ctx->loc_conf[mi] == NULL) {
return NGX_CONF_ERROR;
}
}
}


三个函数原型如下:
typedef struct {
ngx_int_t (*preconfiguration)(ngx_conf_t *cf);
ngx_int_t (*postconfiguration)(ngx_conf_t *cf);

void *(*create_main_conf)(ngx_conf_t *cf);
char *(*init_main_conf)(ngx_conf_t *cf, void *conf);

void *(*create_srv_conf)(ngx_conf_t *cf);
char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf);

void *(*create_loc_conf)(ngx_conf_t *cf);
char *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);
} ngx_http_module_t;

•preconfiguration 在读入配置前调用
•postconfiguration 在读入配置后调用
•createmainconf 在创建main配置时调用(比如,用来分配空间和设置默认值)
•initmainconf 在初始化main配置时调用(比如,把原来的默认值用nginx.conf读到的值来覆盖)
•initmainconf 在创建server配置时调用
•mergesrvconf 合并server和main配置时调用
•createlocconf 创建location配置时调用
•mergelocconf 合并location和server配置时调用

遍历输出ngxarrayt
typedef struct ngx_array_s ngx_array_t;
struct ngx_array_s {
void *elts; //具体的数据区域的起始地址
ngx_uint_t nelts; //已经存储了的元素数量
size_t size; //单个元素的大小(字节)
ngx_uint_t nalloc; //数组容量,即数组预先分配的内存大小
ngx_pool_t *pool; //内存池,用其保存分配此数组的内存池地址。
};

static void print_array(ngx_array_t *a);
static void print_array(ngx_array_t *a)// 遍历输出array
{
printf("-------------------------------\n");
ngx_http_upstream_server_t *p = a->elts;
size_t i;
for(i=0; i < a->nelts; ++i)
{
printf("%s.\n", (p+i)->name.data);
}
printf("-------------------------------\n");
}


Request

Nginx的request是指http请求,涉及到的数据结构为ngxhttprequests,该数据结构贯穿了http请求的整个过程,可以说处理http请求就是操作ngxhttprequestt数据结构。
struct ngx_http_request_s {
uint32_t signature; /* "HTTP" */

ngx_connection_t *connection; //请求对应的客户端连接

void **ctx; //指向存放所有HTTP模块的上下文结构体的指针数组
void **main_conf; //指向请求对应的存放main级别配置结构体的指针数组
void **srv_conf; //指向请求对应的存放srv级别配置结构体的指针数组
void **loc_conf; //指向请求对应的存放loc级别配置结构体的指针数组

ngx_http_event_handler_pt read_event_handler;
ngx_http_event_handler_pt write_event_handler;

#if (NGX_HTTP_CACHE)
ngx_http_cache_t *cache;
#endif

ngx_http_upstream_t *upstream; //upstream机制用到的结构体,如果模块是load-balance的话设置这个
ngx_array_t *upstream_states;
/* of ngx_http_upstream_state_t */

ngx_pool_t *pool;
ngx_buf_t *header_in;

ngx_http_headers_in_t headers_in;
ngx_http_headers_out_t headers_out;

ngx_http_request_body_t *request_body;

time_t lingering_time; // 延迟关闭连接的时间
time_t start_sec;
ngx_msec_t start_msec;

ngx_uint_t method;
ngx_uint_t http_version;

ngx_str_t request_line;
ngx_str_t uri;
ngx_str_t args;
ngx_str_t exten;
ngx_str_t unparsed_uri;

ngx_str_t method_name;
ngx_str_t http_protocol;

ngx_chain_t *out;
/*
* 当前请求既可能是用户发来的请求,也可能是派生出的子请求,而main则标识一系列相关的派生子请求的原始请求
* 可以通过main和当前请求的地址是否相等来判断当前请求是否为用户发来的原始请求
*/
ngx_http_request_t *main;
ngx_http_request_t *parent;
ngx_http_postponed_request_t *postponed;
ngx_http_post_subrequest_t *post_subrequest;
ngx_http_posted_request_t *posted_requests;

ngx_int_t phase_handler;
ngx_http_handler_pt content_handler;
ngx_uint_t access_code;

ngx_http_variable_value_t *variables;

#if (NGX_PCRE)
ngx_uint_t ncaptures;
int *captures;
u_char *captures_data;
#endif

size_t limit_rate;
size_t limit_rate_after;

/* used to learn the Apache compatible response length without a header */
size_t header_size;

off_t request_length;

ngx_uint_t err_status;

ngx_http_connection_t *http_connection;
#if (NGX_HTTP_SPDY)
ngx_http_spdy_stream_t *spdy_stream;
#endif

顶一下
(0)
0%
踩一下
(0)
0%
标签(Tag):Nginx Nginx源码分析
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
猜你感兴趣