亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

nginx 源碼學習筆記(十四)—— 全局變量ngx_c

系統(tǒng) 1993 0

再打算正式開始研究core模塊式,發(fā)現(xiàn)有一個很重要的變量ngx_cycle_t,一直伴隨,如果不懂ngx_cycle可能讀起代碼來回非常困難,這里就來詳細學習一下吧。本文大部分靈感來自于。 http://blog.csdn.net/livelylittlefish/article/details/7247080 http://blog.sina.com.cn/s/blog_677be95b0100iivi.html 謝謝作者提供很詳細的資料。

依照慣例我們直接來看下


該結構體的大小是確定的, sizeof(ngx_cycle_t) =224

其中,

  • pathes 數(shù)組元素結構為 ngx_path_t
  • open_files 鏈表元素結構為 ngx_open_file_t
  • shared_memory 鏈表元素結構為 ngx_shm_zone_t
  • listening 數(shù)組元素結構為 ngx_listening_t ,該數(shù)組用來存放監(jiān)聽套接字。

再來看下 ngx_init_cycle函數(shù)的處理過程

1. 調用ngx_timezone_update()、ngx_timeofday()和ngx_time_update(0, 0)做時間校準

2. 創(chuàng)建一個新的ngx_cycle_t變量cycle,并且初始化其大部分的成員字段,有一些是從傳入的old_cycle直接拷貝過來的,這些字段包括: log,conf_prefix,prefix,conf_file,conf_param


還有一些字段會判斷一下old_cycle中是否存在,如果存在,則取得這些字段的占用空間,在cycle中申請等大的空間,并初始化(不拷貝),否則就申請默認大小的空間,這些字段有: pathes,open_files,share_memory,listening


還有一些字段是重新創(chuàng)建或者第一次賦值的:pool,new_log.log_level(=NGX_LOG_ERR),old_cycle(=old_cycle),hostname(gethostname);


最重要的一個字段是conf_ctx,它被初始化為ngx_max_module個void *指針,這預示著conf_ctx是所有模塊的配置結構的指針數(shù)組;


3. 從命令行和配置文件中把所有配置更新到cycle的conf_ctx中:

首先調用ngx_conf_param把命令行中的指令(-g directives)轉換為配置結構并把指針加入到cycle.conf_ctx中;

接著調用ngx_conf_parse(..,filename)把配置文件中的指令轉換為配置結構并把指針加入到cycle.conf_ctx中。


ngx_conf_param最后也會調用ngx_conf_parse(..,NULL),所以配置的更新主要是在ngx_conf_parse中進行的,這個函數(shù)中有一個for循環(huán),每次循環(huán)調用ngx_conf_read_token取得一個配置指令(以;結尾)(這里在上一節(jié)已經(jīng)詳細將結果),然后調用ngx_conf_handler處理這條指令,ngx_conf_handler每次都會遍歷所有模塊的指令集,查找這條配置指令并分析其合法性,如果指令正確,則會創(chuàng)建配置結構并把指針加入到cycle.conf_ctx中,配置結構的賦值是調用該指令的鉤子set完成的。

遍歷指令集的過程首先是遍歷所有的核心類模塊,若是event類的指令,則會遍歷到ngx_events_module,這個模塊是屬于核心類的,其鉤子set又會嵌套調用ngx_conf_parse去遍歷所有的event類模塊,同樣的,若是http類指令,則會遍歷到ngx_http_module,該模塊的鉤子set進一步遍歷所有的http類模塊,mail類指令會遍歷到ngx_mail_module,該模塊的鉤子進一步遍歷到所有的mail類模塊。要特別注意的是:這三個遍歷過程中會在適當?shù)臅r機調用event類模塊、http類模塊和mail類模塊的創(chuàng)建配置和初始化配置的鉤子。從這里可以看出,event、http、mail三類模塊的鉤子是配置中的指令驅動的;
4.調用所有核心類模塊的鉤子init_conf,把模塊的配置結構作為一個參數(shù)傳入:init_conf(cycle, cycle->conf_ctx[ngx_modules[i]->index);


5. 獲得核心模塊ngx_core_dodule的配置結構,然后調用ngx_create_pidfile創(chuàng)建pid文件。獲取配置結構的代碼:ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module),這里的ngx_get_conf是一個宏定義:#define ngx_get_conf(conf_ctx, module) <wbr>conf_ctx[module.index];</wbr>


6. 調用ngx_test_lockfile(filename,log),ngx_create_pathes(cycle,user),接著打開errorlog文件并賦值給cycle->new_log.file:cycle->new_log.file = ngx_conf_open_file(cycle, &error_log);

7. 打開新文件,在第2步的時候提到cycle->open_files這個鏈表是空的,只是給它預先分配了空間,并沒有數(shù)據(jù),這里之所以可能會有文件被打開,估計是前面讀配置文件的時候,調用各個鉤子的過程中,填充了這個鏈表,把ngx_open_file_t結構變量填充進來(結構體中包含要打開文件的路徑信息),這是我猜測的,之后再驗證:)接著修改一下cycle的成員:cycle->log = &cycle->new_log;pool->log = &cycle->new_log ;

8. 創(chuàng)建共享內存,和open_files類似,在第2步的時候cycle->share_memory也初始化為一個空的鏈表,也是預分配了空間,如果此時鏈表中已經(jīng)被填充了ngx_shm_zone_t結構變量(其中包含需要共享內存的尺寸和標識等信息),那么這里就會分配共享內存,并且調用合適的初始化鉤子初始化分配的共享內存,每塊共享內存都會有name標識,這里也會做一些排重,已經(jīng)分配的就不會再去分配,從對open_files和share_memory的處理過程可以看出,nginx在資源管理上是集中分配的,請求資源的時候分配說明性的結構變量,然后在恰當?shù)臅r機才去真正分配資源;

9. 處理listening sockets,cycle->listening是ngx_listening_t結構的數(shù)組,把cycle->listening于old_cycle->listening進行比較,設置cycle->listening的一些狀態(tài)信息,接著調用ngx_open_listening_sockets(cycle)啟動cycle->listening中的所有監(jiān)聽socket,循環(huán)調用socket,bind,listen完成服務端監(jiān)聽socket的啟動。接著調用ngx_configure_listening_sockets(cycle)配置監(jiān)聽socket,會根據(jù)ngx_listening_t中的狀態(tài)信息設置socket的讀寫緩存和TCP_DEFER_ACCEPT;

10. 調用所有模塊的鉤子init_module;


11. 關閉或者刪除一些殘留在old_cycle中的資源,首先釋放不用的共享內存,接著關閉不使用的監(jiān)聽socket,再關閉不使用的打開文件,最后把old_cycle放入ngx_old_cycles中,這是一個ngx_cycle_t *的數(shù)組,最后設定一個定時器,定期回調ngx_cleaner_event清理ngx_old_cycles,這里設置了30000ms清理一次。


放上一張圖

nginx 源碼學習筆記(十四)—— 全局變量ngx_cycle

nginx 源碼學習筆記(十四)—— 全局變量ngx_cycle


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久精品国产视频 | 天天艹天天射 | 国产成人性毛片aaww | 毛片毛片毛片毛片毛片毛片毛片 | 波多野结衣 一区二区 | 国产精品19p | 狠狠插狠狠干 | 免费观看四虎精品国产永久 | 91最新免费地址入口 | 日韩精品午夜视频一区二区三区 | 色天使色婷婷丁香久久综合 | 欧美精品四虎在线观看 | 欧美黑人喷潮水xxxx | 四虎www成人影院观看 | 亚洲精品视频在线 | 97视频免费上传播放 | 天天干天天色天天干 | 欧美香蕉网 | 抱着cao才爽视频 | 免费看成人毛片日本久久 | 一级aa免费视频毛片 | 欧美久久亚洲精品 | 中文字幕在线一区二区在线 | 999热视频| 欧美成人网在线综合视频 | 国产免费播放一区二区 | 久久aa毛片免费播放嗯啊 | 久久久久久综合七次郎 | 国产美女一级视频 | 国产在线不卡一区 | 国产精品手机在线观看 | 亚洲第一综合网站 | 99久久精品免费看国产情侣 | 国产精品素人福利 | 国产毛片久久久久久国产毛片 | 国产视频一区在线观看 | 伊人久久国产精品 | 国内精品免费久久影院 | 在线综合视频 | 欧美乱子伦一区二区三区 | 久久人人爽人人爽人人片av不 |