nginx+lua

[](https://Seven-

zhang.github.io/#1-%E5%AE%89%E8%A3%85lua%E7%BC%96%E8%AF%91%E5%99%A8LuaJIT “1. 安装lua编译器LuaJIT”)1. 安装lua编译器LuaJIT

#wget http://luajit.org/download/LuaJIT-2.0.3.tar.gz  
#tar -xzvf LuaJIT-2.0.3.tar.gz  
#cd LuaJIT 2.0.3  
#make && make install  

安装完成后配置环境变量,使nginx可找到luajit

#export LUAJIT_LIB=/usr/local/lib  
#export LUAJIT_INC=/usr/local/include/luajit-2.0  

[](https://Seven-

zhang.github.io/#2-%E4%B8%8B%E8%BD%BDlua%E6%A8%A1%E5%9D%97%EF%BC%8C%E7%BC%96%E8%AF%91lua%E8%BF%9Bnginx- nginx%E7%89%88%E6%9C%AC%E8%87%B3%E5%B0%911-6-x “2. 下载lua模块,编译lua进nginx,nginx版本至少1.6.x”)2. 下载lua模块,编译lua进nginx,nginx版本至少1.6.x

下载lua-nginx-module点击这里
下载ngx_devel_kit点击这里

#cd NGINX/NGINX-1.6.2/  
#./configure --add-module=/path/to/ngx_devel_kit --add-module=/path/to/lua-nginx-module-0.9.10  
#make && make install  

启动nginx如报错(./nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory),执行如下命令:
ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2

[](https://Seven-

zhang.github.io/#3-%E6%B5%8B%E8%AF%95%E6%98%AF%E5%90%A6%E6%88%90%E5%8A%9F “3. 测试是否成功”)3. 测试是否成功

在nginx.conf中加入如下配置:

location /lua_content {  
      
    default_type 'text/plain';  
    content_by_lua_block {  
        ngx.say('Hello,world!')  
     }  

通过命令curl -i http://ip:port/lua_content 返回hello world即成功

[](https://Seven-

zhang.github.io/#4-lua%E5%9C%A8nginx%E4%B8%AD%E7%9A%84%E9%85%8D%E7%BD%AE “4. lua在nginx中的配置”)4. lua在nginx中的配置

#加载lua文档和so库文档,';;'代表默认路径  
lua_package_path  '/usr/local/nginx/lua/?.lua;/blah/?.lua;;';  
lua_package_cpath "/usr/local/3party/lib/?.so;/usr/local/sms/3party/luasocket/?.so;;";  

[](https://Seven-zhang.github.io/#6-lua%E8%AF%AD%E6%B3%95%E7%9F%A5%E8%AF%86

“6. lua语法知识”)6. lua语法知识

[](https://Seven-zhang.github.io/#6-1-%E5%AE%89%E8%A3%85lua-5-3-1 “6.1

安装lua 5.3.1”)6.1 安装lua 5.3.1

#curl -R -O http://www.lua.org/ftp/lua-5.3.1.tar.gz   
#tar zxf lua-5.3.1.tar.gz   
#cd lua-5.3.1   
#make linux test  
#如编译报错,需安装readline和ncurses库  

[](https://Seven-

zhang.github.io/#6-2-lua%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95 “6.2 lua基本语法”)6.2 lua基本语法

  • Lua注释
    单行注释用–,多行注释用–[[ ]]

  • Lua语句
    语句之间可以用分号”;”隔开,也可以用空白隔开
    语句块用 do 和 end 括起来的

  • Lua关键字,关键字不能做为变量
    and break do else elseif end false for function if in local nil not or repeat return then true until while

  • 数值运算
    支持 +, -, *, /,^,两个字符串用..连接,例:

    print(“hello "..“ketty")      ---->>hello ketty
    
  • 比较运算
    < > <= >= == ~= —-»返回 true 或false

  • 逻辑运算
    and, or, not
    a and b:如果 a 为 false,则返回 a;否则返回 b
    a or b :如果 a 为 true,则返回 a;否则返回 b
    注: 在 Lua 中,只有 false 和 nil 才计算为 false,其它任 何数据都计算为 true,0 也是 true
    local limit_speed_on = ngx.var.limit_speed_on or “0” —-»定义默认值的方法

  • 运算符优先级,从高到低顺序如下
    ^ not - (一元运算) * / + ..(字符串连接) < > <= >= ~= == and or

[](https://Seven-

zhang.github.io/#6-3-lua%E5%8F%98%E9%87%8F%E5%AE%9A%E4%B9%89 “6.3 lua变量定义”)6.3 lua变量定义

  • 变量类型,可用type()函数查看
    Nil空值,var1=nil –nil要小写
    Boolean布尔值,var2=true
    Number数值,var3=23.32
    String字符串,var4=“string”,转义用”[[“和”]]”
    Table关系表类型,T1={100,[12]=30,color=“red”}
    Function函数类型,function add(a,b) return a+b end
    Userdata 可以是宿主的任意数据类型,常用有 Struct 和指针
    Thread线程类型,lua中没有真正的线程

  • 变量定义
    变量名字区分大小写,变量不需要声明,可同时给多个变量赋值
    变量分为全局和局部变量,局部变量用local关键字

[](https://Seven-zhang.github.io/#6-4-table%E7%94%A8%E6%B3%95 “6.4

table用法”)6.4 table用法

only data-structure mechanism in Lua
可以把这个类型看作是一个数组,在 Lua 中,你可以用任意类型来作为数组的索引,除了nil,例:

 	T1= {10,   		     
[25] = 40,         
Andy=       
{Age=27,         
Gender=Male    --还可以写成:["Gender"]=Male  
},        
 		20    --相当于 [2] = 20}  

所有元素之间,总是用逗号”,”隔开
所有索引值都需要用”[“和”]”括起来;如果是字符串,还可以去掉引号和中括号
如果不写索引,则索引就会被认为是数字,并按顺序自动从 1 往后编

[](https://Seven-zhang.github.io/#6-5-Function%E7%94%A8%E6%B3%95 “6.5

Function用法”)6.5 Function用法

  • 函数定义

    function (a,b) – add 是函数名字,a 和 b 是参数名字
    return a+b –return 用来返回函数的运行结果   
      end
    –相对于:add = function (a,b) return a+b end


  • 可变参数个数
    function sum (a,b,…)

  • 返回多个结果

    function ()
    return 1,2,3,4
    end     
    a,b,c,d = s() – 此时,a = 1, b = 2, c = 3, d = 4


[](https://Seven-

zhang.github.io/#6-6-Lua%E6%8E%A7%E5%88%B6%E8%AF%AD%E5%8F%A5 “6.6 Lua控制语句”)6.6 Lua控制语句

  • 条件控制
    if 条件 then … elseif 条件 then … else … end

  • While 循环
    while 条件 do … end

  • Repeat 循环
    repeat … until 条件

  • For 循环
    for 变量 = 初值,终点值,步进 do … end

[](https://Seven-zhang.github.io/#6-7-Lua%E6%A0%87%E5%87%86%E5%BA%93 “6.7

Lua标准库”)6.7 Lua标准库

  • Lua标准库包括
    Math、IO、String、Table、OS和Debug

  • Lua第三方库包括
    Mysql、Redis、Http、memcached等
    require(mysql)

[](https://Seven-

zhang.github.io/#6-8-%E7%BB%83%E4%B9%A0%E9%A2%98%EF%BC%8C%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F “6.8 练习题,冒泡排序”)6.8 练习题,冒泡排序

function bub_sort(t)  
    for i=1,#t do  
        for j=#t,i+1,-1 do  
            if t[j-1]>t[j] then  
                local temp=t[j-1]  
                t[j-1]=t[j]  
                t[j]=temp                  
            end  
        end  
    end  
    return t  
end  

7. OpenResty

  • OpenResty
    已经集成了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单

  • 编译安装

    #tar xzvf ngx_openresty-VERSION.tar.gz
    #cd ngx_openresty-VERSION/
    #./configure
    #make && make install


  • 目录结构
    drwxr-xr-x 2 root root 4096 Mar 28 03:12 bin
    drwxr-xr-x 6 root root 4096 Nov 1 2014 luajit
    drwxr-xr-x 5 root root 4096 Nov 1 2014 lualib
    drwxr-xr-x 11 root root 4096 Nov 1 2014 nginx

参考

http://www.lua.org
http://luajit.org
http://wiki.nginx.org/HttpLuaModule
https://github.com/openresty/lua-nginx-module
【Programming in Lua】

糖果

糖果
LUA教程

Lapis框架的常用处理方法

Lapis框架的常用处理方法 Continue reading

MoonScript实现选择排序

Published on February 26, 2017

MoonScript与Redis客户端

Published on January 19, 2017