NginxLua的介紹與應用_第1頁
NginxLua的介紹與應用_第2頁
NginxLua的介紹與應用_第3頁
NginxLua的介紹與應用_第4頁
NginxLua的介紹與應用_第5頁
已閱讀5頁,還剩49頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

lua&ngx_lua的介紹與應用by陳于喆QQ:34174409大綱Lua的預備知識架構背景nginx的預備知識ngx_luanginx,lua,ngx_lua再說原理思考lua的預備知識什么是lua嚕啊Lua是一種腳本編程語言,于1994年,由巴西里約熱內盧天主教大學的研究人員設計開發,“Lua”這個名字是葡萄牙語單詞“月亮”。小鳥引發熱潮2011年6月排名lua的特點與一般腳本語言如PHP、Perl、JavaScript等不同,Lua被稱為是一種嵌入式腳本語言,Lua最著名的應用是在暴雪公司的網絡游戲魔獸世界和網易的大話西游中。Lua最引人注目的特點:極小的體積和簡單的語法提供相對全面的功能。簡潔的API實現與宿主語言最方便的接口。與平臺無關幾乎運行于所有的系統。所謂的“嵌入式”lua可以獨立進行編程,但這不是主要的使用方式。Lua雖然有動態、靈活的語法提供強大的功能,但并不像Java、Python等一樣有一個完善的庫,這不是缺陷,而是和其定位有關。“嵌入式”,lua作為一個庫,嵌入到其他大型語言(稱之為宿主語言)的應用程序之中,為應用程序提供參數配置或邏輯描述等功能,帶來前所未有的靈活性。lua的經典使用方式宿主語言lua作為配置文件,為宿主語言提供參數宿主語言為底層庫,lua作為邏輯處理宿主語言lualua工作流程4執行讀入的Lua程序3讀入Lua源程序或預先編譯后的Lua程序2將宿主語言實現的Lua擴展,如函數等,注冊到Lua解釋器中,供其使用1宿主語言建立Lua解釋器對象。Lua與宿主語言的交互方式宿主語言通過虛擬機對Lua腳本中的變量實現增、刪、讀、寫宿主語言通過虛擬機調用Lua腳本中的函數宿主語言定義新的數據類型供Lua腳本使用Lua調用宿主語言編寫的函數Lua與C宿主的交互~1進行編譯gcc-ohellohello.c-llua–dl運行./hello(有備注)更深入的交互上例只實現了對Lua腳本的解析,并沒有實現Lua與宿主語言的數據交換和互操作。和典型的腳本語言引擎相同,Lua虛擬機是一個堆棧機,其一切運算基本都在堆棧上完成,這個堆棧也是LuaAPI的關鍵部分,是Lua與宿主語言交換數據的手段。12堆棧機的原理實現計算f(a,b,c)先將函數壓棧再將參數依次壓棧函數執行后將參數彈出并將結果壓棧13通過堆棧的交互用宿主語言可以編寫供Lua調用的函數,宿主語言需要遵守調用約定,從棧中取得參數,最后也將結果入棧。將宿主函數通過lua_register注冊入Lua虛擬機(這一過程實質為向Lua語言添加全局變量),就可以被Lua語言所調用。Lua虛擬機的堆棧Lua虛擬機內部有一個堆棧,LuaAPI提供了對其的操作,不僅有出入棧操作,還可以以數組的形式,通過索引值隨機讀寫棧元素,這是雙方交換數據的主要方式。Lua與C宿主的交互~2Hello2.cHello2.lua進行編譯gcc-ohello2hello2.c-llua–dl運行./hello2(有備注)結果分析(lua_State*s):數據傳遞不通過其參數,而是通過堆棧;整型返回值指明了該函數真正向Lua返回的值的個數,即壓棧的結果個數。函數返回后,Lua虛擬機會自動進行清棧工作,不需在函數內部來做。注意:在Lua中函數可以有不止一個返回值17基本類型賦值:a=3 x,y,z=12,'Hello',true基本類型:空類型nil nil數值number 123 3.14159 1.6e-9運算:+-*/%^(乘冪)-(負)布爾boolean true false運算:orandnot字符串string ‘’ “你好"運算:..(連接)#(長度)其他通用運算符:==~=><>=<=tableLua使用table類型作為一切數據結構的基礎:t={1234,nil,'hello',true,{'nested',1.414}}table本質為哈希表,保存鍵-值對的集合,若不指定鍵,則默認為從1開始的整數。也可顯式指定鍵:rec={[‘name’]=‘111',favorite=‘222',[10]=true}引用表的元素: rec['favorite'] rec[10]活用表類型,可以構成結構體、鏈表、數組、對象等各種復雜數據結構。(有備注)關于閉包functionnewCounter()locali=0 returnfunction() i=i+1 returni endendc1=newCounter()print(c1())print(c1())(有備注)20架構背景2108年我們的框架BrowserApacheAPPDBLVSsquidBusiness目前我們的架構BrowserNginxAPPDBLVSBusinessContentCDNhttpsqsajax404proxy得到的收益業務更加穩定–Nginx大連接數目支持非常好–Nginx本身的內存占用很少,不會吃swap業務性能更高–QPS比Apache要好–節省機器數目–基于Nginx的模塊性能往往是之前業務的數倍Nginx的知識預備Nginx進程模式nginx采用多進程,單Master多WorkerMaster處理外部信號,配置文件以及worker的初始化worker進程采用單線程,非阻塞(Eventloop)來處理客戶端請求和響應Nginx處理Http請求的過程clientserverlocationIp

hostporturlphaseNginx處理Http請求的過程NGX_HTTP_POST_READ_PHASE

讀取請求phaseNGX_HTTP_SERVER_REWRITE_PHASE

這個階段主要是處理全局的(serverblock)的rewriteNGX_HTTP_FIND_CONFIG_PHASE

這個階段主要是通過uri來查找對應的location,然后根據loc_conf設置r的相應變量NGX_HTTP_REWRITE_PHASE

這個主要處理location的rewriteNGX_HTTP_POST_REWRITE_PHASE

postrewrite,這個主要是進行一些校驗以及收尾工作,以便于交給后面的模塊。

NGX_HTTP_PREACCESS_PHASE

比如流控這種類型的access就放在這個phase,也就是說它主要是進行一些比較粗粒度的access。Nginx處理Http請求的過程NGX_HTTP_ACCESS_PHASE

這個比如存取控制,權限驗證就放在這個phase,一般來說處理動作是交給下面的模塊做的.這個主要是做一些細粒度的accessNGX_HTTP_POST_ACCESS_PHASE

一般來說當上面的access模塊得到access_code之后就會由這個模塊根據access_code來進行操作NGX_HTTP_TRY_FILES_PHASE

try_file模塊,就是對應配置文件中的try_files指令,可接收多個路徑作為參數,當前一個路徑的資源無法找到,則自動查找下一個路徑NGX_HTTP_CONTENT_PHASE

內容處理模塊NGX_HTTP_LOG_PHASE

log模塊子請求(subrequest)location/main{echo_location/foo;}location/foo{echofoo;}“子請求”方式的通信是在同一個虛擬主機內部進行的,所以Nginx核心在實現“子請求”的時候,就只調用了若干個C函數,完全不涉及任何網絡或者UNIX套接字(socket)通信。我們由此可以看出“子請求”的執行效率是極高的。(有備注)協程協程類似一種多線程,與多線程的區別有:協程并非os線程,所以創建、切換開銷比線程相對要小。協程與線程一樣有自己的棧、局部變量等,但是協程的棧是在用戶進程空間模擬的,所以創建、切換開銷很小。多線程程序是多個線程并發執行,也就是說在一瞬間有多個控制流在執行。而協程強調的是一種多個協程間協作的關系,只有當一個協程主動放棄執行權,另一個協程才能獲得執行權,所以在某一瞬間,多個協程間只有一個在運行。由于多個協程時只有一個在運行,所以對于臨界區的訪問不需要加鎖,而多線程的情況則必須加鎖。多線程程序由于有多個控制流,所以程序的行為不可控,而多個協程的執行是由開發者定義的所以是可控的。31協程(簡單的說)協程(coroutine)和線程的區別在于調度方式的差異,即讓出CPU給別的執行緒(切換)的時機不同:

線程:主動讓出(yield)、I/O阻塞、時間片到 協程:主動讓出(yield)、I/O(協程間通信)阻塞32Ngx_lua33Ngx_lua安裝下載http_lua_module,加載編譯或直接使用openresty./configure--with-luajit&&make&&makeinstall/ngx_lua的用法ngx_lua模塊提供了配置指令和NginxAPI。配置指令:在Nginx中使用,和set指令和pass_proxy指令使用方法一樣,每個指令都有使用的上下文(context)NginxAPI:用于在Lua腳本中訪問Nginx變量,調用Nginx提供的函數。35配置指令set_by_lua/set_by_lua_fileaccess_by_lua/access_by_lua_filerewrite_by_lua/rewrite_by_lua_filecontent_by_lua/content_by_lua_file36set_by_luahttp://ip:8083/adder?a=100&b=100

和set指令一樣用于設置Nginx變量并且在rewrite階段執行,只不過這個變量是由lua腳本計算并返回的access_by_luahttp://ip:8083/auth運行在access階段,用于訪問控制。Nginx原生的allow和deny是基于ip的,通過access_by_lua能完成復雜的訪問控制,比如,訪問數據庫進行用戶名、密碼驗證等rewrite_by_luahttp://ip:8083/rew實現url重寫,在rewrite階段執行39content_by_lua在content階段執行,生成http響應http://ip:8083/hello1例子:抵御hash攻擊curl--data"a=1&a=11&b=d"http://ip:8083/limit/1.html302or405例子:配合memcachedrequire('Memcached')Module&requireMemcached模塊引用了socket動態編譯庫(有備注)42例子:ip控制43例子:與php簡單的io比對寫入5MB約1s-2s寫入5MB約10s-12shttp://ip/xf/iotest.phphttp://ip:8083/io_testio:nginx&luacontent_by_lua'res=ngx.location.capture("/subreq")echores.body';local

f

=

assert(io.open("html/index.html","r"))

在Lua中進行各種IO時,都要通過ngx.location.capture發送子請求委托給Nginx事件模型,這樣可以保證IO是非阻塞的location

/subreq

{

internal;

root

html;

}

(有備注)45再說nginx,lua,ngx

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論