nginx下lua的實現機制
nginx+lua概述
nginx:功能由模塊提供。?http模塊、events模塊,mail模塊。
處理http請求的時候,可以利用模塊做一些功能:eg:登錄校驗,js合并,數據庫訪問,鑒權。?c或者c++。
lua的解釋器,集成到了nginx當中:ngx_lua模塊。
lua內部,內建了協程。
nginx啟動流程
工作流程:啟動流程,管理進程流程,工作進程流程。
啟動流程
1。框架程序的啟動。創建模塊的過程。
2。模塊的啟動。模塊的啟動和初始化的過程。
./nginx
1。?nginx接受啟動參數、解析參數。
2。判斷是否有?-s。如果有-s重新加載 新的配置文件。
3。調用核心模塊create_conf方法,基于配置文件,創建數據結構(用于存儲配置)做初始化。
4。解析nginx.conf配置項,存到上面的數據結構中。
5。調用每個模塊的init_conf方法,進行初始化。
6。如果配置文件中,有關于日志,緩存等的配置,對這些文件進行創建。
7。按照配置,開始監聽端口,一般比如http模塊,stream模塊。
8。調用所有模塊的init_module方法,根據配置信息進行初始化模塊。
9。如果配置文件配置,nginx為master模式。創建管理進程。
10。管理進程根據配置的工作進程數,將所有進程分叉,讓他們獨立接受用戶的請求。
11。管理進程調用模的init_process方法,這樣工作進程就啟動了。工作進程進入自己的消息循環?中,開始等待處理用戶的請求。
管理進程和工作進程
管理進程:管理工作進程。自己實現:重啟服務,平滑升級( -s?reload),更換日志文件,動態加?載配置。不處理用戶的請求。
工作進程:干活的,處理用戶的請求,協調各個模塊完成任務。由 管理進程管理。
nginx+lua請求處理流程
ngx_lua,生效于 工作進程。
模型:一個請求,一個協程。
錯誤處理
語法錯誤:
-- 錯誤處理?a==10
for?a?=?1,10?print(a)
end
程序無法運行。
運行錯誤:
錯誤處理 assert和error
assertfunction?add(a,b)assert(b,"b是nil")endadd(1)assert:第一個參數為true,不輸出第二個參數。?第一個參數為false,輸出第二個參數。errorfunction?add(a,b)??if(not?b) thenerror("報error了")endprint("正常執行")?endadd(1,"a")當error和assert,觸發錯誤時,程序退出。
錯誤處理pcall
pcall(要執行的函數,函數需要的參數)
如果函數執行沒問題,返回true????如果函數執行有問題,返回false。
function?add(a,b)?c?=?a+b
print("正常執行")?end
if?pcall(add,1)?then
print("add?正常")?else
print("add?錯誤")?end
print("主程序")
錯誤處理xpcall
function?testXpcall()
c?=?1+5?end
function?testErrorHandle(error)
print("我來處理錯誤",error)?end
xpcall(testXpcall,testErrorHandle)
面向對象
對象:屬性、方法。table,function。student?= {name?=?"張三",age?=?18,?gotoSchool?= function(name)print(name.."上學")?end}--[[student.gotoSchool?= function(name)print(name.."上學")?endfunction?student.gotoSchool(name)print(name.."上學")?end]]--print("學生姓名:"..student.name..",年齡是:"..student.age)?student.gotoSchool(student.name)
技巧冒號
1。類比:一個類,實例化多個對象。