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。类比:一个类,实例化多个对象。