为什么需要?

Nginx官方自带了非常多的核心模块再加上第三方的模块能够满足我们大部分的业务需要,但是业务的需求、业务的场景变化需要添加些额外的功能,如果自己 去开发一个nginx模块相对来说比较笨重,我们可以使用lua脚本直接内嵌到nginx当中实现一些业务逻辑,完成一些特殊的功能需求。

什么是lua?

Lua是一种轻量级、可嵌入式的脚本语言,这样可以非常容易的嵌入到其他语言中使用。另外Lua提供了协程并发,即以同步调用的方式进行异步执行,从而实现 并发,比起回调机制的并发来说代码更容易编写和理解,排查问题也会容易

什么是ngx_lua?

ngx_lua是Nginx的一个模块,将Lua嵌入到Nginx中,从而可以使用Lua来编写脚本,这样就可以使用Lua编写应用脚本,部署到Nginx中运行,即Nginx变成了一 个Web容器;这样开发人员就可以使用Lua语言开发高性能Web应用了。

场景

理论上可以使用ngx_lua开发各种复杂的web应用,不过Lua是一种脚本/动态语言,不适合业务逻辑比较重的场景,适合小巧的应用场景,代码行数保持在几十行 到几千行。目前见到的一些应用场景:

  1、web应用:会进行一些业务逻辑处理,甚至进行耗CPU的模板渲染,一般流程:mysql/redis/http获取数据、业务处理、产生JSON/XML/模板渲染内容,比如 京东的列表页/商品详情页。

 2、接入网关:实现如数据校验前置、缓存前置、数据过滤、API请求聚合、AB测试、灰度发布、降级、监控等功能,比如京东的交易大Nginx节点、无线部门 正在开发的无线网关、单品页统一服务、实时价格、动态服务;

 3、Web防火墙:可以进行IP/URL/UserAgent/Referer黑名单、限流等功能;

4、缓存服务器:可以对响应内容进行缓存,减少到后端的请求,从而提升性能;

一、安装Lua模块

1、安装lua

nginx的lua脚本支持热更新嘛 nginx lua模块_lua

2、/etc/profile 文件中加入环境变量

export LUAJIT_LIB=/usr/local/LuaJIT/lib export LUAJIT_INC=export LUAJIT_LIB=/usr/local/LuaJIT/lib #路径是上面luajit实际安装路径,路径错误安 装nginx的lua模块时会报错很早不到luajit 库 source /etc/profile 立刻生效,如果ngixn安装的时候不生效需要重启服务器

3、下载ngx_devel_kit模块

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

NDK(nginx development kit)模块是一个拓展nginx服务器核心功能的模块,第三方模块开发可以基于它来快速实现。NDK提供函数和宏处理一些基本任务, 减轻第三方模块开发的代码量。

4、下载lua-nginx-module模块

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

lua-nginx-module 模块使nginx中能直接运行lua

5、再次编译nginx

增加这两个模块

 

--add-module=/root/download/lua-nginx-module-0.10.9rc7
    --add-module=/root/download/ngx_devel_kit-0.3.

0

并且在编译的时候指定动态链接库位置

/usr/local/LuaJIT/lib 为你安装lua脚本的位置
./configure --with-ld-opt="-Wl,-rpath,/usr/local/LuaJIT/lib" --with-http_gzip_static_module --with-file-aio --add- module=/root/course/nginx-upsync-module-2.1.0 --with-threads --add-module=/root/course/ngx_cache_purge-2.3 --add- module=/root/course/lua-nginx-module-0.10.9rc7 --add-module=/root/course/ngx_devel_kit-0.3.0

二、ngx_lua入门

ngx_lua 属于 nginx的一部分,它的执行指令都包含在 nginx 的11个步骤之中了,相应的处理阶段可以做插入式处理,即可插拔式架构,不过 ngx_lua 并不是 所有阶段都会运行的;另外指令可以在 http、server、server if、location、location if 几个范围进行配置:

nginx的lua脚本支持热更新嘛 nginx lua模块_nginx_02

nginx-lua 部分api说明

nginx的lua脚本支持热更新嘛 nginx lua模块_nginx_03

相应的api在这里可以找到

https://github.com/openresty/lua-nginx-module#nginx-api-for-lua

相应的lua模块 ,加载一些模块

https://www.nginx.com/resources/wiki/modules/lua/

https://github.com/pintsized/lua-resty-http/releases