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

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

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即成功

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;;";

6. lua语法知识

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库

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

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关键字

6.4 table用法

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

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

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

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 s() 
return 1,2,3,4
end     
a,b,c,d = s() -- 此时,a = 1, b = 2, c = 3, d = 4

6.6 Lua控制语句

  • 条件控制
    if 条件 then … elseif 条件 then … else … end
  • While 循环
    while 条件 do … end
  • Repeat 循环
    repeat … until 条件
  • For 循环
    for 变量 = 初值,终点值,步进 do … end

6.7 Lua标准库

  • Lua标准库包括
    Math、IO、String、Table、OS和Debug
  • Lua第三方库包括
    Mysql、Redis、Http、memcached等
    require(mysql)

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】