持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
每日英语:
When you see your moment, you must seize it.
翻译:当你发现自己的机遇,一定抓紧它。 ——《寻梦环游记》
Lua高性能脚本
Lua介绍
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua特性:
轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
其它特性:
1)支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
2)自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
3)语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
4)通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
Lua应用场景:
1)游戏开发
2)独立应用脚本
3)Web 应用脚本
4)扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
5)安全系统,如入侵检测系统
Lua高级操作
我们用Lua脚本,一般都是和Nginx结合一起使用,那么我们的Lua脚本在请求过来的时候是如何执行的呢,下面是指令执行顺序:
http{
server{
location / {}
}
}
如上面的流程图,我们对关键的指令进行讲解:
1:init_by_lua*:当Nginx的master进程加载Nginx配置文件(加载或重启Nginx进程)时,可以通过该指令控制初始化的配置信息,init_by_lua*是Nginx配置加载的阶段。可以配置在http中。
2:init_worker_by_lua*:当Nginx启动后,会执行init_worker_by_lua*的Lua脚本,该脚本可以用来定期执行相关任务操作,类似java中的定时任务,比如定时检查相关服务的健康状态。可以配置在http中。
3:set_by_lua*:执行Lua代码,并将返回的字符串赋值给$变量,如:set_by_lua_block $res {lua-script-str}表示执行<lua-script-str>代码,并将返回的字符串赋值给$res。可以配置在server,server if,location,location if。
4:rewrite_by_lua*:重写阶段的处理程序,对每个请求执行指定的Lua代码。可以配置在http,server,location,location if。
5:access_by_lua*:在Nginx的access阶段,对每个请求执行Lua的代码,和rewrite_bylua block一样,这些Lua代码可以调用所有的Lua API,并且运行在独立的全局环境(类似于沙盒)中,以新的协程来执行。此阶段一般用来进行权限检查和黑白名单配置。可以配置在http,server,location,location if。
6:content_by_lua*:content_by_lua*:作为内容处理阶段,对每个请求执行<lua-script-str>的代码。和rewrite_by_lua_block一样,这些Lua代码可以调用所有的Lua API,并且运行在独立的全局环境(类似于沙盒)中,以新的协程来执行。可以配置在location,location if。
7:header_filter_by_lua*:在header_filter_by_lua*阶段,对每个请求执行lua代码,以此对响应头进行过滤。常用于对响应头进行添加、删除等操作。可以配置在http,server,location,location if。
8:body_filter_by_lua*:在body_filter_by_lua*阶段执行Lua代码,用于设置输出响应体的过滤器。在此阶段可以修改响应体的内容,如修改字母的大小写、替换字符串等。可以配置在http,server,location,location if。
9:log_by_lua*:在日志请求处理阶段执行lua代码。它不会替换当前access请求的日志,而会运行在access的前面。log_by_lua_block阶段非常适合用来对日志进行定制化处理,且可以实现日志的集群化维护。另外,此阶段属于log阶段,这时,请求已经返回到了客户端,对Ngx_Lua代码的异常影响要小很多。可以配置在http,server,location,location if。
总结
本篇主要介绍了一下Lua脚本语言的特性、应用场景,还有结合Nginx一起使用的Lua高级操作。