1. 程式人生 > >nginx 配置解析(11)——merge

nginx 配置解析(11)——merge

以前我們詳細了分析了 nginx 配置解析的各個過程,尤其是各種 conf 結構的建立、初始化、儲存。那麼現在我們要分析下 merge 的過程,一來它確實是配置解析過程的一個部分,二來我們可以檢驗下我們對各種 conf 結構儲存的位置是否真正的清晰明瞭。

首先我們瞭解下 merge 的背景:

  1. 所謂 merge 操作,就是合併內外層的配置。大體原則是:如果內層沒有配置,那麼以外層為準,如果都沒有配置,那麼就用預設值;
  2. NGX_CORE_MODULE 模組的 ctx(ngx_core_module_t)是沒有 merge 操作的,所以像 http 塊這一層的配置是不需要和上一層去 merge 的,想想也明白為什麼,http 哪來的上一層呢?
  3. NGX_HTTP_MODULE 模組的 ctx(ngx_http_module_t)是有 merge 操作的,但是僅僅有 merge_srv_conf 和 merge_loc_conf,同理對 main 層不需要 merge;
  4. merge 操作發生的時機是在 ngx_http_block函式中(即 http 塊解析函式),在遞迴呼叫 ngx_conf_parse 之後。這是為了讓 http 塊之內所有的指令都解析結束,然後再去做 merge 操作;
  5. 不同層級塊的邏輯關係,基本上都是放在 ngx_http_core_module 這個模組的不同級別的 conf 中,在 merge 中會頻繁用到。

來看看 ngx_http_block 中的一段:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 for (m = 0; ngx_modules[m]; m++) { if (ngx_modules[m]->type != NGX_HTTP_MODULE) { continue; }    module = ngx_modules[m]->ctx; mi = ngx_modules[m]->ctx_index;
/* init http{} main_conf's */ if (module->init_main_conf) { rv = module->init_main_conf(cf, ctx->main_conf[mi]); if (rv != NGX_CONF_OK) { goto failed; }    }    rv = ngx_http_merge_servers(cf, cmcf, module, mi); if (rv != NGX_CONF_OK) { goto failed; }    }

再明顯不過了,init 了 main,merge 了 server。 這裡的處理流程是個 for 迴圈,每次的迭代物件是模組本身,也就是挨個模組的去處理 merge。

在進入 ngx_http_merge_servers 內部分析之前,我們先確認一下這些代入的引數:

  1. cf 是代入的引數,但是我們真正關心的還是 cf->ctx,這個時候它其實就是 http 塊的三元組(代入 ngx_http_block 的時候還不是,但是在函式中賦值了);
  2. cmcf 這個 http 塊的 ngx_http_core_module 的 main_conf 結構;
  3. module 是個迴圈獲取的,代表當前模組;
  4. mi 就是當前模組在 NGX_HTTP_MODULE 模組中的 index;

這裡很奇怪的就是並沒有明確指出 merge loc_conf 的地方,我們推測它是在 ngx_http_merge_servers 中實現的,那麼我們具體的分析下它的程式碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

相關推薦

nginx 配置解析11——merge

以前我們詳細了分析了 nginx 配置解析的各個過程,尤其是各種 conf 結構的建立、初始化、儲存。那麼現在我們要分析下 merge 的過程,一來它確實是配置解析過程的一個部分,二來我們可以檢驗下我們對各種 conf 結構儲存的位置是否真正的清晰明瞭。 首先我

Nginx配置3

spdy jpg ipv6 web服務 lag prot 接受 文件系統 安裝 安裝方法: rpm及源碼安裝: # ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf

kafka系列之broker重點配置解析

kafka broker 配置 對應kafka安裝目錄config/server.properties檔案的配置 broker.id 每一個Kafka的broker都有一個整數的標識。我們設定broker.id來標識它。預設這個整數是0。這

Nginx實用教程配置文件入門

affinity type 服務 源碼編譯 設置時間 shutdown ber 可用 控制指令 Nginx配置文件結構 nginx配置文件由指令(directive)組成,指令分為兩種形式,簡單指令和區塊指令。 一條簡單指令由指令名、參數和結尾的分號(;)組成,例如:

Nginx實用教程:啟動、停止、重載配置

style 負載 繼續 local con doc lin 配置文件的修改 tex Nginx是一個功能強大的web服務器和負載均衡軟件,由俄羅斯人開發。Nginx包括一個master進程和數個worker進程,master進程用於讀取、解析配置文件和管理worker進程,

nginx的文件cache服務配置記錄proxy_cache

pan orm java conn efault out clu key oct 根據業務部門需求,申請一臺文件的cache服務器。如下記錄在單臺機器上部署Nginx緩存服務過程: nginx緩存配置(緩存配置的參數這裏就不做過多解釋了,在前面的文檔中已說明過,這裏只做

Nginx 學習筆記個人網站的Https配置

ast 請求重定向 nginx nta pda opera 配置虛擬主機 location cat 一、系統環境 1、系統:Ubuntu 16.04.2 LTS 2、WEB服務器:Openresty11.2.5 二、開始配置 1、獲取certbot客戶端 wget htt

使用Keepalived配置主從熱備實現Nginx高可用HA

_id keep 過去 基礎 inter icmp interval RR 轉發 Keepalived 簡要介紹 Keepalived 是一種高性能的服務器高可用或熱備解決方案,Keepalived 可以用來防止服務器單點故障的發生,通過配合 Nginx 可以實現 w

Spring 源碼解析加載配置文件2

文件 pla eager useful customize string protected rop orm 接上一章,我們來具體分析下configureAndRefreshWebApplicationContext(ConfigurableWebApplicationCo

Nginx訪問日誌access_log配置

location 緩沖區 per 防盜鏈 rem mime pes erro error Nginx訪問日誌主要有兩個參數控制 log_format #用來定義記錄日誌的格式(可以定義多種日誌格式,取不同名字即可) access_log #用來指定日至文件的路徑及使用的何種

Nginx入門篇之虛擬主機配置

dex 三種 ifconf lag php 創建 body 基於 vhosts 一、虛擬主機概念   所謂虛擬主機,在Web服務當中就是一個獨立的網站站點,這個站點對應獨立的域名(也有可能是IP或者端口),具有獨立的程序和資源目錄,可以獨立地對外提供服務供用戶訪問。  

軟件設計師考試18年上半年上午考試真題及解析11~15題

mil 需求 上半年 類圖 cmm 工具 src font 獨立 11.能力成熟模型集成(CMMI)是若幹過程模型的綜合和改進。連續式模型和階段式模型是CMMI提供的兩種表示方法。連續式模型包括6個過程域能力等級(Capability Level,CL)其中(30)的共性

nginx與tomcat nginx.conf解析

一. nginx.conf配置檔案解析 主要分為五個部分 全域性設定:main http設定:http server設定:server 匹配url路徑:location 其他配置段:event,upstream 全域

JavaEE-SSM:007 Mybatis的配置檔案解析4

1.系統級別的typeHandler   2.自定義typeHandler   想要自己實現typeHandler,需要實現TypeHandler<T>介面,T就是你要轉換的Java型別 setParameter(PreparedSta

JavaEE-SSM:006 Mybatis的配置檔案解析3

別名主要用於Mapper的xml檔案指定輸入型別或者返回結果型別的名稱的時候,替代全限定名。(前文已經提及如何使用別名)   1.系統級別的typeAlias(類型別名)     2.自定義別名   這裡的alias屬性值得是

JavaEE-SSM:005 Mybatis的配置檔案解析2

setting配置不常用,給出配置說明:     本文給出Setting配置的全量程式碼:   <settings> <setting name="cacheEnabled" value="true"

JavaEE-SSM:004 Mybatis的配置檔案解析1

1.配置項:不可顛倒順序     2.Properties配置   好處就是:一處配置,多處使用。當然不嫌麻煩,直接配置,不使用property也是可以的。 在Properties下配置相關的配置Property:name是引用的時候的名稱

JavaEE-SSM:009 Mybatis的配置檔案解析6

檔案型別轉換器(不常用)   假設資料庫有blob格式的欄位儲存需求: 對應著POJO的byte陣列: ResultMap中有對應的typeHandler配置:   當然,我們可以在POJO中使用InputStream替代byte陣列,但

JavaEE-SSM:008 Mybatis的配置檔案解析5

1.系統級列舉typeHandler--EnumOridinalTypeHAndler 資料庫儲存為數字 //建立一個列舉 public enum SexEnum { MALE(1,"男"), FEMALE(0,"女"); private int id;

C語言面向物件程式設計:配置檔案解析6

在實際專案中,經常會把軟體的某些選項寫入配置檔案。 Windows 平臺上的 INI 檔案格式簡單易用,本篇文章利用《C語言面向物件程式設計(五):單鏈表實現》中實現的單鏈表,設計了一個“類” ini_parser 來讀寫 INI 格式的配置檔案。