/lua-openrestry

openrestry知识总结,最佳实践!

Primary LanguageLua

lua-openrestry

  • openrestry 知识总结

    • web框架

    • lua单元测试

    • wrk-HTTP压测工具

    • ngx_lua模块API说明

      • Ngx指令

        • lua_code_cache on | off;

            作用:打开或关闭 Lua 代码缓存,影响以下指令: set_by_lua_file , content_by_lua_file, rewrite_by_lua_file, access_by_lua_file 及强制加载或者reload Lua 模块等.缓存开启时修改LUA代码需要重启nginx,不开启时则不用。开发阶段一般关闭缓存。
            作用域:main, server, location, location if
           
        • lua_regex_cache_max_entries 1024;

            作用:未知(貌似是限定缓存正则表达式处理结果的最大数量)
            
        • lua_package_path .../path... ;

            作用:设置用lua代码写的扩展库路径。
            例:lua_package_path '/foo/bar/?.lua;/blah/?.lua;;';
            
        • lua_package_cpath '/bar/baz/?.so;/blah/blah/?.so;;';

           作用:设置C扩展的lua库路径。
          
        - set_by_lua $var '' [$arg1 $arg2];
             set_by_lua_file $var  [$arg1 $arg2 ...];
             作用:设置一个Nginx变量,变量值从lua脚本里运算由return返回,可以实现复杂的赋值逻辑;此处是阻塞的,Lua代码要做到非常快.
             另外可以将已有的ngx变量当作参数传进Lua脚本里去,由ngx.arg[1],ngx.arg[2]等方式访问。
             作用域:main, server, location, server if, location if
             处理阶段:rewrite
            
        - content_by_lua '';
             content_by_lua_file luafile;
             作用域:location, location if
             说明:内容处理器,接收请求处理并输出响应,content_by_lua直接在nginx配置文件里编写较短Lua代码后者使用lua文件。
        
        - rewrite_by_lua ''
             rewrite_by_lua_file lua_file;
             作用域:http, server, location, location if
             执行内部URL重写或者外部重定向,典型的如伪静态化的URL重写。其默认执行在rewrite处理阶段的最后.
             注意,在使用rewrite_by_lua时,开启rewrite_log on;后也看不到相应的rewrite log。
            
        - access_by_lua 'lua code';
             access_by_lua_file lua_file.lua;
             作用:用于访问控制,比如我们只允许内网ip访问,可以使用如下形式。
             access_by_lua '
             if ngx.req.get_uri_args()["token"] ~= "123" then
                return ngx.exit(403)
             end ';
             作用域:http, server, location, location if
        
        - header_filter_by_lua 'lua code';
             header_filter_by_lua_file path_file.lua;
             作用:设置header 和 cookie;
        
        - lua_need_request_body on|off;
             作用:是否读请求体,跟ngx.req.read_body()函数作用类似,但官方不推荐使用此方法。
        
        • lua_shared_dict shared_data 10m;
             作用:设置一个共享全局变量表,在所有worker进程间共享。在lua脚本中可以如下访问它:
             例:local shared_data = ngx.shared.shared_data
             10m 不知是什么意思。
        
        • init_by_lua 'lua code';
             init_by_lua_file lua_file.lua;
             作用域:http
             说明:ginx Master进程加载配置时执行;通常用于初始化全局配置/预加载Lua模块
        
        • init_worker_by_lua 'lua code';
            init_worker_by_lua_file luafile.lua;
            作用域:http
            说明:每个Nginx Worker进程启动时调用的计时器,如果Master进程不允许则只会在init_by_lua之后调用;通常用于定时拉取配置/数据,或者后端服务的健康检查。
            
    • postgresql文档

    • lua技巧

      • 变量申明尽量使用local

      • 错误处理

        • 使用pcall包装要执行的代码
      • 使用require加载模块

      • 请求返回可以继续执行任务(fastcgi_finish, ngx.eof())

      • 连接池使用

      • Lua中数组的索引是从1开始的

        • 可以使用#号(所有数字索引总和).
        • table.maxn(最后一个数字索引键值)两种方法来获取数组的长度
      • 判断table对象为空 table = {}

        if next(a) ~=nil then dosomething end`
      • 检查全局变量的命令 :lua-releng -L *.lua 2>&1 | grep -v -e "lua:" -e "VERSION"

    • 函数、闭包、尾调用

      • 函数
      
         local function func_name (args-list)
             statements-list
         end
         
         local foo = function (x) return 2*x end
         
         local function test(a,b,...) 
             reurn a,b
         end
       
       
      • 闭包
      
          local function fn()
              local i = 0
              return function() -- 注意这里是返回函数的地址,不是执行
                  i = i+1
              return i
              end
          end
          local c1 = fn()           -- 接收函数返回的地址
          print(c1())  --> 1          --c1()才表示执行
          print(c1())  --> 2
      
    • 函数尾调用
        
            local function foo(n)
                if n > 0 then
                    return foo(n-1)
                else
                    return 'over'
                end
            end
            local rr = foo(22)
      
      
    • string.find()
        
      s = 'crate.png'
      i, j = string.find(s, '.')
    
      Do either string.find(s, '%.') or string.find(s, '.', 1, true)
      
      
    • lua代码执行时间
      
          local request_time = ngx.now() - ngx.req.start_time()
      
      
    • lua随机数
      
      local resty_random = require "resty.random"
      local str = require "resty.string"
      local random = resty_random.bytes(10)
      local test = str.to_hex(random)