天天看点

Lua入门及技术指南之11. Lua基本介绍2 windows环境安装lua2.1. Nginx+lua环境安装3. 案例

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

可能报错如下:

Lua入门及技术指南之11. Lua基本介绍2 windows环境安装lua2.1. Nginx+lua环境安装3. 案例

可继续安装如下解决

# yum -y install lua-devel

#make && make install

  • 测试是否安装成功
Lua入门及技术指南之11. Lua基本介绍2 windows环境安装lua2.1. Nginx+lua环境安装3. 案例

说明安装lua成功,可以执行指令。

  • 验证nginx中lua能否正常执行

#vi /usr/local/nginx/conf/nginx.conf

Lua入门及技术指南之11. Lua基本介绍2 windows环境安装lua2.1. Nginx+lua环境安装3. 案例

编辑增加红字标识的lua脚本,然后在启动nginx后重载

#nginx -s reload

浏览器运行  http://ip:port

Lua入门及技术指南之11. Lua基本介绍2 windows环境安装lua2.1. Nginx+lua环境安装3. 案例

打印出结果页面,说明lua在nginx中能正常执行。

3. 案例

需求:商品详情页被网站频繁访问,商品详情页很多时候内容是很少变化的,做商品详情页的缓存,减轻服务器压力。

问题分析:我们可以使用Redis缓存商品详情页内容,可以做多个服务器组成集群用于存储商品详情页,客户端请求商品详情页,经过负载均衡分发到不同的服务器,但传统的负载均衡策略(最少连接数、轮询、Hash等),可能会将相同的商品详情页分发到不同的服务器,这样可能会在不同服务器有很多重复的缓存,并增大了Redis缓存的压力,如果我们自行定制负载均衡分发流量的逻辑,将不同的商品详情页分发到不同的服务器,最大化利用服务器资源,降低Redis缓存压力,这就需要使用Lua脚本来实现。

原理图解如下:

Lua入门及技术指南之11. Lua基本介绍2 windows环境安装lua2.1. Nginx+lua环境安装3. 案例

处理逻辑整理:一个商品详情页对应一个商品id,请求中可以传递商品id参数,我们就可以基于商品的id进行流量分发。包含如下逻辑步骤。

     1、获取请求参数商品id;

     2、获取id的哈希值,取模做负载均衡,获取到一个地址;

    3、利用http请求,请求应用层服务器;

    4、响应返回给客户端。

持续完善,待续...

继续阅读