Skip to content

leonguo/lua-openrestry

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Jun 11, 2017
cd4be06 · Jun 11, 2017

History

31 Commits
Mar 9, 2017
Mar 4, 2017
Jun 1, 2017
Jun 11, 2017
May 20, 2017
Mar 7, 2017
Apr 24, 2017

Repository files navigation

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)
      
      

About

openrestry知识总结,最佳实践!

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages