nginx源碼學習(一)程序啓動

1、以下是我閱讀nginx(1.13.2版本)源碼的一些心得,個人覺得學一個東西最好學它的思想,學會舉一反三。因爲互聯網的東西實在太多 了。
先來看看nginx的整體啓動流程,因爲是從整體上去了解原理,細節的東西省去,
比如ssl初始化等操作。(nginx.c)。


main(int argc, char *const *argv){
     //定義一些變量
     
     ngx_debug_init();//調試初始化,不管它
     ngx_strerror_init();//方法裏面沒有邏輯,直接返回NGX_OK了
     ngx_get_options(argc, argv);//獲取命令行參數,並且賦值給靜態變量,比如nginx -v 這個v就會賦值ngx_show_version = 1;後面程序運行時判斷nginx_show_version如果等於1,直接輸出nginx的版本號就返回了,不會繼續執行
     ngx_time_init(); //時間初始化,應該是給後面那些定時任務使用的,更新時間的時候有一個互斥鎖
     ngx_pid = ngx_getpid(); //獲取主進程的ID
     log = ngx_log_init(ngx_prefix); //初始化日誌結構體ngx_log_s,包括打開文件名稱,句柄等信息
     ngx_memzero(&init_cycle, sizeof(ngx_cycle_t)); //給init_cycle分配內存空間並清空,nginx是圍繞init_cycle來運行的,閱讀源碼時可以看着init_cycle結構體來學習
     init_cycle.log = log; //把log指針賦值給init_cycle結構體的log屬性
     ngx_cycle = &init_cycle; //ngx_cycle是一個全局變量
     init_cycle.pool = ngx_create_pool(1024, log);//申請一個2014字節的內存空間,空間必然是要使用的
     ngx_save_argv(&init_cycle, argc, argv);把參數賦值給一些全局變量,方便後面使用
     ngx_crc32_table_init();//這個可以看下crc32查找算法,這裏初始化這個功能,後面用到,如果不看的話理解爲一個用於快速搜索的結構體就好
     ngx_preinit_modules();//對已經編譯的模塊進行清點編號順序,方便後面使用,解析放到文章末尾
     cycle = ngx_init_cycle(&init_cycle); //對結構體進行初始化操作,這個是整個nginx啓動的核心,放在第二章學習
     ngx_init_signals(cycle->log);//對信號進行註冊,解釋看文章末尾
      if (ngx_process == NGX_PROCESS_SINGLE) {  
        ngx_single_process_cycle(cycle);//單進程直接進入,核心處理代碼,放在第三章學習
    } else {
        ngx_master_process_cycle(cycle); //多個work進程進入
    }
}



ngx_preinit_modules解析:
 /*
ngx_int_t ngx_preinit_modules(void)
{
- ngx_max_module = 0;
- for (i = 0; ngx_modules[i]; i++) {
-     ngx_modules[i]->index = ngx_max_module++;
- }
}
return NGX_OK;
}
 額!!!這個循環中的ngx_modules數組好像沒見定義,難不成是火星來的?當然不是,如其名,這就是一個存儲所有模塊的信息,包括自己開發的模塊都會放到這個數組中,而這個神祕的數組卻是在自動編譯的時候生成的,位於objs/ngx_modules.c文件中。這個循環的目的是清晰可見的——對所有模塊進行索引編號,方便以後訪問;同時藉助ngx_max_module對所有模塊進行了一次點數,確定究竟有多少模塊。而神祕數組ngx_modules的長相大概如下:
- ngx_module_t *ngx_modules[] = {
-     &ngx_core_module,
-     &ngx_errlog_module,
-     &ngx_conf_module,
-     &ngx_events_module,
-     &ngx_event_core_module,
-     &ngx_epoll_module,
-     &ngx_openssl_module,
-     &ngx_http_module,
-     。。。
- };
          
     */






ngx_process_signals:
 註冊一堆信號處理程序,需要註冊的信號及相應的信號處理函數被放在一個類型爲ngx_signal_t的數組signals中。數組定義在src/os/unix/ngx_process.c中。ngx_signal_t結構類型定義了信號值,信號名字,信號對應動作名以及信號處理函數。




















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