Lua入门及技术指南

版权声明:本文版权归云焰所有,转载请注明。 https://blog.csdn.net/yan_dk/article/details/89643763

1. Lua基本介绍

为什么要使用lua

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

入门

Lua开发者:http://www.luaer.cn/

在线手册:https://www.runoob.com/lua/lua-tutorial.html

基本语法

local:局部变量申明 ,默认为全局变量。

字符串连接符,..,两个点

...

2. Nginx+lua环境安装

系统环境

Centos7.4

安装Nginx

参考:https://blog.csdn.net/yan_dk/article/details/89478638

安装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相关模块

  • 下载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、响应返回给客户端。

 

 

持续完善,待续...

猜你喜欢

转载自blog.csdn.net/yan_dk/article/details/89643763
今日推荐