本文主要是nginx啟動過程中關於main函式部分的初始化。
用來將ngx_get_options中獲得這些引數取值賦值到ngx_cycle中。包括:ngx_cycle中的conf_prefix,prefix,conf_file,conf_param,log->log_level等。-g ngx_conf_params
執行命令
執行完ngx_get_options後,全域性變數
./nginx -c /usr/local/nginx/conf/nginx.conf
u_char* ngx_conf_file = " /usr/local/nginx/conf/nginx.conf"
$./nginx -s stop
u_char * ngx_signal = "stop"
$./nginx -s reload
u_char * ngx_signal = "reload"
$./nginx -t -c /usr/local/nginx/conf/nginx.conf
$./nginx -h
ngx_show_version = 1 ngx_show_help = 1;
$./nginx -v
ngx_show_version = 1; ngx_show_configure = 1;
$./nginx -p /usr/local/nginx
ngx_prefix = /usr/local/nginx 。
ngx_prefix指定nginx工作目錄。其error.log及nginx.conf都會在該目錄下被找到。
ngx_prefix會在多處使用:1)ngx_log_init中2)在ngx_process_options中會其ngx_prefix的取值賦值給ngx_cycle的conf_prefix和prefix成員變數。
ngx_cycle = &init_cycle;
$./nginx -p /usr/local/nginx 則ngx_argv陣列儲存argv中資訊,ngx_argc儲存argc資訊。則ngx_argc = 3 ngx_argv[0] = /usr/local/nginx/sbin/nginx
ngx_argv[1]=-p
ngx_argv[2]=/usr/local/nginx
獲得ngx_pagesize,ngx_ncpu,ngx_max_sockets,ngx_inherited_nonblocking等資訊。
將繼承的套接字新增到ngx_cycle的listening array中。但是啥是繼承套接字啊 不知道了~~參考文章nginx原始碼分析—處理繼承的sockets and 執行和控制 nginx - 命令列引數和訊號 繼承套接字用於程式的熱啟動。
因為它確定了每個module在ngx_module陣列中的位置。ngx_module_t中index指示這個module在ngx_module陣列中的位置。nginx在編譯的時候會生成乙個目錄objs,該目錄下有乙個檔案ngx_modules.c,該檔案中 有ngx_module陣列。比如ngx_core_module的index為0.
ngx_max_module = 0;
for (i = 0; ngx_modules[i]; i++)
這是初始化過程中非常重要的乙個初始化函式。
cycle = ngx_init_cycle(&init_cycle);
ngx_cycle = cycle;
ngx_init_cycle主要做了以下工作,利用old_cycle建立乙個新的new_cycle。
1)將old_cycle中成員變數賦值給new_cycle的成員變數
2)為new_cycle中的一些成員變數分配空間
3)依次呼叫ngx_core_module模組的create_conf鉤子函式,
4)呼叫ngx_conf_param和ngx_conf_parse函式解析,將配置檔案nginx.conf中關於core模組的指令存入相應的變數中。
5)開啟cycle_open_files中檔案
6)建立共享記憶體區
7)操作監聽套接字。非常關鍵的一步。
8)呼叫每個模組的init_module鉤子函式
9)關閉和刪除old_cycle中的一些成員。
主要就是做了這麼幾件事情:(1)core模組配置的檔案的解析,將其存入程式的相應變數中(2)建立共享記憶體區 (3)監聽套接字的處理 (4)呼叫每個模組的init_module函式
首先:從存放pid的檔案中讀取pid 然後關閉檔案
其次:進入ngx_os_signal_process
遍歷signal陣列,找到匹配的訊號並通過kill 將訊號傳遞給程序,讓程序根據訊號做相應處理。kill並不是殺死的意思,kill是傳遞訊號的意思。
if (ngx_signal)
通過sigaction函式設定signal陣列中與指定訊號相關聯的處理動作。這兒詳見文章2:nginx中與訊號相關的內容
對於沒有繼承套接字並且配置檔案中daemon on;時,呼叫ngx_daemon,建立守護程序。這兒是建立守護程序的標準做法。在apue中有說明。
的獲取在main函式中
if (ccf->master && ngx_process == ngx_process_single)
最後根據ngx_process是單程序還是多程序,分別呼叫不同的cycle
if (ngx_process == ngx_process_single) else
參考文章
2啟動過程原始碼
目錄 2run 2.1獲取run方法的 eventpublishingrunlistener 2.2準備環境 prepareenvironment 2.4獲取springbootexceptionreporter 2.5準備容器preparecontext 2.6refresh this.resou...
Linux核心啟動過程 之三
start kernel 程式用於初始化系統核心的各個部分,包括 設定記憶體邊界,呼叫paging init 初始化記憶體頁面。初始化陷阱,中斷通道和排程。對命令列進行語法分析。初始化裝置驅動程式和磁碟緩衝區。校對延遲迴圈。前面兩篇,喬遷已經很詳細的分析了核心的啟動過程,最終核心將跑到rest in...
Docker 2 Linux啟動過程
linux etc rc.d 在後台啟動的程式在這個檔案架子中 run command daemon 精靈程序,後台程序,啟動過程看不到的程序,在後台默默啟動的程序 etc modules 執行rc.d資料夾中的程式之後,會把這個modules檔案中的模組引入,比如網路模組,硬碟模組 run lev...