1. Lua基本介绍
为什么要使用lua
Nginx官方自带了非常多的核心模块再加上第三方的模块能够满足我们大部分的业务需要,但是业务的需求、业务的场景变化需要添加些额外的功能,如果自己去开发一个nginx模块相对来说比较笨重,我们可以使用lua脚本直接内嵌到nginx当中实现一些业务逻辑,完成一些特殊的功能需求。
入门
Lua官网:http://www.lua.org
Lua开发者:http://www.luaer.cn/
在线手册:http://cloudwu.github.io/lua53doc/manual.html https://www.runoob.com/lua/lua-tutorial.html
基本语法
local:局部变量申明 ,默认为全局变量。
字符串连接符,..,两个点
...
2 windows环境安装lua
下载扩展库: http://pecl.php.net/package/lua, 记得点dll, 点文件名是源码, 需要编译的(),windows下有现成的就直接用(linux下的编译请参考:Linux下安装PHP的lua扩展库), windows下的编译不是一般的麻烦.
复制php_lua.dll到php目录下的ext下(如果你的php.ini不是配置成extension_dir = "ext", 请复制到相应目录 )
复制liblua.dll到php的目录 下
php.ini修改增加如下:
extension=lua
重启ngnix(如果你用的apach就重启apach)和php~ 大功告成, 其实所有的php扩展库添加应该都是这种方式 。
2.1. Nginx+lua环境安装
系统环境
Centos7.4
安装Nginx
参考:https://blog.csdn.net/yan_dk/article/details/89478638
安装Lua
一般linux环境默认会安装有Lua,一般版本为5.1.4
可到官网(http://www.lua.org)下载最新版本,进行安装
curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz tar zxf lua-5.3.5.tar.gz cd lua-5.3.5 make linux test
LuaJIT:lua的一个即时编译器
#wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
#tar -zxvf LuaJIT-2.0.5.tar.gz
#cd LuaJIT-2.0.5
#make && make install PREFIX=/usr/local/LuaJIT
加入环境变量
#vi /etc/profile
export LUAJIT_LIB=/usr/local/LuaJIT/lib
export LUAJIT_INC=/usr/local/LuaJIT
#source /etc/profile
安装Nginx相关模块
nginx:web服务
Nginx Devel Kit:NDK是一个nginx模块,以一种可作用于其他nginx模块的方式,扩展nginx核心功能。
Lua Nginx Module:该模块将Lua解释器或LuaJIT嵌入到nginx核心中,并通过nginx子请求将强大的Lua线程(也称为Lua协程)集成到nginx事件模型中。
- 下载NDK(ngx_devel_kit)模块
#wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz
#tar -zxvf v0.3.0.tar.gz ngx_devel_kit-0.3.0
NDK(nginx development kit)模块是一个拓展nginx服务器核心功能的模块,第三方模块开发可以基于它来快速实现。 NDK提供函数和宏处理一些基本任务,减轻第三方模块开发的代码量。
- 下载lua-nginx-module模块
#wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz
# tar -zxvf v0.10.9rc7.tar.gz lua-nginx-module-0.10.9rc7
lua-nginx-module模块使nginx中能直接运行lua脚本
- 再次编译Nginx
#cd /usr/local/src/nginx-1.14.1
//增加编译选项,加载上述2个模块,见红字标识
#./configure --prefix=/usr/local/nginx \--with-http_stub_status_module \--with-http_gzip_static_module \--with-http_realip_module \--with-http_sub_module \--with-http_ssl_module \--add-module=/usr/local/src/lua-nginx-module-0.10.9rc7 \--add-module=/usr/local/src/ngx_devel_kit-0.3.0
可能报错如下:
可继续安装如下解决
# yum -y install lua-devel
#make && make install
- 测试是否安装成功
说明安装lua成功,可以执行指令。
- 验证nginx中lua能否正常执行
#vi /usr/local/nginx/conf/nginx.conf
编辑增加红字标识的lua脚本,然后在启动nginx后重载
#nginx -s reload
浏览器运行 http://ip:port
打印出结果页面,说明lua在nginx中能正常执行。
3. 案例
需求:商品详情页被网站频繁访问,商品详情页很多时候内容是很少变化的,做商品详情页的缓存,减轻服务器压力。
问题分析:我们可以使用Redis缓存商品详情页内容,可以做多个服务器组成集群用于存储商品详情页,客户端请求商品详情页,经过负载均衡分发到不同的服务器,但传统的负载均衡策略(最少连接数、轮询、Hash等),可能会将相同的商品详情页分发到不同的服务器,这样可能会在不同服务器有很多重复的缓存,并增大了Redis缓存的压力,如果我们自行定制负载均衡分发流量的逻辑,将不同的商品详情页分发到不同的服务器,最大化利用服务器资源,降低Redis缓存压力,这就需要使用Lua脚本来实现。
原理图解如下:
处理逻辑整理:一个商品详情页对应一个商品id,请求中可以传递商品id参数,我们就可以基于商品的id进行流量分发。包含如下逻辑步骤。
1、获取请求参数商品id;
2、获取id的哈希值,取模做负载均衡,获取到一个地址;
3、利用http请求,请求应用层服务器;
4、响应返回给客户端。
持续完善,待续...