nginx中獲取配置通常我們使用以下巨集
對於第一種我們通常是在解析配置的過程中使用,
其中cf->ctx即為在解析過程中(http,server,location)建立的,分別指向main_conf中各個模組的指標,這種方法呼叫比較容易理解。
對於第二種就比較複雜了
首先我們需要知道r->main_conf指向的是**?
在ngx_http_create_request函式中分別對***_conf賦值
r->main_conf = hc->conf_ctx->main_conf;
r->srv_conf = hc->conf_ctx->srv_conf;
r->loc_conf = hc->conf_ctx->loc_conf;
那再往回推,hc->conf_ctx又指向的是**呢?
在ngx_http_init_connection函式中hc->conf_ctx = hc->addr_conf->default_server->ctx;
再往上看可以看到 port = c->listening->servers; addr = port->addrs; hc->addr_conf = &addr[0].conf;
再往上看ngx_event_process_init中ls = cycle->listening.elts; c->listening = &ls[i];
那cycle->listening又是怎麼來的?
需要先說下執行http的set函式時,最後乙個步驟是ngx_http_optimize_servers,
該函式即是對於server管理的入口函式
第乙個引數cf為main函式傳遞下來的cf,不過cf->ctx為http_block函式申請的空間
第二個引數cmcf即為main_conf中core_module的指標,
第三個引數為cmcf->ports
該函式的處理流程是:
會遍歷cmcf->ports,那對於cmcf->ports是什麼時候建立以及賦值的呢?
首先看下listen的相關處理
listen關鍵字的處理函式為:ngx_http_core_listen
函式呼叫為:ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
引數分別為:
cf,listen是在server裡面,所以cf的main_conf以及srv_conf都為server裡面建立的
cmd即為listen關鍵字的cmd
conf為server裡面建立的srv_conf首位址,listen的conf為ngx_http_srv_conf_offset
中間就是解析listen後面的一些選項,接下來呼叫ngx_http_add_listen函式
函式呼叫形式為ngx_http_add_listen(cf, cscf, &lsopt)
cf和上面的cf
cscf和conf一樣
lsopt為listen後面攜帶的選項解析儲存的值
該函式執行流程為:
獲取在server層級的main_conf(同時也是http層級的main),如果是第一次則cmcf->ports分配空間
呼叫ngx_http_add_address,
如果port已經add過了 ,呼叫方式為:ngx_http_add_addresses(cf, cscf, &port[i], lsopt)
第乙個引數cf沒有做過修改,
第二個引數cscf指向的是srv_config
第三個引數是已經設定了該埠的port位址
說明:cmcf->port是乙個ngx_array_t型別的指標,它的elt是ngx_http_conf_port_t型別;
裡面的port值儲存的是port的數值,(最外層儲存的是port數字,也就是說以監聽埠做為最外層的唯一標識)
port裡面的addrs同樣也是乙個ngx_http_array_t,它的elt是ngx_http_conf_addr_t。
第四個引數lsopt為傳遞過來的引數
如果port還沒有add過,呼叫方式為:ngx_http_add_address(cf, cscf, port, lsopt)
第乙個引數cf沒有做過修改,
第二個引數cscf指向的是srv_config
第三個引數port為在cmcf->ports上面新新增的item,cmcf->ports為乙個ngx_array_t型別
第四個引數lsopt為傳遞過來的引數
呼叫形式為ngx_http_add_address(cf, cscf, port, lsopt)
該函式主要是把lsopt裡面的資訊存放到port裡面的addrs,addrs是乙個ngx_array_t型別
addr = ngx_array_push(&port->addrs);
addr->servers.elts = null;
需要說明的是:addr->default_server = cscf;在port裡面新新增的item的default_servers指向的是cscf,也就是server裡面的ctx
接下來呼叫ngx_http_add_server(cf, cscf, addr)
把當前的cscf加入到addr->servers。
接下來繼續回到ngx_http_optimize_servers函式
該函式會遍歷cmcf->ports,
遍歷每個port的addrs,nginx官方給的注釋是:檢查和defaultserver有無相同配置ip和埠。呼叫ngx_http_server_names函式
該函式的呼叫方式為:ngx_http_server_names(cf, cmcf, &addr[a])
第乙個引數cf,cf->ctx指向的是server裡面建立的ctx
第二個引數cmcf,指向的是main_conf
第三個引數&addr[a],指向的是cmcf->port->addrs裡面的每個addr
該函式主要就是對addr裡面的一些變數進行初始化以及對regex賦值
接著呼叫ngx_http_init_listening函式
該函式的呼叫形式為:ngx_http_init_listening(cf, &port[p])
第二個引數即為當前的port
呼叫ngx_http_add_listening函式,把每個port裡面的addr加進去,在該函式裡面呼叫了ngx_create_listening函式,ngx_create_listening函式裡面會把當前addr裡面的資訊新增到cf->cycle->listening,這就是新增listening的地方。
接著申請了一塊ngx_http_port_t空間,通過呼叫ngx_http_add_addrs把addr新增進hport的addrs裡面,呼叫ngx_clone_listening為每個程序新增乙個ls,什麼時候用還不清楚。
那到目前為止,文章最開始的問題都解決了,
也就是在呼叫ngx_http_create_request之前,r->main_conf,srv_conf,loc_conf都是指向的是server建立的,這個顯然不是正確的,接下來怎麼調整指向,另外一篇文章接著分析。
安裝nginx配置過程
1.安裝 brew install nginx2.啟動nginx sudo nginx3.驗證是否安裝 4.檢視nginx的相關資訊 5.重啟nginx sudo nginx s reload6.停止nginx sudo nginx s stop7.配置過程中遇到的錯誤 1 mac上啟動nginx報...
nginx配置過程詳解
1.進入伺服器 輸入伺服器位址 ssh admin 2.輸入秘密 admin 按回車,進入伺服器 3.輸入 cd etc nginx vhost 進入vhost 按回車 ps 如何檢視nginx的config檔案在 命令 locate nginx.conf 可以看到有三個文件,我們在使用的一般是第乙...
配置nginx 執行CGI Perl cgi
筆者的nginx安裝目錄為 usr local nginx 虛擬機器配置檔案為 usr local nginx conf vhosts.conf 目前php fast cgi已支援 以下操作均在su下完成 安裝perl cgi模組 wget tar zxvf fcgi 0.67.tar.gz cd ...