1. Nginx的簡(jiǎn)介
相關(guān)內(nèi)容柴墩,可以查看 【Nginx 負(fù)載均衡】鹃彻,這是我之前的一篇文章,這里就懶得再說(shuō)明一次了。
2. ngx_lua模塊
Nginx模塊需要用C開(kāi)發(fā)吸申,而且必須符合一系列復(fù)雜的規(guī)則锦聊,最重要的用C開(kāi)發(fā)模塊必須要熟悉Nginx的源代碼歹嘹,使得開(kāi)發(fā)者對(duì)其望而生畏。
ngx_lua模塊通過(guò)將lua解釋器集成進(jìn)Nginx孔庭,可以采用lua腳本實(shí)現(xiàn)業(yè)務(wù)邏輯尺上。
該模塊具備以下特性:
- 高并發(fā)材蛛、非阻塞的處理各種請(qǐng)求。
- Lua內(nèi)建協(xié)程怎抛,這樣就可以很好的將異步回調(diào)轉(zhuǎn)換成順序調(diào)用的形式卑吭。
- 每個(gè)協(xié)程都有一個(gè)獨(dú)立的全局環(huán)境(變量空間),繼承于全局共享的马绝、只讀的“commandata”豆赏。
得益于Lua協(xié)程的支持,ngx_lua在處理10000個(gè)并發(fā)請(qǐng)求時(shí)只需要很少的內(nèi)存富稻。根據(jù)測(cè)試掷邦,ngx_lua處理每個(gè)請(qǐng)求只需要2KB的內(nèi)存,如果使用LuaJIT則會(huì)更少椭赋。
ngx_lua非常適合用于實(shí)現(xiàn)可擴(kuò)展的耙饰、高并發(fā)的服務(wù)
3. 協(xié)程(Coroutine)
協(xié)程類似一種多線程,與多線程的區(qū)別有:
- 協(xié)程并非os線程纹份,所以創(chuàng)建苟跪、切換開(kāi)銷比線程相對(duì)要小。
- 協(xié)程與線程一樣有自己的棧蔓涧、局部變量等件已,但是協(xié)程的棧是在用戶進(jìn)程空間模擬的,所以創(chuàng)建元暴、切換開(kāi)銷很小篷扩。
- 多線程程序是多個(gè)線程并發(fā)執(zhí)行,也就是說(shuō)在一瞬間有多個(gè)控制流在執(zhí)行茉盏。而協(xié)程強(qiáng)調(diào)的是一種多個(gè)協(xié)程間協(xié)作的關(guān)系鉴未,只有當(dāng)一個(gè)協(xié)程主動(dòng)放棄執(zhí)行權(quán),另一個(gè)協(xié)程才能獲得執(zhí)行權(quán)鸠姨,所以在某一瞬間铜秆,多個(gè)協(xié)程間只有一個(gè)在運(yùn)行。
- 由于多個(gè)協(xié)程時(shí)只有一個(gè)在運(yùn)行讶迁,所以對(duì)于臨界區(qū)的訪問(wèn)不需要加鎖连茧,而多線程的情況則必須加鎖。
- 多線程程序由于有多個(gè)控制流巍糯,所以程序的行為不可控啸驯,而多個(gè)協(xié)程的執(zhí)行是由開(kāi)發(fā)者定義的所以是可控的。
Nginx的每個(gè)Worker進(jìn)程都是在epoll或kqueue這樣的事件模型之上祟峦,封裝成協(xié)程罚斗,每個(gè)請(qǐng)求都有一個(gè)協(xié)程進(jìn)行處理。這正好與Lua內(nèi)建協(xié)程的模型是一致的宅楞,所以即使ngx_lua需要執(zhí)行Lua针姿,相對(duì)C有一定的開(kāi)銷袱吆,但依然能保證高并發(fā)能力。
4. Nginx進(jìn)程模型
Nginx采用多進(jìn)程模型搓幌,單Master—多Worker,Master進(jìn)程主要用來(lái)管理Worker進(jìn)程迅箩。
Worker進(jìn)程采用單線程溉愁、非阻塞的事件模型(Event Loop,事件循環(huán))來(lái)實(shí)現(xiàn)端口的監(jiān)聽(tīng)及客戶端請(qǐng)求的處理和響應(yīng)饲趋,同時(shí)Worker還要處理來(lái)自Master的信號(hào)拐揭。Woker進(jìn)程個(gè)數(shù)一般設(shè)置為機(jī)器CPU核數(shù)。
Master進(jìn)程具體包括如下4個(gè)主要功能:
(1) 接收來(lái)自外界的信號(hào)奕塑。
(2) 向各worker進(jìn)程發(fā)送信號(hào)堂污。
(3) 監(jiān)控woker進(jìn)程的運(yùn)行狀態(tài)。
(4) 當(dāng)woker進(jìn)程退出后((異常情況下)龄砰,會(huì)自動(dòng)重新啟動(dòng)新的woker進(jìn)程盟猖。
5. HTTP請(qǐng)求處理
6. ngx_lua指令
ngx_lua屬于nginx的一部分,它的執(zhí)行指令都包含在nginx的11個(gè)步驟之中了换棚,相應(yīng)的處理階段可以做插入式處理式镐,即可插拔式架構(gòu),不過(guò)ngx_lua并不是所有階段都會(huì)運(yùn)行的;另外指令可以在http固蚤、server娘汞、server if、location夕玩、location if幾個(gè)范圍進(jìn)行配置:
7. OpenResty
點(diǎn)擊查看官網(wǎng)
概念:
OpenResty是一個(gè)基于Nginx與Lua的高性能Web平臺(tái)你弦,其內(nèi)部集成了大量精良的Lua庫(kù)、第三方模塊以及大多數(shù)的依賴項(xiàng)燎孟。用于方便地搭建能夠處理超高并發(fā)禽作、擴(kuò)展性極高的動(dòng)態(tài)Web應(yīng)用、Web服務(wù)和動(dòng)態(tài)網(wǎng)關(guān)揩页。工作原理:
OpenResty通過(guò)匯聚各種設(shè)計(jì)精良的Nginx模塊(主要由OpenResty團(tuán)隊(duì)自主開(kāi)發(fā))领迈,從而將Nginx有效地變成一個(gè)強(qiáng)大的通用Web應(yīng)用平臺(tái)。這樣碍沐,Web開(kāi)發(fā)人員和系統(tǒng)工程師可以使用Lua腳本語(yǔ)言調(diào)動(dòng)Nginx支持的各種C以及Lua模塊狸捅,快速構(gòu)造出足以勝任10K乃至1000K以上單機(jī)并發(fā)連接的高性能Web應(yīng)用系統(tǒng)。目標(biāo):
OpenResty的目標(biāo)是讓你的Web服務(wù)直接跑在Nginx服務(wù)內(nèi)部累提,充分利用Nginx的非阻塞I/O模型尘喝,不僅僅對(duì)HTTP客戶端請(qǐng)求,甚至于對(duì)遠(yuǎn)程后端諸如MySQL、PostgreSQL斋陪、Memcached 以及Redis等都進(jìn)行一致的高性能響應(yīng)朽褪。
8. ngx_lua 實(shí)例
content_by_lua:內(nèi)容處理器置吓,接收請(qǐng)求處理并輸出響應(yīng)。
該指令工作在Nginx處理流程的content階段缔赠,即內(nèi)容產(chǎn)生階段,是所有請(qǐng)求處理階段中最為重要的階段衍锚,因?yàn)檫@個(gè)階段的指令通常是用來(lái)生成HTTP響應(yīng)內(nèi)容的;
或
輸出:
$ curl http://127.0.0.1/
$ Hello, world
- 例子2
- 例子3 - 傳參
- 例子4 - 結(jié)合redis
如果覺(jué)得有收獲就點(diǎn)個(gè)贊吧,更多知識(shí)嗤堰,請(qǐng)點(diǎn)擊關(guān)注查看我的主頁(yè)信息哦~