首頁>技術>

目錄

nginx應用及開發

openresty如何擴充套件nginx的功能

openresty實戰案例講解

openresty簡介

openresty是一個基於nginx與lua的高效能web平臺,其內部集成了大量精良的lua庫、第三方模組以及大數的依賴項。用於方便搭建能夠處理超高併發、擴充套件性極高的動態web應用、web服務和動態閘道器·openresty透過匯聚各種設計精良的nginx模組,從而將nginx有效地變成一個強大的通用Web應用平臺。這樣,Web開發人員和系統工程師可以使用Lua指令碼語言調動Nginx支援的各種C以及Lua模組,快速造出足以勝任10K乃至1000K以上單機併發連線的高效能Web應用系統。·openresty的目標是讓你的Web服務直接跑在Nginx服務內部,充分利用Nginx的非阻塞1/0模型,不僅僅對HTTP客戶端請求,甚至於對遠端後端諸如MySQL、PostgreSQL、Memcached以及Redis等都進行致的高效能響應。

nginx應用及開發

靜態web服務

反向代理(伺服器)

正向代理(客戶端)

比如這裡是我們客戶端,這裡是nginx,大家都知道在國內youtube,google訪問不了,nginx可以去訪問youtube和google,客戶端client不能直接去訪問youtube和google,那麼我們可以連結nginx,nginx這個伺服器所在的網端它可以去訪問youtube,google,它代理的我我們客戶端,

<img src="/users/xiefan/Library/Application support/typora-user-images/image-20210109201911770.png"alt-"image-20210109201911770"style-"zoom:50%;"/>

負載均衡

nginx實現負載均衡又是什麼樣的一個流程呢如圖

<img src="/users/xiefan/Library/Application Support/typora-user-images/image-20210109202223731.png"alt="image-20210109202223731"style-"zoom:50%;"/>
nginx開發

openresty可以使用Lua指令碼語言調動Nginx支援的各種C以及Lua模組,

模組開發 handle開發

首先需要了解nginx幾個基本概念,先從http請求觸發分為11個階段,我們怎麼對11個階段做處理呢,在這裡它會有個狀態機,我們內部nginx會根據狀態機的狀態去切換,對我們這11個階段切換,

每一個階段裡有一個責任連結串列模式,在這裡有多個handle處理(如下圖)

handle連結起來依次的處理。

過濾器開發

過濾模組可以疊加,也就是說一個請求會被所有的HTTP過濾模組依次處理。

過濾模組的呼叫是有順序的,它的順序在編譯的時候就決定了。控制編譯的指令碼位於auto/modules中,當你編譯完Nginx以後,可以在objs目錄下面看到一個ngx_modules.c的檔案。開啟這個檔案,有類似的程式碼:

ngx_module_t *ngx_modules[] = {...&ngx_http_write_filter_module,&ngx_http_header_filter_module,&ngx_http_chunked_filter_module,&ngx_http_range_header_filter_module,&ngx_http_gzip_filter_module,&ngx_http_postpone_filter_module,&ngx_http_ssi_filter_module,&ngx_http_charset_filter_module,&ngx_http_userid_filter_module,&ngx_http_headers_filter_module,&ngx_http_copy_filter_module,&ngx_http_range_body_filter_module,&ngx_http_not_modified_filter_module,NULL};

從write_filter到not_modified_filter,模組的執行順序是反向的。也就是說最早執行的是not_modified_filter,然後各個模組依次執行。所有第三方的模組只能加入到copy_filter和headers_filter模組之間執行。

在編譯Nginx原始碼時,已經定義了一個由所有HTTP過濾模組組成的單鏈表,這個單鏈表是這樣的:

連結串列的每一個元素都是一個C原始碼檔案,這個C原始碼檔案中有兩個指標,分別指向下一個過濾模組(檔案)的過濾頭部和包體的方法(可理解為連結串列中的next指標)

過濾模組單鏈表示意圖:

總結,

首先openresty是基於nginx+lua的,大家有沒有去想過nginx和lua是如何結合的?也就是nginx為什麼會執行lua程式碼?這也是我想第一給大家介紹的內容,nginx是c寫的web服務,所以nginx+lua其實就是c語言呼叫lua的過程。這個過程不是春哥發明的,這是lua本身具有c的lib包,能夠讓c去解析lua的程式碼並執行,

10
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 探索 .NET團隊對API的設計流程