1. 程式人生 > >一深入理解Nginx的 模組化 ,全域性觀

一深入理解Nginx的 模組化 ,全域性觀

Nginx原始碼目錄結構

.
├── auto            自動檢測系統環境以及編譯相關的指令碼
│   ├── cc          關於編譯器相關的編譯選項的檢測指令碼
│   ├── lib         nginx編譯所需要的一些庫的檢測指令碼
│   ├── os          與平臺相關的一些系統引數與系統呼叫相關的檢測
│   └── types       與資料型別相關的一些輔助指令碼
├── conf            存放預設配置檔案,在make install後,會拷貝到安裝目錄中去
├── contrib         存放一些實用工具,如geo配置生成工具(geo2nginx.pl)
├── html            存放預設的網頁檔案,在make install後,會拷貝到安裝目錄中去
├── man             nginx的man手冊
└── src             存放nginx的原始碼
    ├── core        nginx的核心原始碼,包括常用資料結構的定義,以及nginx初始化執行的核心程式碼如main函式
    ├── event       對系統事件處理機制的封裝,以及定時器的實現相關程式碼
    │   └── modules 不同事件處理方式的模組化,如select、poll、epoll、kqueue等
    ├── http
nginx作為http伺服器相關的程式碼 │ └── modules 包含http的各種功能模組 ├── mail nginx作為郵件代理伺服器相關的程式碼 ├── misc 一些輔助程式碼,測試c++頭的相容性,以及對google_perftools的支援 |—— stream nginx支援傳輸層的 協議:如TCP、UDP協議,UNINX域socket。這個模組是在nginx1.9以後版本才有的。 └── os 主要是對各種不同體系統結構所提供的系統函式的封裝,對外提供統一的系統呼叫介面。

Nginx模組的型別

關於這個分類,大家各說風雲:

  • 1.event module:搭建 獨立於作業系統的事件處理機制的框架,以及 提供各種具體事件的處理。包括ngx_events_module,ngx_event_core_module,ngx_epoll_module等。nginx 具體 使用何種事件處理 模組,這 很大依賴具體的作業系統和編譯選項。
  • 2.phase handler:此型別模組也被直接稱為handler模組,主要負責處理客戶端請求併產生待響應的內容,比如ngx_http_static_moduler模組,負責客戶端的靜態頁面請求處理並將對應的磁碟 檔案準備為響應內容輸出。
  • 3.output filter:也稱為filter模組,主要 負責處理輸出的內容,包括修改輸出內容,可以實現對輸出的所有的 html的 頁面新增 預定義的footbar一類的工作,或者對輸出的 圖片的URL進行替換的 工作。
  • 4.upstream:upstream模組實現反向代理,將真正的請求 轉發到伺服器上,並 從後端伺服器上讀取響應,發回客戶端。upstream模組 是一種特殊的handler,只不過響應內容也不是真正由自己產生的,而是從後端伺服器上讀取的。
  • 5.load-balancer:負載均衡模組,實現特定的 演算法,在 眾多的後端 伺服器中,選擇一個伺服器出來作為某個請求的轉發伺服器。

配置模組的設計

這裡寫圖片描述

配置模組是所有 模組的基礎,它實現了最基本的配置項 的解析功能(也就是解析 nginx.conf)
核心模組的型別是ngx_core_module

核心 模組的定義

typedef struct {
    ngx_str_t             name;  //核心模組名稱
    void               *(*create_conf)(ngx_cycle_t *cycle);  //解析配置項前,Nginx框架會呼叫create_conf方法
    char               *(*init_conf)(ngx_cycle_t *cycle, void *conf); //解析配置項後,Nginx框架會呼叫init_conf方法
} ngx_core_module_t;

Nginx模組的載入

  • 1.Nginx模組 是 被編譯進入Nginx,並不像Apache那樣去編譯一個so檔案,在配置裡面指定是否載入。
  • 2.解析配置檔案時,Nginx的各個模組都有機會去接手處理某個請求,但是URL請求的模組只能有一個 。
  • 3.Nginx啟動時框架的處理流程
    這裡寫圖片描述
    建議對比這篇部落格一起看Ngnix 的程式碼分析

Nginx模組的主要輪廓

nginx_outline

相關推薦

深入理解Nginx模組 全域性

Nginx原始碼目錄結構 . ├── auto 自動檢測系統環境以及編譯相關的指令碼 │ ├── cc 關於編譯器相關的編譯選項的檢測指令碼 │ ├

深入理解NGINX 模組開發與架構解析》之摘抄學習

1.基於Nginx框架開發程式有5個優勢:     (1).Nginx將網路、磁碟及定時器等非同步事件的驅動都做了非常好的封裝,基於它開發將可以忽略這些事件處理的細節;     (2).Nginx封裝了許多平臺無關的介面、容器,適用於跨平臺開發。

推薦我的新書《深入理解Nginx:模組開發與架構解析》

.2.1 執行中的nginx程序間的關係 / 28  2.2 nginx配置的通用語法 / 31  2.2.1 塊配置項 / 31  2.2.2 配置項的語法格式 / 32  2.2.3 配置項的註釋 / 33  2.2.4 配置項的單位 / 33  2.2.5 在配置中使用變數 / 33  2.3 ngin

深入理解Nginx 模組開發與架構解析》筆記之epoll事件模組

epoll Linux epoll Linux epoll工作模式 水平觸發LT 邊緣觸發ET       前者是預設的,可以處理阻塞和非阻塞套接字,後者只能處理非阻塞套接字。 Linux epoll原理       如上

深入理解Nginx 模組開發與架構解析-陶輝 讀書筆記

前言 1. nginx是一個優秀的事件驅動框架,nginx非常適合開發在傳輸層以TCP對外提供服務的伺服器程式。基於nginx框架開發程式有5個優勢: * nginx將網路、磁碟及定時器等非同步事件的驅動都做了非常好的封裝,基於它開發將可以忽略這些事情處理的細節 * ng

深入理解JavaScript模組程式設計:RequireJS

1、開篇的話 之前寫過一篇JavaScript模組化程式設計,當時是結合自己做的東西來寫的,比著葫蘆畫瓢。現在回過頭來看,依然有些不是太理解的地方,現在重新寫個小例子,加深自己的理解。JavaScript模組化概念及重要性以及RequireJS的好處就不介紹了

三:深入理解Nginx模組 (結合原始碼詳解)

盜用前面用到的流程圖 第二步實際上是呼叫 ngx_add_inherited_sockets() //檔名: Nginx.c int ngx_cdecl main(int argc,

深入理解Nginx模組開發與架構解析

讀書筆記 第一部分         Nginx能幫我們做什麼 第1章 研究Nginx前的準備工作         1.1Nginx是什麼         1.2

前端模組元件和工程化的理解

前端工程化 前端工程化我認為就是將前端專案當成一項系統工程進行分析、組織和構建從而達到項 目結構清晰、分工明確、團隊配合默契、開發效率提高的目的。 工程化是一種思想而不是某種技術(當然為了實現工程化我們會用一些技術) 在一個大型web專案中往往有更加複雜的結構和非常多的頁面需要很多人甚至

深入理解Nginx》閱讀與實踐():Nginx安裝配置與HelloWorld

#include <ngx_config.h> #include <ngx_core.h> #include <ngx_http.h> static char* ngx_http_mytest(ngx_conf_t *cf,ngx_command_t *cmd,

深入理解Nginx模組開發與架構解析 讀書筆記

Nginx的作用 當我們在設計高效能web伺服器的時候,我們第一選擇是使用Nginx,因為nginx對伺服器效能上的挖掘已經到了非常高的水平,Nginx採用了無阻塞分階段的事件驅動框架。當nginx不能那個完全實現我們的業務需求的時候,我們可以在Nginx後端搭建一個非ng

效能測試:深入理解執行緒數併發量TPS看這篇就夠了

併發數,執行緒數,吞吐量,每秒事務數(TPS)都是效能測試領域非常關鍵的資料和指標。 那麼他們之間究竟是怎樣的一個對應關係和內在聯絡? 測試時,我們經常容易將執行緒數等同於表述為併發數,這一表述正確嗎? 本文就將對效能領域的這些關鍵概念做一次探討。 文章可能會比較長,希望您保持耐心看完。   1.

七天學會ASP.NET MVC ()——深入理解ASP.NET MVC

button點擊 工具 建行 嘗試 studio 深入 matching 學會 場景 ASP.NET vs MVC vs WebForms 許多ASP.NET開發人員開始接觸MVC認為MVC與ASP.NET完全沒有關系,是一個全新的Web開發,事實上ASP.NET是創建WE

轉載:2.2.3 配置項的註釋《深入理解Nginx》(陶輝)

href 深入 logs class tps 註釋 配置 blog bsp 原文:https://book.2cto.com/201304/19628.html如果有一個配置項暫時需要註釋掉,那麽可以加“#”註釋掉這一行配置。例如:#pid logs/ngi

轉載:2.2.5 在配置中使用變量《深入理解Nginx》(陶輝)

依賴 con com 關註 部分 自己 core stat sent 原文:https://book.2cto.com/201304/19630.html 有些模塊允許在配置項中使用變量,如在日誌記錄部分,具體示例如下。log_format main ‘$r

深入理解並發/並行阻塞/非阻塞同步/異步【轉】

非阻塞 n) 做的 耗時 非阻塞socket 衣服 時間片輪轉 輪轉 理解 1、阻塞,非阻塞 首先,阻塞這個詞來自操作系統的線程/進程的狀態模型中,如下圖: 一個線程/進程經歷的5個狀態,創建,就緒,運行,阻塞,終止。各個狀態的轉換條件如上圖,其中有個阻塞狀態,就是

深入理解java虛擬機類加載

深入理解java nal ava 直接 成員 進制 地址 lang 變量賦值 1,通過使用靜態字段,只有真正定義這個字段的類才會被初始化,(子類不初始化,父類初始化 2,new數組,不初始化 3,通過類來調用一些類的常量,可以不初始化類,(常量在編譯期,被優化到NotIni

深入理解並發/並行阻塞/非阻塞同步/異步

text 只有一個 ima UNC 不同 比較 callback 調度 狀態 首先,阻塞這個詞來自操作系統的線程/進程的狀態模型中,如下圖 : 一個線程/進程經歷的5個狀態,創建,就緒,運行,阻塞,終止。各個狀態的轉換條件如上圖,其中有個阻塞狀態,就是說當線程中調用某個函

深入理解spark-taskSchedulerschedulerBackend源碼分析

cluster create for available 常用 scala ini div row 上次分析了dagshceduler是如何將任務拆分成job,stage,task的,但是拆分後的僅僅是一個邏輯結果,保存為一個resultstage對象,並沒執行;

url模組include函式的使用

urls的模組化 當我們的專案越做越大時,那麼url就會變得越來越多,如果都放在主’urls.py‘檔案中,那麼將不太好管理,因此我們可以將每個app自己的urls放到自己的app中進行管理。一般我們會在app中新建一個urls.py檔案用來儲存所有和這個app相關的子url。(檔名可以