1、nigix初始化
nginx有5中类型的模块,"CORE","CONF","EVNT","HTTP","MAIL"
2、数组结构ngx_array_t
3、ngx_listening_s结构体中
unsigned open:1;
这不是给open赋值,这是一种位域的结构体,这里的取值只能是0和1,因为它是用1位来表示的,使用位域可以节省很多空间。
4、hash结构ngx_hash_t
Redis是一个高效的key-value缓存系统(后续可以研究下)--深入理解哈希表博客文章
5、启动流程
•调用ngx_get_options()解析命令参数;
•调用ngx_time_init()初始化并更新时间,如全局变量ngx_cached_time;
•调用ngx_log_init()初始化日志,如初始化全局变量ngx_prefix,打开日志文件ngx_log_file.fd;
•清零全局变量ngx_cycle,并为ngx_cycle.pool创建大小为1024B的内存池;
•调用ngx_save_argv()保存命令行参数至全局变量ngx_os_argv、ngx_argc、ngx_argv中;
•调用ngx_process_options()初始化ngx_cycle的prefix, conf_prefix, conf_file, conf_param等字段;
•调用ngx_os_init()初始化系统相关变量,如内存页面大小ngx_pagesize,ngx_cacheline_size,最大连接数ngx_max_sockets等;
•调用ngx_crc32_table_init()初始化CRC表(后续的CRC校验通过查表进行,效率高);
•调用ngx_add_inherited_sockets()继承sockets; •解析环境变量NGINX_VAR="NGINX"中的sockets,并保存至ngx_cycle.listening数组;
•设置ngx_inherited=1;
•调用ngx_set_inherited_sockets()逐一对ngx_cycle.listening数组中的sockets进行设置;
•初始化每个module的index,并计算ngx_max_module;
•调用ngx_init_cycle()进行初始化;
•该初始化主要对ngx_cycle结构进行;
•若有信号,则进入ngx_signal_process()处理;
•调用ngx_init_signals()初始化信号;主要完成信号处理程序的注册;
•若无继承sockets,且设置了守护进程标识,则调用ngx_daemon()创建守护进程;
•调用ngx_create_pidfile()创建进程记录文件;(非NGX_PROCESS_MASTER=1进程,不创建该文件)
•进入进程主循环;
•若为NGX_PROCESS_SINGLE=1模式,则调用ngx_single_process_cycle()进入进程循环;
•否则为master-worker模式,调用ngx_master_process_cycle()进入进程循环;
6、如何发送信号
ngx_signal_process()函数处理
该函数作用:
•读取ngx_core_module模块的配置结构ngx_core_conf_t;
•根据配置结构找到其工作进程文件,如"/usr/local/nginx/logs/nginx.pid"(该文件保存nginx进程ID,即pid);
•打开该文件,读取pid;
•调用ngx_os_signal_process()发送信号;
ngx_os_signal_process()函数处理
•遍历signals数组,根据给定信号name,找到对应signo;
•调用kill向该pid发送signo号信号;
7、队列结构ngx_queue_t
8、链表结构ngx_list_t
队列,链表操作部分仍需揣摩,设计思想很重要!!!
目前主要分析了nginx源码,但还未在Linux环境下编译,后续安排时间调试及设计思想的总结。