美文网首页
Lua相关知识与使用Lua拓展Nginx (实操)

Lua相关知识与使用Lua拓展Nginx (实操)

作者: 右耳菌 | 来源:发表于2022-08-15 22:31 被阅读0次

    1. Lua 概念

    Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

    • Lua特性

    轻量级:它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。

    可扩展:Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。


    2. Lua 环境安装

    如果是使用windows,可以尝试使用 LuaDist,LuaDist 是一个真正的多平台包管理系统,为Lua语言提供模块的源代码和二进制存储库。

    如果是Linux或Mac OS X,Lua已经安装在系统上,或有Lua软件包,安装下载即可。

    • 源码构建
    curl -R -O http://www.lua.org/ftp/lua-5.4.0.tar.gz
    tar zxf lua-5.4.0.tar.gz
    cd lua-5.4.0
    make all test
    make install
    

    3. Lua基本语法

    有C或Java语言基础学习Lua非常简单,我们可以创建第一个Lua程序!

    • 交互式编程

    Lua提供了交互式编程模式。可以在命令行中输入程序并立即查看效果。
    Lua交互式编程模式可以通过命令lua -ilua来启用:

    image.png
    • 标识符

    Lua标示符用于定义一个变量,函数获取其他用户定义的项。标示符以一个字母A到Z或a到z或下划线_开头后加上0个或多个字母,下划线,数字(0到9)。

    最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。

    Lua不允许使用特殊字符如@,$,和%来定义标示符。Lua是一个区分大小写的编程语言。因此在Lua中study与 STUDY是两个不同的标示符。以下列出了一些正确的标示符:


    • 关键字

    以下列出了Lua的保留关键字。保留关键字不能作为常量或变量或其他用户自定义标示符:


    一般约定,以下划线开头连接一串大写字母的名字(比如_VERSION)被保留用于Lua内部全局变量。

    • 全局变量

    在默认情况下,变量总是认为是全局的。

    全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是: nil。


    Nginx 添加Lua模块

    1. 安装LuaJit、ngx_devel_kit (NDK)、ngx_lua

    1、编译安装LuaJit

    wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
    tar xzvf LuaJIT-2.0.5.tar.gz
    cd LuaJIT-2.0.5
    make PREFIX=/usr/local/luajit
    make install PREFIX=/usr/local/luajit
    

    2、下载 ngx_devel_kit (NDK)

    wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz
    tar xzvf v0.3.0.tar.gz
    

    3、下载 ngx_lua

    wget https://github.com/openresty/lua-nginx-module/archive/v0.10.11.tar.gz
    tar xvf v0.10.11.tar.gz
    

    4、复制ngx_devel_kit (NDK)和ngx_lua解压文件

    cp -r lua-nginx-module-0.10.11/ ngx_devel_kit-0.3.0/ /root/lua/nginx-1.12.2/lua/
    
    2. 查看之前编译参数
    ./nginx -V
    nginx version: nginx/1.12.2
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
    built with OpenSSL 1.0.2k-fips  26 Jan 2017
    TLS SNI support enabled
    configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream --with-http_gzip_static_module --with-http_sub_module
    
    3. 集成添加lua
    export LUAJIT_LIB=/usr/local/luajit/lib
    export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0# 进入nginx源码解压目录中执行重新编译
    ./configure \
    --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream --with-http_gzip_static_module --with-http_sub_module --add-module=/root/lua/nginx-1.12.2/lua/ngx_devel_kit-0.3.0/ --add-module=/root/lua/nginx-1.12.2/lua/lua-nginx-module-0.10.11 --with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib"
    
    • 编译(如果是第一次安装nginx需要执行make && make install,不需要在执行备份)
    make 
    
    • 备份
    cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
    /usr/local/nginx/sbin/nginx –s stop
    cp objs/nginx /usr/local/nginx/sbin/
    cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y
    
    • 检查模块是否添加上
    nginx -V 
    
    4. 测试Lua

    编辑nginx/conf/nginx.conf

    server {
        listen       80;
        server_name localhost;
    
        location /lua {
            set $test "hello,world";
            content_by_lua '
                ngx.header.content_type="text/plain"
                ngx.say(ngx.var.test)';
        }
    }
    

    Nginx调用lua模块指令

    Nginx的可插拔模块化加载执行,共11个处理阶段

    阶段 说明
    set_by_lua 设置nginx变量,可以实现复杂的赋值逻辑
    set_by_lua_file
    access_by_lua 请求访问阶段处理,用于访问控制
    access_by_lua_file
    content_by_lua 内容处理器,接收请求处理并输出响应
    content_by_lua_file
    ngx.var nginx变量
    ngx.req.get headers 获取请求头
    ngx.req.get_uri_args 获取url请求参数
    ngx.redirect 重定向
    ngx.print 输出响应内容体
    ngx.say 通 ngx.print,但是会最后输出一个换行符
    ngx.header 输出响应头

    如果觉得有收获,欢迎点赞和评论,更多知识,请点击关注查看我的主页信息哦~

    相关文章

      网友评论

          本文标题:Lua相关知识与使用Lua拓展Nginx (实操)

          本文链接:https://www.haomeiwen.com/subject/sstlgrtx.html