文章2 nginx啟動過程之main函式

2021-07-04 05:44:05 字數 2956 閱讀 5389

本文主要是nginx啟動過程中關於main函式部分的初始化。

-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_get_options中獲得這些引數取值賦值到ngx_cycle中。包括:ngx_cycle中的conf_prefix,prefix,conf_file,conf_param,log->log_level等。

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...