阿里P9大牛整理總結出進階架構師必備知識:NginxLua開發(fā)實戰(zhàn)文檔
前言
在學習和使用 ngx_lua 的過程中我們發(fā)現(xiàn),網絡上資料其實非常多,但是非常零散,沒有整體性,雖然技術本身是很清晰和易用的,但是對于剛接觸這門技術的開發(fā)者來說,想要有條理、系統(tǒng)地把這些知識學完,可能會走一些彎路。
因為很多資料已經過時了,甄別和調試會耗費很多時間和精力,同時查閱英文文檔也比較花時間。于是,我就有了把自己的學習過程和心得整理成書的想法。
隨后的時間里,將自己學習Nginx下Lua開發(fā)的思路,以及這個過程中的資料一點點總結出來加以整理,終成本文。
希望本文可以幫助跟我有一樣需求的研發(fā)工程師快速了解并掌握Nginx下Lua開發(fā)技術。
首先,我們看一下目錄
其次,是主要內容的介紹
本文主要分五部分:
第一部分(第1~5章)介紹Nginx的基本操作,同時講解了MySQL、PostgreSQL、Redis、Memcached、MongoDB、 OpenResty 的基本操作。通過對本部分的學習可以掌握這些服務的安裝和使用方法,一般用于研發(fā)環(huán)境的搭建。這里還講解了Nginx 核心技術和工作流程,用于幫助讀者進一步掌握Nginx的架構和流程。各個層次的讀者都可以從本部分讀起。
第1章Nginx高效服務器,Nginx使用了大量的高并發(fā)和低內存占用技術,并使用了高可靠性技術,擁有高過Apache--個數(shù)量級以上的接人能力。因為并發(fā)能力強的特點,Nginx在中國的互聯(lián)網公司中得到了大量應用,中國的大型互聯(lián)網公司無一不使用了Nginx,以應對中國眾多的網民,以及各種搶購熱潮(如“雙十一”)、 世界杯等熱點事件。Nginx在這種大量的流量涌入、需要分流、導流、反向代理的場合下得到大量應用。
第2章數(shù)據(jù)庫的基本操作,Nginx 應用系統(tǒng)通過以 ginx 為核心,合理搭配 is Memcac ed MySQL Postgre SQL Mongo 等服務器,可起到數(shù)據(jù)內存緩存、內存數(shù)據(jù)庫、關系型數(shù)據(jù)庫、 NoSQL 數(shù)據(jù)庫等作用 互聯(lián)網系統(tǒng)上有各種關系型數(shù)據(jù)需要存儲,需要用到關系型數(shù)據(jù)庫 互聯(lián)網要應對大量的高并發(fā)請求,就需要高速處理 TTP 請求,需要用到各種數(shù)據(jù)緩存、頁面緩存、操作緩存等 同時互聯(lián)網上有大量的結構 非關系型數(shù)據(jù)要存儲,還有各類音/視頻、圖片要緩存,需要用到各類內存型數(shù)據(jù)庫、 NoSQ 數(shù)據(jù)庫等,以形成完整的應用 所以本章將從這些數(shù)據(jù)庫、緩存產品的作用 特點 安裝方法、常用命令及配置文件解析展開。
第3章OpenResty,一個典型的互聯(lián)網系統(tǒng)或云計算系統(tǒng)大量使用到關系型數(shù)據(jù)庫、非關系型數(shù)據(jù)庫、緩存、內存數(shù)據(jù)庫等,以提供高速、高擴展性的服務,通常組成集群。以前協(xié)調這些系統(tǒng)開發(fā)是非常麻煩的,現(xiàn)在OpenResty提供的Nginx+Lua+Module的機制,使我們可以實現(xiàn)快速開發(fā),讓開發(fā)者著眼于應用,使用同一語言開發(fā)。在這種架構的應用領域里,其效率是其他語言和技術不能比擬的。
本章介紹OpenResty的組成及安裝、配置方法。
第4章Nginx核心技術,在開發(fā)Nginx時,Apache 已經是-一個成熟的Web服務器了,性能不錯、功能豐富、應用廣泛。Nginx從設計之初就定位為高性能、高可靠性、高擴展性、高并發(fā)性的Web服務器,比Apache性能更好。Nginx 是基于HTTP協(xié)議的Web服務器,受HTTP協(xié)議的制約,有些問題解決起來比較棘手,所以采用了一系列技術解決這些問題。
本章介紹這些有特色的技術,以便我們更了解Nginx,知道Lua開發(fā)的工作機制,這些技術和思想也可以應用到我們的項目中去。
第5章Nginx的工作流程,詳細了解Nginx的主要工作流程,可以讓我們更好地認識Nginx,從而更好地使用Nginx,同時可以讓我們更好地掌握Lua在Nginx中的工作流程。根據(jù)對Nginx核心技術和架構的了解,我們知道了管理進程1工作進程機制,以及HTTP核心模塊和配置對Nginx的重要性,也知道了Nginx 的框架代碼不多,只負責環(huán)境管理,本章將介紹這些部分的工作流程。
第二部分(第6~7章)詳細講解了Lua腳本語言和Lua通用庫。學習Lua語言或查閱Lua語法的初學者可以直接閱讀該部分相應章節(jié)。
第6章Lua教程,Lua是一種輕量、小巧的腳本語言,用標準C語言編寫并以源代碼形式開放。其設計目的是嵌入應用程序中,從而為應用程序提供靈活的擴展和定制功能。目前Lua大量應用于Nginx、嵌入式設備、游戲邏輯開發(fā)等方面。
在Nginx中,Lua中的例程機制可以很好地和Nginx的全異步、非阻塞的多階段處理機制結合,使開發(fā)者使用同步的模式,開發(fā)全異步的應用,而不用考慮異步的處理機制。
本章介紹Lua的基礎語法知識。
第7章Lua通用庫,Lua提供了-一些通用庫,使用者在Lua中可以直接進行字符串操作、表操作、文件操作、訪問操作系統(tǒng)、進行科學計算等。本章匯總這些常用函數(shù)和操作,方便讀者使用中查找。
第三部分(第8~10章)講解了在Nginx開發(fā)中經常使用的一-些技術,如JSON數(shù)據(jù)交換格式、nginx.conf 配置方法和配置指令;還講解了Nginx' 下Lua開發(fā)的實現(xiàn)機制。學習Nginx配置的讀者,學習和查閱JSON的讀者可以直接閱讀該部分相應章節(jié),也可以跳過其他章節(jié),直接學習Nginx'下Lua的實現(xiàn)機制。
第8章JSON數(shù)據(jù)交換格式,JSON是JavaScript Object Notation ( JavaScript對象表示法)的縮寫,JSON是一種存儲和交換文本信息的語法,類似XML。JSON比XML更小、更快,更易解析,是JavaScript內部使用的- - 種格式。JSON因為其特點,在互聯(lián)網應用、嵌入式應用上得到了大量應用。我們在Nginx下的Lua開發(fā)中也大量使用JSON進行數(shù)據(jù)交換。本章介紹JSON這種常用的數(shù)據(jù)交換格式。
第9章nginx.conf文件配置,nginx.conf是Nginx的配置文件。Nginx 的工作流程是:在編譯階段選擇要使用的模塊并編譯進整體工程中去。模塊和業(yè)務的使用通過nginx.conf配置文件中配置指令的配置得以控制和實現(xiàn),復雜的業(yè)務和自定義的業(yè)務邏輯使用Lua腳本實現(xiàn)。所以,nginx.conf 是我們開始開發(fā)及調整服務行為的首要途徑。
配置正確的nginx.conf為我們提供一個正常運行且高效的服務框架,可以在框架內選擇我們要介,人的HTTP請求處理階段,編寫Lua代碼提供具體實現(xiàn)。
第10章Nginx 下Lua實現(xiàn)機制,Nginx中的大部分功能是通過模塊提供的,這種方式使得Nginx開發(fā)和擴展很方便,模塊可以依次串起來形成-一個過濾器。一個模塊的失效不會影響其他部分,是Nginx擴展性和可靠性的一個保證。系統(tǒng)提供了如http模塊、
mail模塊、event 等模塊。根據(jù)業(yè)務需要,通過配置或編譯將不同的模塊組合起來,形成自己業(yè)務特有的Web服務器,實現(xiàn)一些特定的功能。Nginx使用比較多的場合是反向代理,使用Nginx在前端做登錄校驗、JS合并、數(shù)據(jù)庫訪問、訪問鑒權等,具體業(yè)務由反向代理實現(xiàn),發(fā)揮Nginx業(yè)務開發(fā)靈活、有大并發(fā)接人和會話保持能力的優(yōu)點。
第四部分(第11~26章)詳細介紹了常用Lua庫和數(shù)據(jù)庫等組件的使用方法,包括Redis、MySQL、Memcached、PostgreSQL、 MongoDB、 Bit、 lfs、 restry.http、 leurl、 FFI、cjson、Template 、WebSocket。要了解和學習這些內容的讀者,可以直接閱讀對應章節(jié)。這里同時給出了兩個Lua編程實例代碼,要總體了解這項編程技術的讀者可直接翻閱相應章節(jié)。
第11章Redis操作,Redis在系統(tǒng)中經常作為數(shù)據(jù)緩存、內存數(shù)據(jù)庫使用,在大型系統(tǒng)中扮演著非常重要的作用。在Nginx核心系統(tǒng)中,Redis 是常備組件。本章主要介紹常用的Redis操作方法。
第12章MySQL操作,MySQL是- -個使用廣泛的關系型數(shù)據(jù)庫,用來保存關系型數(shù)據(jù)。根據(jù)應用,MySQL規(guī)模可大可小。大的系統(tǒng)可以做讀寫分離的大型集群。
在ngx_ lua 中,MySQL有兩種訪問模式:
1)使用ngx. _lua 模塊和lua-resty-mysql模塊:這兩個模塊是安裝OpenResty時默認安裝的。
2)使用drizzle. nginx_ module ( HttpDrizzeModule)模塊:需要單獨安裝,這個庫現(xiàn)不在OpenResty中。
本章分別介紹這兩種MySQL操作方法。
第13章Memcached操作,訪問Memcached有兩種方式: mem-nginx-module 訪問方式和lua-resty-memcached訪問方式。lua-restry- memcached是由OpenResty實現(xiàn)的,mem-nginx-module也 被包含在OpenResty內。用OpenResty可以直接使用這兩種方式訪問Memcached,自行安裝Nginx的需要加入這兩個模塊才可以使用。
第14章PostgreSQL操作,ngx_ postgres 用于和PostgreSQL數(shù)據(jù)庫通信。應答包是RDS格式,可以和rds-json-nginx模塊的drizzle nginx-module一起工作。
默認在OpenResty下沒有使能本模塊,需要在編譯OpenResty時使用-with-http_postgres_ module選項打開。本模塊需要系統(tǒng)中首先安裝libpq。
第15章MongoDB操作,Nginx下使用lua-resty-mongol模塊訪問MongoDB,但lua-resty -mongol模塊并沒有打包在OpenResty內,需要單獨安裝,即在OpenResty的lualib目錄下復制進對應的腳本文件。lua-resty mongol庫提供了很好的性能和靈活性,內存占用率低。
第16章bit庫的使用,Lua提供了bit庫,可以對變量數(shù)據(jù)進行位運算,在某些應有場景,我們需要在Lua中對數(shù)據(jù)進行位移,或進行“與、或、非”及進制轉換等操作。
例如,用一個32位的整數(shù)表示RGB顏色。32 位整數(shù),被分為4個部分,每個部分8位,8位可表示的十進制數(shù)的范圍是0 ~ 255。
第17章lfs庫的使用,Ifs-file system operations ( LuaFileSystem)用于補充標準Lua發(fā)布版本的文件操作函數(shù)。LuaFileSystem提供了一個訪問底層目錄文件屬性的輕便方法。Lua系統(tǒng)庫里的文件函數(shù)只能打開文件以及對文件進行讀寫,Ifs 庫提供了對文件和目錄操作的方法。
第18章resty.http庫的使用,resty.http用于訪問外部HTTP資源、location等,如訪問非本地location、外部Web服務、RESTFul、Web Service等。resty.http 是- -個輕量級HTTP庫。
第19章lcurl庫的使用,lcurl庫封裝了libcurl 的函數(shù),為Lua提供了使用curl 的接口。
libcurl的主要功能是用不同的協(xié)議連接,與不同的服務器溝通,相當于封裝了的sock。
libcurl當前支持http、https、 ftp、 gopher、 telnet、 dict、 file、 ldap協(xié)議。libcurl 同樣支持
HTTPS證書授權,支持HTTP POST、HTTP PUT、FTP. 上傳、HTTP基本表單上傳、代理、cookies和用戶認證。
lcurl功能強大,可以為Lua提供方便而強大的網絡訪問能力。
第20章FFI擴展C庫,F(xiàn)FI庫是LuaJIT中最重要的一個擴展庫,允許在純Lua代碼內調用擴展的C例數(shù)或使用C數(shù)據(jù)結構。FFI庫用于擴展Lua的功能,使Lua成為純的“膠水”語言,可以整合豐富的C/C++庫,實現(xiàn)高性能的功能。使用FFI庫可以從C工程頭文件復制代碼進Lua代碼,把開發(fā)者從開發(fā)Lua擴展C (語言1功能綁定庫)的繁重工作中解放出來。
FFI被緊密地整合進LuaJIT中,JIT編譯器為Lua代碼直接訪問C數(shù)據(jù)結構產生適配代碼,等同于C編譯器產生的代碼。在JIT編譯過的代碼中,調用C函數(shù)被當作內聯(lián)函數(shù)處理,不同于基于Lua/C API函數(shù)調用。
第21章cjson庫的使用,Luacjson庫為Lua提供了JSON處理能力,是一個快速的JSON處理庫,包含在OpenResty內,可以使用編譯開關打開或關閉,默認是打開的。
Lua cjson模塊特點如下:
●快速,支持標準的編解碼操作。
●完全支持UTF-8。
●可選運行期JSON異常支持。
●不支持UTF-16和UTF-32。
第22章lua-resty-template類的使用,Web開發(fā)中經常使用到動態(tài)Web網頁開發(fā)技術,如淘寶商品頁,詳情頁面顯示非常復雜,邏輯也非常復雜,-.般都是使用動態(tài)頁面技術實現(xiàn)的,常見的Web端動態(tài)頁面技術是PHP、JSP等。但在商品詳情這種頁面中變動又不是那么快速,使用PHP、 JSP等又不完全合適,需要組建復雜的系統(tǒng),使用CGI緩存等技術提高系統(tǒng)整體并發(fā)能力,這時可以使用模板技術實現(xiàn)。Lua 中有許多模板引擎,這里介紹OpenResty團隊提供的lua-resty-template,可以渲染很復雜的頁面,在LuaJIT上的性能表現(xiàn)不錯。
第23章WebSocket的使用,WebSocket protocol是HTML5一種新的協(xié)議。它實現(xiàn)了瀏覽器與服務器全雙工通信(fll-duple),一開始的握手需要借助HTTP請求完成。
在WebSocket出現(xiàn)之前,網站為了實現(xiàn)即時通信,所用的技術是輪詢( polling)。輪詢是在特定的時間間隔(如每1秒)內,由瀏覽器對服務器發(fā)出HTTPrequest,然后由服務器返回最新的數(shù)據(jù)給客戶端的瀏覽器。這種傳統(tǒng)的HTTPrequest的模式帶來很明顯的缺點:瀏覽器需要不斷地向服務器發(fā)出請求,然而HTTPrequest的header是非常長的,其中包含的有用數(shù)據(jù)可能只是一個很小的值,這樣會占用很多的帶寬。
第24章TCP私有服務器實例,本章描述一個使用Nginx架構實現(xiàn)一個私有的TCP服務器的實例,這個服務器用于實現(xiàn)物聯(lián)網網關類設備使用私有協(xié)議接入功能。系統(tǒng)定義了基于JSON格式的交互協(xié)議,使
用TCP作為傳輸層協(xié)議。服務器使用stream模塊實現(xiàn)TCP服務的功能,因為整體仍是Nginx架構,所以整個系統(tǒng)具備高并發(fā)處理能力,接入能力以w為單位。
ngx_ lua 模塊使用例程機制,使得每- - 個請求都擁有一個獨立的例程。因為網關類設備需要具備雙向通信能力,所以與服務器是長連接,服務器會不定時將客戶端請求轉發(fā)到網關設備,也會不定期發(fā)送各種通知、消息。每個連接會在VM中保持-一個例程, 一個例程為一個連接處理,而我們編程也只需要考慮單個例程的工作流程即可,不用考慮自行編寫服務器要考慮的:異步機制、狀態(tài)機。通過ngx_ lua實現(xiàn)的完全是非阻塞異步的服務器,而編寫代碼只考慮同步風格。
第25章WebSocket接入服務器實戰(zhàn),WebSocket接入服務器實戰(zhàn)這個實例實現(xiàn)了通用的Web接口,供客戶端調用,同時使用了WebSocket協(xié)議實現(xiàn)了一個客戶長連接接人的機制,客戶端和服務器之間可以隨時交換各種數(shù)據(jù),完全等同于自已使用C\C++等編寫的接人業(yè)務服務器。
WebSocket服務器啟動后在9512端口上監(jiān)聽,接收來自于WebSocket客戶端的連接。因為HTML5支持WebSocket協(xié)議,所以Nginx也支持該協(xié)議。客戶端和服務端的連接方式是長連接,雙方可以在任意時間內主動向對方發(fā)起通信。通信協(xié)議為JSON格式。
第26章Nginx應用簡述,Nginx作為-個高速 Web服務器,用于典型的HTTP環(huán)境中。本章重點介紹小、中、大型以Nginx為核心的系統(tǒng)進化方式,為初入Nginx應用開發(fā)的使用者提供一個思路, 從開始就全面考慮或知道后面系統(tǒng)會遇到的問題更有利于系統(tǒng)的設計和后續(xù)的開發(fā)。
以Nginx為核心的系統(tǒng)進化方式分為4種,下面將具體展開論述。
第五部分(第27~28章)詳細介紹了ngx._lua的配置指令和ngx._luaAPI,目的是幫助讀者在工作中快速檢索配置指令和API。
第27章 ngx lua module模塊配置指令詳解,ngx_ lua (ngx. _lua_ module 的簡稱)是Nginx的內嵌Lua模塊,并不在Nginx發(fā)行的源碼中。現(xiàn)在流行的Nginx下的Lua開發(fā)方式是OpenResty, OpenResty 打包了Nginx、LuaJIT、ngx_ lua. module 等,方便用戶使用,具體請參見第3章。
ngx_ lua由配置指令和API兩部分組成。本章詳細介紹ngx_ lua的配置指令。
第28章ngx_ lua API詳解,Nginx API包含方法、常量、狀態(tài)碼、變量等,服務于方法。各種*. _by_ _lua、 *. _by_lua_ block和*. by_ lua. file 指令是nginx.conf到Lua API的橋梁和網關。本章描述的NginxLua API只能在這些指令內編寫和運行。
這份阿里P9大牛整理總結出的【NginxLua開發(fā)實戰(zhàn)】共有582頁,因為文章篇幅限制只能給大家介紹部分內容,每個小節(jié)還有更加細化的內容,需要完整版的朋友,,,,
可以轉發(fā)關注小編,微信公眾號搜索【程序員高級碼農】來獲取!!!
總結
Nginx上的Lua技術是近些年來由中國人章亦春整合出來的架構,將高效、輕量級的Lua腳本語言和Nginx結合起來,可以快捷、方便地開發(fā)應用系統(tǒng)。使用同步式的編程習慣實現(xiàn)異步非阻塞的高效模式,使新上手的工程師也可以快速開發(fā)高性能應用。據(jù)資深互聯(lián)網專家描述以及本人親身體會,在典型應用下,使用Lua可以使代碼量減少90%左右,帶來的經濟效益和搶得的市場先機自不待言。對于工程師本身來講,減少加班、多點時間喝杯咖啡也是極具吸引力的。
傳統(tǒng)分布式平臺要升級為云平臺都是通過將已有的分布式平臺改造成云服務,進行互聯(lián)網部署,往往需要多位資深服務器開發(fā)工程師花費大量時間共同提供支持,而Nginx+Lua+Redis架構的出現(xiàn),從根本上簡化了這種方式,少量工程師花費少于原有體系的工作時間即可完成業(yè)務服務搭建。
Nginx+Lua架構不僅可以節(jié)約時間和成本,從做大型系統(tǒng)的角度來看,它還具有諸多優(yōu)勢:
- 調試方便:不需要編譯代碼,相關訪問模塊是成熟穩(wěn)定的,只需要調試新加的業(yè)務代碼即可。大型系統(tǒng),特別是分布式系統(tǒng),一個功能或代碼的調試鏈條很長,非常容易出錯。
- 降低耦合:因為架構的限制,Lua代碼只能在必須的階段管理器中開發(fā),代碼是一個一個.Iua文件,耦合性大幅降低。
- 框架良好:先進的異步式多進程架構,可以充分利用系統(tǒng)資源。而如果自行開發(fā)并維護這樣一個框架, 則需要大量的人力、物力。
- 上手容易: Lua代碼具有良好的結構和可讀性,上手速度更快。團隊成員經過快速培訓就可以上手。
希望大家能夠學以致用,以加大自己的知識儲備,增加自己的技術深度和寬度。
浙公網安備 33010602011771號