nigix學習框架

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環境下編譯,後續安排時間調試及設計思想的總結。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章