青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

飛天

快樂的生活......

 

nginx源碼分析—啟動流程

. 序
1. main()分析
2. 注意問題
2.1 幾個初值
2.2 nginx工作模式
2.3 一些配置
2.4 其他開關
3. 小結

0. 

本文主要分析nginx主程序。

nginx主程序main()實現文件:./src/core/nginx.c.表示nginx-1.0.4代碼目錄,本文為/usr/src/nginx-1.0.4

1. main()分析

nginx啟動過程如下。

  • 調用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_argvngx_argcngx_argv中;
  • 調用ngx_process_options()初始化ngx_cycleprefix, 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進行設置;
    • 具體可參考<nginx源碼分析—初始化過程中處理繼承的sockets>
  • 初始化每個moduleindex,并計算ngx_max_module;具體可參考<nginx源碼分析—模塊及其初始化>
  • 調用ngx_init_cycle()進行初始化;
    • 該初始化主要對ngx_cycle結構進行;
    • 具體可參考<nginx源碼分析—全局變量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()進入進程循環;
    • 具體可參考<nginx源碼分析—master/worker進程啟動>

 

簡要的函數調用圖如下。具體的還是需要閱讀源代碼。圖的自動生成,可參考<Graphviz可視化函數調用-使用開源軟件來簡化復雜調用結構>


2. 注意問題

2.1 幾個初值 

  1. 00353:    ngx_cycle = cycle;  /* cycle是調用ngx_init_cycle()的返回值,而調用該函數的參數也是ngx_cycle */  
  2. 00354:  
  3. 00355:    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);  
  4. 00356:  
  5. 00357:    if (ccf->master && ngx_process == NGX_PROCESS_SINGLE) { /* ccf->master=-1 */  
  6. 00358:        ngx_process = NGX_PROCESS_MASTER;  
  7. 00359:    }  
此處單獨將該段代碼拿出來,說明以下問題。

ngx_process在此處的值是什么?——NGX_PROCESS_SINGLE=0

ccf->master在此處的值之什么?——NGX_CONF_UNSET=-1

ngx_prefix何時初始化的?——ngx_log_init()中初始化

(1)ccf->master

ccf->master的值是在ngx_init_cycle()函數中調用NGX_CORE_MODULE模塊的create_conf鉤子(callback)完成初始化的。

具體可參考<nginx源碼分析—core模塊callback>。

(2)ngx_process

ngx_process是全局變量,定義如下。

  1. //./src/os/unix/ngx_process_cycle.c  
  2. ngx_uint_t    ngx_process;  
  3. ngx_pid_t     ngx_pid;  
  4. ngx_uint_t    ngx_threaded;  

其在ngx_init_cycle()中沒有被初始化,故其初值為0。

(3)ngx_prefix

  1. static u_char      *ngx_prefix;       /* nginx工作目錄,默認為/usr/local/nginx/ */  
  2. static u_char      *ngx_conf_file;    /* 配置文件 */  
  3. static u_char      *ngx_conf_params;  /* nginx指令 */  
在ngx_log_init()中初始化。

實際上,在main()函數開始調用的ngx_get_options()函數,即是處理nginx啟動的命令,并從中獲取參數并賦予相應的變量。

-p:ngx_prefix

-c:ngx_conf_file

-g:ngx_conf_params

-s:ngx_signal

關于這一點,可從以下命令結果看出端倪。

[plain] view plaincopy
  1. # ./nginx -h  
  2. nginx: nginx version: nginx/1.0.4  
  3. nginx: Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]  
  4.   
  5. Options:  
  6.   -?,-h         : this help  
  7.   -v            : show version and exit  
  8.   -V            : show version and configure options then exit  
  9.   -t            : test configuration and exit  
  10.   -q            : suppress non-error messages during configuration testing  
  11.   -s signal     : send signal to a master process: stop, quit, reopen, reload  
  12.   -p prefix     : set prefix path (default: /usr/local/nginx/)  
  13.   -c filename   : set configuration file (default: conf/nginx.conf)  
  14.   -g directives : set global directives out of configuration file  

2.2 nginx工作模式

因此,main()函數返回前調用ngx_master_process_cycle()函數進入多進程(master/worker)工作模式。如下。

  1. 00401:    if (ngx_process == NGX_PROCESS_SINGLE) {  /* 單進程 */  
  2. 00402:        ngx_single_process_cycle(cycle);  
  3. 00403:  
  4. 00404:    } else {                                  /* 多進程 */  
  5. 00405:        ngx_master_process_cycle(cycle);  
  6. 00406:    }  
具體請參考<nginx源碼分析—master/worker進程啟動>。

2.3 一些配置

看源代碼時,會注意到有些宏(宏全部大寫,中間用下劃線隔開,這是nginx代碼規范。實際上,絕大多數系統均采用此規范)找不到定義,例如NGX_PREFIX、NGX_CONF_PREFIX、NGX_CONF_PATH等。

實際上,這些宏定義由configure程序進行自動配置時生成。配置時會自動生成ngx_auto_config.h文件(如果你用source insight閱讀源代碼,需要將該文件加入工程),如下。

./objs/ngx_auto_config.h(此處列出其中一部分常用的宏,未按順序)

  1. #ifndef NGX_COMPILER  
  2. #define NGX_COMPILER  "gcc 4.6.1 20110908 (Red Hat 4.6.1-9) (GCC) "  
  3. #endif  
  4.   
  5. #ifndef NGX_PCRE  
  6. #define NGX_PCRE  1  
  7. #endif  
  8.   
  9. #ifndef NGX_PREFIX  
  10. #define NGX_PREFIX  "/usr/local/nginx/"  
  11. #endif  
  12.   
  13. #ifndef NGX_CONF_PREFIX  
  14. #define NGX_CONF_PREFIX  "conf/"  
  15. #endif  
  16.   
  17. #ifndef NGX_CONF_PATH  
  18. #define NGX_CONF_PATH  "conf/nginx.conf"  
  19. #endif  
  20.   
  21. #ifndef NGX_PID_PATH  
  22. #define NGX_PID_PATH  "logs/nginx.pid"  
  23. #endif  
  24.   
  25. #ifndef NGX_LOCK_PATH  
  26. #define NGX_LOCK_PATH  "logs/nginx.lock"  
  27.   
  28. #ifndef NGX_ERROR_LOG_PATH  
  29. #define NGX_ERROR_LOG_PATH  "logs/error.log"  
  30. #endif  
  31.   
  32. #ifndef NGX_HTTP_LOG_PATH  
  33. #define NGX_HTTP_LOG_PATH  "logs/access.log"  
  34. #endif  
  35.   
  36. #ifndef NGX_HTTP_CLIENT_TEMP_PATH  
  37. #define NGX_HTTP_CLIENT_TEMP_PATH  "client_body_temp"  
  38. #endif  
  39.   
  40. #ifndef NGX_HTTP_PROXY_TEMP_PATH  
  41. #define NGX_HTTP_PROXY_TEMP_PATH  "proxy_temp"  
  42. #endif  

2.4 其他開關

還有一些開關,如NGX_FREEBSD, NGX_PCRE,NGX_OPENSSL等,這些宏也在configure過程中自動配置。nginx啟動時會根據這些宏是否定義調用相應的函數。此處非本文重點,不再贅述。

以上3個宏分別調用相應函數進行debug的初始化、正則表達式初始化和SSL的初始化。如下。(代碼未按順序)

  1. #if (NGX_FREEBSD)  
  2.     ngx_debug_init();  
  3. #endif  
  4.   
  5. #if (NGX_PCRE)  
  6.     ngx_regex_init();  
  7. #endif  
  8.   
  9. #if (NGX_OPENSSL)  
  10.     ngx_ssl_init(log);  
  11.   
  12. #endif  

3. 小結

本文簡單分析nginx的啟動過程,后文繼續分析其中的ngx_init_cycle()和master/worker工作模型。

Reference

http://www.tbdata.org/archives/1092

http://www.w3.org/TR/PNG (CRC相關)

Nginx代碼研究計劃 (RainX1982)

nginx源碼分析—模塊及其初始化 (阿波)

nginx源碼分析—內存池結構ngx_pool_t及內存管理 (阿波)

nginx源碼分析—數組結構ngx_array_t (阿波)

nginx源碼分析—鏈表結構ngx_list_t (阿波)

nginx源碼分析—隊列結構ngx_queue_t (阿波)

nginx源碼分析—模塊及其初始化 (阿波)

nginx源碼分析—內存池結構ngx_pool_t及內存管理 (阿波)

nginx源碼分析—數組結構ngx_array_t (阿波)

nginx源碼分析—鏈表結構ngx_list_t (阿波)

nginx源碼分析—隊列結構ngx_queue_t (阿波)

nginx源碼分析—hash結構ngx_hash_t(v1.0.4) (阿波)

posted on 2012-07-02 17:14 飛天 閱讀(382) 評論(0)  編輯 收藏 引用

導航

統計

常用鏈接

留言簿(2)

隨筆分類

隨筆檔案

文章分類

文章檔案

Blogs

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            小黄鸭视频精品导航| 国产精品区一区| 久久精品最新地址| 欧美风情在线| 欧美+日本+国产+在线a∨观看| 久久不射电影网| 欧美一区二区视频免费观看| 久久se精品一区精品二区| 久久电影一区| 你懂的视频一区二区| 91久久国产自产拍夜夜嗨| 久久久久久久性| 免费久久99精品国产自| 亚洲黄色成人网| 99热精品在线| 亚洲免费一在线| 毛片av中文字幕一区二区| 欧美激情视频一区二区三区免费| 亚洲精品乱码久久久久久蜜桃91 | 欧美日韩国产一区| 欧美系列一区| 国产精品久久久久9999高清| 久久免费精品日本久久中文字幕| 国产日韩在线视频| 18成人免费观看视频| 夜夜嗨av一区二区三区网站四季av | 欧美高清视频| 久久手机精品视频| 91久久精品国产| 一本色道久久加勒比精品| 午夜精品福利一区二区蜜股av| 久久综合福利| 国产精品国产三级国产aⅴ浪潮| 国产欧美日韩在线| 99re亚洲国产精品| 午夜电影亚洲| 亚洲精品一区久久久久久| 午夜精品久久久久久久久久久久| 亚洲国产mv| 欧美在线观看视频一区二区三区| 欧美日韩中文字幕日韩欧美| 国色天香一区二区| 亚洲专区国产精品| 亚洲黄色在线| 亚洲视屏一区| 激情久久中文字幕| 久久精品二区亚洲w码| 亚洲国产成人tv| 久久视频国产精品免费视频在线| 国产精品一区二区三区四区 | 亚洲国产成人av| 久久精品欧美| 国产精品人人做人人爽| 日韩午夜视频在线观看| 亚洲大胆人体视频| 久久久久一区二区三区四区| 国产欧美日韩麻豆91| 亚洲一区二区三区午夜| 亚洲国产精品久久91精品| 乱人伦精品视频在线观看| 久久av一区| 国产一区二区三区视频在线观看| 欧美一级欧美一级在线播放| 在线一区观看| 国产精品久久久久久久久久三级 | 久久久99国产精品免费| 亚洲一区日韩在线| 国产精品久久亚洲7777| 亚洲欧美激情一区| 亚洲一区二区三区视频| 国产欧美一区二区精品仙草咪| 香蕉乱码成人久久天堂爱免费 | 亚洲国产精品电影| 欧美成人中文字幕| 欧美紧缚bdsm在线视频| 亚洲视频精品在线| 亚洲尤物在线| 久久一区二区精品| 日韩视频三区| 亚洲天堂视频在线观看| 国产亚洲精品久| 欧美大成色www永久网站婷| 女同一区二区| 亚洲欧美日韩在线高清直播| 免费观看在线综合色| 99riav国产精品| 亚洲一区二三| 依依成人综合视频| 日韩视频第一页| 国产欧美精品xxxx另类| 免费成人高清| 欧美日韩成人综合在线一区二区| 亚洲综合成人在线| 久久精品亚洲| 中国亚洲黄色| 久久久欧美精品| 亚洲欧美激情在线视频| 久久人人爽国产| 亚洲字幕一区二区| 女生裸体视频一区二区三区 | 精品999在线观看| 欧美激情中文字幕一区二区| 欧美吻胸吃奶大尺度电影| 99国产精品久久久久老师| 午夜精品久久久久久| 亚洲蜜桃精久久久久久久| 亚洲永久免费观看| 亚洲国产精品传媒在线观看| 欧美精品免费视频| 卡通动漫国产精品| 国产精品免费小视频| 最新亚洲激情| 亚洲国产91精品在线观看| 亚洲性人人天天夜夜摸| 99热在这里有精品免费| 久久视频国产精品免费视频在线| 亚洲欧美日韩精品一区二区| 另类亚洲自拍| 久久久免费观看视频| 国产精品日韩在线观看| 日韩视频永久免费观看| 亚洲欧洲视频| 蜜桃精品一区二区三区 | 亚洲精品激情| 久久精品国产久精国产爱| 欧美在线视频网站| 国产精品国产自产拍高清av王其 | 午夜一级久久| 亚洲字幕一区二区| 欧美视频二区36p| 亚洲精品国产精品久久清纯直播| 亚洲成人资源| 欧美午夜精品久久久久久浪潮| 欧美成人免费在线观看| 亚洲国产精品尤物yw在线观看| 久久久之久亚州精品露出| 噜噜噜噜噜久久久久久91| 黄色亚洲免费| 久久资源在线| 亚洲激情不卡| 一区二区三区高清在线| 欧美视频久久| 午夜视频久久久| 另类综合日韩欧美亚洲| 亚洲国产精品一区在线观看不卡| 久久人人97超碰精品888| 亚洲国产成人av| 亚洲色无码播放| 国产精品制服诱惑| 久久久一区二区| 日韩视频永久免费观看| 欧美一级夜夜爽| 一区二区三区在线观看国产| 国内精品视频在线播放| 久久国产精品久久久久久| 久久久久久久尹人综合网亚洲| 久久久精品999| 亚洲福利视频在线| 欧美激情1区2区3区| 日韩视频免费观看高清在线视频| 亚洲欧美日韩国产一区二区三区| 国产亚洲精品激情久久| 免播放器亚洲| 亚洲一区二区三区成人在线视频精品| av成人动漫| 欧美一级免费视频| 亚洲日本成人| 国产精品丝袜久久久久久app | 欧美一级欧美一级在线播放| 免费视频一区| 亚洲男人的天堂在线| 激情av一区二区| 欧美日韩一区二区视频在线| 欧美一区二区三区四区高清| 亚洲欧洲在线一区| 欧美在线黄色| 日韩视频在线观看一区二区| 国产精品尤物| 欧美日韩www| 久久久夜色精品亚洲| 中日韩男男gay无套| 欧美成人精品一区二区三区| 亚洲欧美综合精品久久成人| 蜜臀99久久精品久久久久久软件| 制服丝袜激情欧洲亚洲| 亚洲电影观看| 老鸭窝毛片一区二区三区 | 香蕉av福利精品导航| 亚洲黄色影院| 亚洲免费婷婷| 亚洲高清自拍| 韩国视频理论视频久久| 欧美午夜片在线观看| 欧美激情综合色综合啪啪| 久久久久88色偷偷免费| 午夜精品福利视频| 亚洲视频免费在线| 日韩视频在线你懂得| 欧美不卡高清| 麻豆久久精品|