OpenResty工作原理

OpenResty又被稱為ngx_openresty,是基于Nginx的核心Web應用程序服務器拾徙。

OpenResty是基于Nginx和Lua的高性能Web平臺,OpenResty通過匯聚各種設計精良的Nginx模塊,從而將Nginx有效地變成一個強大的通用Web應用平臺疯溺。

OpenResty的目標是讓Web服務直接運行在Nginx服務內(nèi)部瞳腌,充分利用Nginx的非堵塞I/O模型绞铃,不僅對HTTP客戶端請求,甚至對遠程后端DB都進行一系列的高性能響應嫂侍。

OpenResty借助于Nginx的事件驅(qū)動模型和非堵塞IO儿捧,以實現(xiàn)高性能的Web應用程序。

OpenResty使我們可以借助于Nginx的異步非阻塞達到使用Lua異步并發(fā)訪問后端DB等服務挑宠。

OpenResty使用ngx.location.capture_multi極大地減少瀏覽器的HTTP連接數(shù)量菲盾,可以異步并發(fā)的訪問后臺接口。

  • OpenResty運行原理

Nginx采用的是master-worker模型各淀,也就是一個master進程管理多個worker進程懒鉴,基本的時間處理都放在worker進程中,master進程負責全局初始化以及對worker進行的管理揪阿。

OpenResty中疗我,每個worker進程使用一個LuaVM,當請求被分配到worker時南捂,將在這個LuaVM中創(chuàng)建一個coroutine協(xié)程吴裤,協(xié)程之間數(shù)據(jù)隔離,每個協(xié)程都具有獨立的全局變量溺健。

OpenResty工作原理
  • OpenResty處理請求流程

Nginx會把一個請求分成不同階段麦牺,第三方模塊可以根據(jù)自己的行為,掛在到不同階段中以達到自身目的鞭缭。OpenResty采用了同樣的特性剖膳,不同階段有著不同的處理行為。

Nginx

Nginx特點

  • 輕量級的Web服務岭辣,比Apache占用更少內(nèi)存及資源
  • 抗并發(fā)Nginx處理請求吱晒,異步非阻塞。
  • 高度模塊化設計

Nginx設計為主進程和多個工作進程的工作模式沦童,每個進程是單線程來處理多個連接仑濒,每個工作進程采用了非阻塞I/O來處理多個連接叹话,從而減少線程上下文切換,從而實現(xiàn)高性能墩瞳、高并發(fā)驼壶。因此,生產(chǎn)環(huán)境中會通過將CPU綁定給Nginx工作進程喉酌,從而提升性能热凹。

Nginx架構

Nginx采用多進程模式,對于每個worker進程都是獨立的泪电,因此不需要加鎖般妙,所以節(jié)省了鎖帶來的性能開銷。采用獨立的進程的好處在于worker進程之間相互不會影響歪架,當一個進程退出后股冗,其他進程依然工作,以保證服務不會終端和蚪。

Nginx采用異步非堵塞的方式去處理請求,異步非堵塞就是當一個線程調(diào)用出現(xiàn)阻塞而等待時烹棉,其他線程可以去處理其他任務攒霹。

ngx_lua

ngx_lua是將Lua嵌入Nginx,讓Nginx執(zhí)行Lua腳本浆洗,并且高并發(fā)催束、非阻塞的處理各種請求。Lua內(nèi)建協(xié)程伏社,可以很好的將異步回調(diào)轉(zhuǎn)換成順序調(diào)用的形式抠刺。ngx_lua在Lua中進行的IO操作都會委托給Nginx的事件模型,從而實現(xiàn)非阻塞調(diào)用摘昌。開發(fā)者可以采用串行的方式編寫程序速妖,ngx_lua會自動的在進行阻塞的IO操作中終端,保存上下文聪黎,然后將IO操作委托給Nginx事件處理機制罕容,在IO操作完成后,ngx_lua會恢復上下文稿饰,程序繼續(xù)執(zhí)行锦秒,這些操作都是對用戶程序透明的。

每個Nginx的worker進程持有一個Lua解釋器或LuaJIT實例喉镰,倍這個worker處理的所有請求共享這個實例旅择。每個請求的context上下文會被Lua輕量級的協(xié)程分隔,從而保證各個請求時獨立的侣姆。

ngx_lua采用的`one-cor

ngx_lua模塊的原理

  • 每個工作進程worker創(chuàng)建一個Lua虛擬機(LuaVM),工作進程worker內(nèi)部協(xié)議共享VM生真。
    -每個Nginx I/O原語封裝后注入Lua虛擬機脖咐,并允許Lua代碼直接訪問。
  • 每個外部請求都由一個Lua協(xié)程處理汇歹,協(xié)程之間數(shù)據(jù)隔離屁擅。
  • Lua代碼調(diào)用I/O操作等異步時,會掛起當前協(xié)程产弹,而不阻塞工作機進程派歌。
  • I/O等異步操作完成時,還原相關協(xié)程相關協(xié)議的上下文痰哨,并繼續(xù)運行胶果。

ngx_lua指令

Nginx與Lua編寫腳本的基本構建塊是指令,指令用于指定何時運行用戶Lua代碼以及如何使用結果斤斧。

ngx_lua指令執(zhí)行順序
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末早抠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子撬讽,更是在濱河造成了極大的恐慌蕊连,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件游昼,死亡現(xiàn)場離奇詭異甘苍,居然都是意外死亡,警方通過查閱死者的電腦和手機烘豌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門载庭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人廊佩,你說我怎么就攤上這事囚聚。” “怎么了标锄?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵顽铸,是天一觀的道長。 經(jīng)常有香客問我鸯绿,道長跋破,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任瓶蝴,我火速辦了婚禮毒返,結果婚禮上,老公的妹妹穿的比我還像新娘舷手。我一直安慰自己拧簸,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布男窟。 她就那樣靜靜地躺著盆赤,像睡著了一般贾富。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牺六,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天颤枪,我揣著相機與錄音,去河邊找鬼淑际。 笑死畏纲,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的春缕。 我是一名探鬼主播盗胀,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锄贼!你這毒婦竟也來了票灰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宅荤,失蹤者是張志新(化名)和其女友劉穎屑迂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膘侮,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡屈糊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了琼了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡夫晌,死狀恐怖雕薪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晓淀,我是刑警寧澤所袁,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凶掰,受9級特大地震影響燥爷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜懦窘,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一前翎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畅涂,春花似錦港华、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冒萄。三九已至,卻和暖如春橙数,著一層夾襖步出監(jiān)牢的瞬間尊流,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工灯帮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留崖技,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓施流,卻偏偏與公主長得像响疚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瞪醋,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354