網(wǎng)站設(shè)計(jì)營銷網(wǎng)站出租三級域名費(fèi)用
熟悉了nginx后再來看openresty,不得不說openresty是比較優(yōu)秀的。
對nginx和openresty的歷史等在這此就不介紹了。
首先對標(biāo)nginx,自然有優(yōu)劣
一、開發(fā)難度
nginx:
毫無疑問nginx的開發(fā)難度比較高,需要扎實(shí)的c/c++基礎(chǔ),而且還需要對nginx源碼比較熟悉,開發(fā)效率慢,比如實(shí)現(xiàn)一個(gè)類似echo的功能,至少要上百行代碼。而openresty只需要一句ngx.say即可。
openresty:
由于是lua腳本級別的,開發(fā)效率自然高出許多,開發(fā)難度也降低了很多,不需要知道nginx的源碼,只需要知道nginx的大概的流程和基礎(chǔ)原理,還有基礎(chǔ)配置。當(dāng)然必須要去了解openresty提供的接口。官方接口文檔鏈接如下:
Lua Ngx API - OpenResty Reference
因此openresty開發(fā)容易上手,開發(fā)效率很高。
二、性能
這個(gè)是離不開的話題,nginx的性能在web架構(gòu)上是出了名的高效。在大部分程序員固有的思維中可能想當(dāng)然的認(rèn)為腳本肯定比如c運(yùn)行得快。當(dāng)然這是正常的,畢竟絕大多數(shù)腳本確實(shí)如此。然而在openresty這你可能需要改變這樣認(rèn)知。
首先openresty的基于nginx的,在其中嵌入了lua模塊,但是其也充分發(fā)揮了nginx的高性能,如果你認(rèn)為使用lua腳本性能就降低了,那就錯(cuò)了。
首先lua雖是腳本語言,但是他特別小巧,也是使用c來實(shí)現(xiàn)的,而且使用的LuaJIT的技術(shù)編譯lua代碼,運(yùn)行效率比原來的lua解釋器高出了許多,如果再深入到源碼,會發(fā)現(xiàn),openresty大致是使用向lua注冊c函數(shù)或ffi方式實(shí)現(xiàn)lua對nginx接口,也可以這么理解,lua腳本源碼在nginx啟動(dòng)的時(shí)候,就被翻譯成了二進(jìn)制的代碼。所以其性能非常好。
但是你非要和原生的nginx相比,性能到底有沒有說的這么好,大家不防自己試試??慈缦屡渲?/p>
server {
? ? ? ? listen 8888 ;
? ? ? ? server_name test;
? ? ? ? location /ngx {
? ? ? ? ? ? echo "ngx hello\n" ;
? ? ? ? }
? ? ? ? location /lua {
? ? ? ? ? ? content_by_lua_block {
? ? ? ? ? ? ? ? ngx.say("lua hello\n")
? ? ? ? ? ? }
? ? ? ? }
? ? }
使用ab測試工具進(jìn)行10萬次測試
ab -k -c 20 -n 100000 'http://localhost:8888/ngx'
ab -k -c 20 -n 100000 'http://localhost:8888/lua'
我在我的設(shè)備上測試結(jié)果則lua腳本完勝。而且某些指標(biāo)lua還勝出不少。
我曾經(jīng)是也自以為lua性能可不如c,自此我無數(shù)次的測試后,發(fā)現(xiàn),我的認(rèn)知錯(cuò)了。
因此從性能上而言,openresty是完全發(fā)揮了nginx的高性能,在某些方面性能不降還反超了。
三、靈活性
nginx:
靈活性是nginx的一個(gè)主要的特性。其完全模塊化的設(shè)計(jì),模塊之間耦合度比較低,非模塊代碼極少,此設(shè)計(jì)使其具備高度的靈活性。
openresty:
openresty提供了大量比較精良的lua庫,也具備比較高度的靈活性,但和nginx比起來要遜色一些。
openresty主要是使用其提供的lua庫和一些第三方的lua庫,對于nginx中一些復(fù)雜的開發(fā),openresty可能達(dá)不到要求。
比如:mysql,openresty自帶的庫,有使用限制,不能在進(jìn)程初始化,模塊初始化等階段使用
在nginx中,使用c自然使用c接口調(diào)用mysql可以在任何地方進(jìn)行mysql的連接初始化等操作。當(dāng)然我們或許可以使用第三方的mysql的lua庫來解決此問題。
再如,如果我們需要額外新的內(nèi)置變量,這個(gè)是就openresty所不能做到的。
總體而言,openresty靈活性也很不錯(cuò),但是比nginx要遜色一些。
本次只是簡單的淺談。
總體而言,使用openresty比nginx更有性價(jià)比,主要就是nginx的開發(fā)難度比較大,而且openresty充分發(fā)揮了nginx的高性能,某些方面還反超了,因此只要能使用openresty開發(fā),我肯定優(yōu)先選擇openresty。但是如果想要更加用好openresty還是需要進(jìn)一步去了解openresty源碼特別是nginx的源碼,這樣只會對你開發(fā)工作如虎添翼。
比如了解了openresty的源碼,你才可能知道,其access_by_lua_block是在access階段中最后一個(gè)被執(zhí)行(第一次進(jìn)入時(shí),會自動(dòng)將本模塊移到最后該階段最后一個(gè),此操作進(jìn)行一次,具體參見函數(shù)ngx_http_lua_access_handler的實(shí)現(xiàn))