nginx+lua实现web服务与复杂逻辑

一、lua简介

Lua是一种功能强大,高效,轻量级,可嵌入的脚本语言。 它支持过程编程,面向对象编程,函数编程,数据驱动编程和数据描述。
Lua将简单的过程语法与基于关联数组和可扩展语义的强大数据描述结构相结合。 Lua是动态类型的,通过使用基于寄存器的虚拟机解释字节码来运行,并具有增量垃圾收集的自动内存管理,使其成为配置,脚本和快速原型设计的理想选择。

lua官网
lua教程

二、nginx简介

nginx简介

三、ngx_lua简介

1.ngx_lua简介

ngx_lua是Nginx的一个模块,将Lua嵌入到Nginx中,从而可以使用Lua来编写脚本,这样就可以使用Lua编写应用脚本,部署到Nginx中运行,即Nginx变成了一个Web容器;这样开发人员就可以使用Lua语言开发高性能Web应用了。 ngx_lua提供了与Nginx交互的很多的API,对于开发人员来说只需要学习这些API就可以进行功能开发,而对于开发web应用来说,如果接触过Servlet的话,其开发和Servlet类似,无外乎就是知道接收请求、参数解析、功能处理、返回响应这几步的API是什么样子的。

2.ngx_lua使用场景

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

2.1 web应用

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

2.2 接入网关

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

2.3 Web防火墙

可以进行IP/URL/UserAgent/Referer黑名单、限流等功能;

2.4 缓存服务器

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

2.5 其他

如静态资源服务器、消息推送服务、缩略图裁剪等。

四、安装

1.安装依赖源

yum install readline-devel pcre-devel openssl-devel gcc lua-devel -y

2. 下载安装LuaJIT

cd /usr/local/src/;
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 install PREFIX=/usr/local/luajit

3.配置环境变量

vi /etc/profile
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0
source /etc/profile

4.下载ngx_devel_kit和lua-nginx-module和echo-nginx-module(此模块非必须)

cd /usr/local/src/;
wget https://github.com/openresty/lua-nginx-module/archive/master.zip -O lua-nginx-module.zip
wget https://github.com/simplresty/ngx_devel_kit/archive/master.zip -O ngx_devel_kit.zip
wget https://github.com/openresty/echo-nginx-module/archive/master.zip -O echo-nginx-module.zip
unzip lua-nginx-module.zip
unzip ngx_devel_kit.zip
unzip echo-nginx-module.zip

5.将lua的加到动态库,并执行ldconfig命令生效

echo "/usr/local/luajit/lib" >> /etc/ld.so.conf
ldconfig

6.安装nginx

cd /usr/local/src/;
wget -S http://nginx.org/download/nginx-1.12.2.tar.gz
tar -zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/ngx_devel_kit-0.3.0 --add-module=/usr/local/src/lua-nginx-module-0.10.9rc7 --add-module=/usr/local/src/echo-nginx-module-master
make && make install

7.测试

在nginx 的可以访问的某个文件下加入以下内容:

location /lua {
    default_type text/plain;
    content_by_lua 'ngx.say("hello world")';
}

重载nginx,然后在页面访问http://192.168.1.2/lua,返回的是hello world,即代表安装成功。

五、nginx执行过程

nginx在处理每一个用户请求时,都是按照若干个不同的阶段依次处理的,与配置文件上的顺序没有关系,详细内容可以阅读《深入理解nginx:模块开发与架构解析》这本书,这里只做简单介绍;
(1)post-read
读取请求内容阶段,nginx读取并解析完请求头之后就立即开始运行;
(2)server-rewrite
server请求地址重写阶段;
(3)find-config
配置查找阶段,用来完成当前请求与location配重块之间的配对工作;
(4)rewrite
location请求地址重写阶段,当ngx_rewrite指令用于location中,就是再这个阶段运行的;
(5)post-rewrite
请求地址重写提交阶段,当nginx完成rewrite阶段所要求的内部跳转动作,如果rewrite阶段有这个要求的话;
(6)preaccess
访问权限检查准备阶段,ngx_limit_req和ngx_limit_zone在这个阶段运行,ngx_limit_req可以控制请求的访问频率,ngx_limit_zone可以控制访问的并发度;
(7)access
权限检查阶段,ngx_access在这个阶段运行,配置指令多是执行访问控制相关的任务,如检查用户的访问权限,检查用户的来源IP是否合法;
(8)post-access
访问权限检查提交阶段;
(9)try-files
配置项try_files处理阶段;
(10)content
内容产生阶段,是所有请求处理阶段中最为重要的阶段,因为这个阶段的指令通常是用来生成HTTP响应内容的;
(11)log
日志模块处理阶段;

六、ngx_lua运行指令

ngx_lua的执行指令都包含在nginx的11个步骤之中,相应的处理阶段可以做插入式处理,即可插拔式架构,不过ngx_lua并不是所有阶段都会运行的; ngx_lua

七、简单实例

1.基于ip做访问控制

location /luaip {
    default_type text/plain;

    access_by_lua '
        if ngx.var.remote_addr == "192.168.1.63" then
            ngx.exit(ngx.HTTP_FORBIDDEN)
        end
    ';
}

2.根据ip做不同的响应

location /luaip {
    default_type text/plain;

    content_by_lua '
        if ngx.var.remote_addr == "192.168.1.63" then
            ngx.exec("/access")
        else
            ngx.exec("/refuse")
        end
    ';
}

location /access {
    echo "access";
}

location /refuse {
    return 403;
}

3.获取url中的参数

location /luaip {
    default_type text/plain;
    content_by_lua '
        ngx.say(ngx.var.args);
    ';
}

请求http://lua.2cq.com/luaip?x=1&y=2&t=3,输出结果1。

location /luaip {
    default_type text/plain;
    content_by_lua '
        ngx.say(ngx.var.arg_x);
    ';
}

八、openresty

1.简介

OpenResty®是一个成熟的网络平台,集成了增强版Nginx核心,增强版LuaJIT,许多精心编写的Lua库,许多高质量的第三方Nginx模块以及大多数外部依赖项。它旨在帮助开发人员轻松构建可伸缩的Web应用程序,Web服务和动态Web网关。

通过利用各种精心设计的Nginx模块(其中大部分由OpenResty团队自己开发),OpenResty®有效地将nginx服务器转变为功能强大的Web应用服务器,其中Web开发人员可以使用Lua编程语言编写脚本各种现有的nginx C模块和Lua模块,构建极高性能的Web应用程序,能够在一个盒子中处理10K~1000K +连接。

2.官网

http://openresty.org/en/

九、参考资料

https://blog.csdn.net/ygm_linux/article/details/53534933
https://blog.csdn.net/huangyimo/article/details/80791816
https://blog.csdn.net/qq_38974634/article/details/81625075
https://www.cnblogs.com/xd502djj/p/6097773.html
https://moonbingbing.gitbooks.io/openresty-best-practices/content/openresty/get_url_param.html

Previous Post

rabbitmq集群搭建

Next Post

lua随机数方案

Related Posts