美文网首页
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 (实操)

    1. Lua 概念 Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程...

  • 2018-10-25

    Nginx下Lua处理阶段与使用范围 init_by_lua http set_by_lua server, se...

  • nginx(openrestry)实现动态负载均衡

    nginx配置 lua文件 相关Lua库 json解析库:https://github.com/mpx/lua-c...

  • 2018-12-03

    实时统计nginx状态的lua拓展ngx_lua_reqstatus 项目地址:https://github.co...

  • 基于Nginx&Lua 和Netflix Eureka的

    Zuul for Nginx&Lua 基于Nginx和Lua module。需要安装Nginx Lua模块或者直接...

  • Nginx配置LUA支持

    安装LUA环境及相关库 官方网站:https://github.com/openresty/lua-nginx-m...

  • Redis+Lua实现限流

    分布式限流最关键的是要将限流服务做成原子化,而解决方案可以使使用redis+lua或者nginx+lua技术进行实...

  • Ngxin与lua(十一)

    Lua lua是一个简洁,轻量,可扩展的脚本语言.nginx与lua的优势:充分的结合Nginx的并发处理epol...

  • lua启用lua-resty-core

    lua-resty-core 是把 lua-nginx-module 已有的部分 API,使用 FFI 的模式重新...

  • 《redis学习》之lua

    Redis+Lua的好处 redis在2.6开始加入了lua脚本,使用lua脚本有如下好处: 减少网络开销。复合操...

网友评论

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

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