nginx中使用lua脚本

lua模块的安装详见:https://www.jianshu.com/p/077208fc838c

1 Lua基本语法-变量的定义

以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)。最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。

Lua 不允许使用特殊字符如 @, $, 和 % 来定义标示符。 Lua 是一个区分大小写的编程语言。因此在 Lua 中 W3c 与 w3c 是两个不同的标示符。
关键字不允许做变量名称


关键字

2 Lua基本语法-数据类型

Lua是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。


数据类型

我们可以使用type函数测试给定变量或者值的类型:

print(type("Hello world")) --> string
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string

变量
变量在使用前,必须在代码中进行声明,即创建该变量。编译程序执行代码之前编译器需要知道如何给语
句变量开辟存储区,用于存储变量的值。
Lua 变量有三种类型:全局变量、局部变量、表中的域。
函数外的变量默认为全局变量,除非用 local 显示声明。函数内变量与函数的参数默认为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束(或者是直到下一个同名局部变量的声明)。
变量的默认值均为 nil。

a = 5 -- 全局变量
local b = 5 -- 局部变量
function joke()
      c = 5 -- 全局变量
      local d = 6 -- 局部变量
end
joke()
print(c,d) --> 5 nil
do
      local a = 6 -- 局部变量
      b = 6 -- 全局变量
      print(a,b); --> 6 6
end
print(a,b) --> 5 6

循环语法:

while

Lua 编程语言中 while 循环语句在判断条件为 true 时会重复执行循环体语句。
Lua 编程语言中 while 循环语法:

while(condition)
do
     statements
end

使用如下:

a=10
while( a < 20 )
do
      print("a 的值为:", a)
      a = a+1
end

for循环

Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。
Lua 编程语言中 for语句有两大类::
数值for循环
泛型for循环
数值for循环:Lua 编程语言中数值for循环语法格式:

for var=exp1,exp2,exp3 do
<执行体>
end

var从exp1变化到exp2,每次变化以exp3为步长递增var,并执行一次"执行体"。exp3是可选的,如果不指定,默认为1。

# 10 8 6 4 2 0
for i=10,0,-2 do
    print(i)
end

# 1 a 2 b 3 b
arr = {"a","b","c"}
for i,v in ipairs(arr) do
     #key
     print(i)
     #value
     print(v)
end

泛型for循环:泛型for循环通过一个迭代器函数来遍历所有值,类似java中的foreach语句。

--打印数组a的所有值
for i,v in ipairs(a)
      do print(v)
end

i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。

days = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
for i,v in ipairs(days) do
    print(v)
end

输出结果:


流程控制
Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码,在条件为 false 时执行其他指定代码。
控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true 和非nil为真。
要注意的是Lua中 0 为 true:

--[ 0 为true ]
if(0)
then
    print("0 为真")
end

3 nginx使用lua脚本

1.缓存
语法:lua_code_cache on | off
含义:指定是否开启lua的代码编译缓存,开发时可以设置为 off,以便lua文件实时生效,如果是生产线上,为了性能,建议开启。
2.路径
语法:lua_package_path
含义:设置 lua 代码的寻找目录。
3.ngx.var.VAR_NAME
语法:ngx.var.VAR_NAME
含义:读写Nginx的变量值。例如HTTP请求头、Nginx set的变量、URL参数,甚至Nginx通过正则表达式捕获的1、2等值(获取方式是ngx.var[1]、ngx.var[2],依此类推)。
案例:

server
{
    listen 8080;
    server_name www.blog131.com;
    root /www/blog;
    index  index.html index.htm;

    location /lus {
        default_type text/html;
        set $a '';
        set $b '';
        set $c '';
        #引入函数库
        #arg_test 是test参数
        rewrite_by_lua_block {
            local ngx = require "ngx";
            ngx.var.a = 1;
            ngx.var.b = ngx.var.http_user_agent;
            ngx.var.c = ngx.var.arg_test;
        }

        echo $a;
        echo $b;
        echo $c;
    }
}
test
请求头

4.Ngx.req.set_header()
语法:Ngx.req.set_header(header_name,header_value)
含义:添加或修改当前HTTP的请求头,如果请求头已经存在,则会被替换成新的值。通过此方式设置的请求头会被继承到子请求中。
5.Ngx.req.get_headers()
语法:ngx.req.get_headers()
含义:获取当前请求的全部请求头,并返回一个Lua的table类型的数据。
6.ngx.req.clear_header()
语法:ngx.req.clear_header(header_name)
含义:清除当前请求中指定的请求头。清除后,如果存在未执行的子请求,则子请求会继承清除后的请求头。

location /lus_header {
        default_type text/html;
        #引入函数库
        rewrite_by_lua_block {
            local ngx = require "ngx";
            ngx.req.set_header("Test",{"1","2"});
            local header_ngx = ngx.req.get_headers();
            ngx.say(header_ngx["Test"]);
            ngx.print(header_ngx["Test"]);
        }
    }
image.png
响应头

7.ngx.resp.get_headers
语法:ngx.resp.get_headers()
含义:读取当前请求的响应头,并返回一个Lua的table类型的数据。
8.ngx.header.HEADER = VALUE
语法:value = ngx.header.HEADER
含义:对响应头进行修改、清除、添加等操作。
如果需要清除一个响应头,将它赋值为nil即可,如下所示:
Ngx.header[“X-Test”] = nil

location /lus_resp {
        default_type text/html;
        #引入函数库
        content_by_lua_block {
            local ngx = require "ngx";
            ngx.header.test = {"1","2"};
            local header_ngx = ngx.resp.get_headers();
            ngx.say(header_ngx["Test"]);
        }
    }
image.png

9.set_by_lua
语法:set_by_lua $res <lua-script-str> [$arg1 $arg2 ...]
含义:是为了能够让nginx的变量与lua的变量相互作用赋值。

案例(注意引号):

    location /lus_set {
        default_type text/html;
        set $diff '';
        set_by_lua $sum '
            local ngx = require "ngx"
            local a = 32
            local b = 56
            ngx.var.diff = a - b
            return a + b';
        echo "sum = $sum, diff = $diff";
    }

image.png

10.content_by_lua
语法:content_by_lua <lua-script-str>
含义:可以由lua直接确定nginx响应页面的正文

案例:
content_by_lua “ngx.print(ngx.var[‘arg_a’])”

11.rewrite_by_lua
语法:rewrite_by_lua <lua-script-str>
含义:这个指令更多的是为了替代HttpRewriteModule的rewrite指令来使用的,优先级低于rewrite指令

案例 (重定向):

    location /lus_rewrite {
        set $a 12;
        set $b '';
        rewrite_by_lua '
            ngx.var.b = tonumber(ngx.var.a) + 1
            if tonumber(ngx.var.b) == 13 then
                return ngx.redirect("/bar");
            end
        ';
        echo "res = $b";

    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容