Nginx框架是围绕着 ngx_cycle_t 结构体来控制进程运行的。ngx_cycle_t结构体的prefix、conf prefix、conf_file等字符串类型成员保存着Nginx配置文件的路径,Nginx的可配置性完全依赖于nginx.conf配置文件,Nginx所有模块的可定制性、可伸缩性等诸多特性也是依赖于nginx.conf配置文件的,可以想见,这个配置文件路径必然是保存在 ngx_cycle_t 结构体中的。
有了配置文件后,Nginx框架就开始根据配置项来加载所有的模块了,这一步骤会在ngx_init_cycle方法中进行。ngx_init_cycle方法,顾名思义,就是用来构造ngx_cycle_t结构体中成员的,首先来介绍一下ngx_cycle_t中的成员(对于下面提到的connections、read_events、write_events、files、free_connections等成员,它们是与事件模块强相关的)
在构造ngx_cycle_t结构体成员的ngx_init_cycle方法中,上面所列出的pool内存池成员、hostname主机名、日志文件new_log和 log、存储所有路径的pathes数组、共享内存、监听端口等都会在该方法中初始化。本章后续提到的流程、方法中可以随处见到ngx_cycle_t结构体成员的身影。
typedef struct ngx_cycle_s ngx_cycle_t;
struct ngx_cycle_s {
void ****conf_ctx;
ngx_pool_t *pool; // 内存池
ngx_log_t *log;
ngx_log_t new_log;
ngx_uint_t log_use_stderr;
ngx_connection_t **files;
ngx_connection_t *free_connections; //可用连接池,与free_connection_n配合使用
ngx_uint_t free_connection_n; // 可用连接池中连接的总数
ngx_module_t **modules;
ngx_uint_t modules_n;
ngx_uint_t modules_used;
ngx_queue_t reusable_connections_queue;
ngx_uint_t reusable_connections_n; //
ngx_array_t listening;
ngx_array_t paths;
ngx_array_t config_dump;
ngx_rbtree_t config_dump_rbtree;
ngx_rbtree_node_t config_dump_sentinel;
ngx_list_t open_files;
ngx_list_t shared_memory;
ngx_uint_t connection_n; //当前进程中所有连接对象的总数,与connections成员配合使用
ngx_uint_t files_n; //与files成员配合使用,指出files数组里元素的总数
ngx_connection_t *connections; //指向当前进程中的所有连接对象,与connection_n配合使用
ngx_event_t *read_events; //指向当前进程中的所有读事件对象,connection_n同时表示所有读事件的总数
ngx_event_t *write_events; //指向当前进程中的所有写事件对象,connection_n同时表示所有写事件的总数
ngx_cycle_t *old_cycle;
ngx_str_t conf_file; // 配置文件相对于安装目录的路径名称
ngx_str_t conf_param;
ngx_str_t conf_prefix; //Nginx配置文件所在目录的路径
ngx_str_t prefix; //Nginx安装目录的路径
ngx_str_t lock_file; //用于进程间同步的文件锁名称
ngx_str_t hostname; //使用gethostname系统调用得到的主机名
};
调试的部分内容,准备加一个debugging hooks
(gdb) p ngx_cycle $1 = (volatile ngx_cycle_t *) 0x1d8e9d0 (gdb) p ngx_cycle->module There is no member named module. (gdb) p ngx_cycle->modules $2 = (ngx_module_t **) 0x1d90228 (gdb) p ngx_cycle->modules_n $3 = 57 (gdb) p ngx_cycle->modules_used $4 = 1 (gdb) p ngx_cycle->hostname->name There is no member named name. (gdb) p ngx_cycle->hostname->data $5 = (u_char *) 0x1d90220 "wknode" (gdb) p ngx_cycle->lock_file->data $6 = (u_char *) 0x1dbd5d7 "/usr/local/wad-engine/logs/nginx.lock.accept" (gdb) p ngx_cycle->conf_file->data $7 = (u_char *) 0x1d8ec71 "/usr/local/wad-engine/conf/nginx.conf"



