天天看點

nginx啟動過程分析

      nginx的啟動過程緊緊圍繞着ngx_cycle_t的結構體展開,首先通過ngx_get_options()擷取指令行參數,然後通過ngx_time_init()進行時間的初始化,如全局變量ngx_cached_time;再通過ngx_regx_init()完成正則的初始化,通過ngx_log_init()建立日志對象,初始化日志,如初始化全局變量ngx_prefix,打開日志檔案ngx_log_file.fd;通過ngx_create_pool()建立記憶體池,大小為1024B;ngx_save_argv()儲存指令行參數至全局變量ngx_os_argv、ngx_argc、ngx_argv;通過ngx_process_options()處理init_cycle中的配置檔案路徑,初始化ngx_cycle的prefix, conf_prefix, conf_file, conf_param等字段;ngx_os_init()完成作業系統的一些資訊的擷取,如記憶體頁面大小、系統限制資源等資訊,将其儲存在對應的全局變量中,通過ngx_crc32_table_init()初始化一個循環備援校驗表,為後面高效查找循環備援做準備;通過ngx_add_inherited_sockets:通過環境變量

  • 解析環境變量NGINX_VAR="NGINX"中的sockets,并儲存至ngx_cycle.listening數組;
  • 設定ngx_inherited=1;
  • 調用ngx_set_inherited_sockets()逐一對ngx_cycle.listening數組中的sockets進行設定;

然後對子產品數組中的各子產品進行編号,繼而調用ngx_init_cycle()完成對ngx_cycle_t類型變量cycle的初始化,在ngx_init_t中做的事情如:

nginx啟動過程分析

     之後,根據條件調用 ngx_signal_process()對程序信号處理,通過ngx_os_status()擷取作業系統的狀态資訊,讀取配置檔案的資訊,

  • 若有信号,則進入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程序啟動>;

參考:http://blog.csdn.net/livelylittlefish/article/details/7243718

繼續閱讀