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處理請求流程
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代碼以及如何使用結果斤斧。