• 用openresty开发Nginx插件


    OpenResty的优势

    首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。

    借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。

    而且OpenResty提供了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单。目前在京东如实时价格、秒杀、动态服务、单品页、列表页等都在使用Nginx+Lua架构,其他公司如淘宝、去哪儿网等。

    四.Nginx和lua的简介

    1. Nginx:

    (1) Nginx的优点

    • 轻量级同样起web 服务比apache占用更少内存及资源 

    • 抗并发nginx 处理请求异步非阻塞而apache 则阻塞型高并发下nginx 能保持低资源低消耗高性能 

    • 高度模块化设计编写模块相对简单 

    • 社区活跃各种高性能模块出品迅速啊

    (2) Nginx为什么性能高,占用内存少

    众所周知,nginx性能高,而nginx的高性能与其架构是分不开的。在这里,我们简单粗略的介绍一下nginx的架构。

    • 首先,nginx采用的是多多进程模式,好处是什么呢?首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低风险。

    • Nginx是采用异步非阻塞的方式去处理请求的,什么是异步非阻塞呢?其实就是当一个线程调用出现等待的io之类的情况时,而不是阻塞在这里,而是去处理别的事情,等io准备好了,然后再去执行,具体的我就不在这里和大家描述了。

    2. lua:

    (1) Lua 是一个小巧的脚本语言。作者是巴西人。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能

    (2) Lua的特点:

    • Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。

    • Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。

    五.OpenResty的安装

    上面我门对OpenResty进行了简单的介绍,运行原理的说明,还有Nginx、Lua优点的介绍,是为了更好的让大家理解。让大家知道用这个的好处,接下来我简单的介绍一下OpenResty的安装和搭建一个简单的限流的例子,这是为了让大家明白,除了上面说的好处,它到底能够做什么。

    OpenResty的安装:

    (1) 需要事先安装一下所需的插件

    1
    yum install readline-devel pcre-devel openssl-devel

    (2) 下载ngx_openresty-1.7.7.2.tar.gz并解压 

    1
    wget http://openresty.org/download/ngx_openresty-1.7.7.2.tar.gz

    (3) 安装LuaJIT

    1
    2
    3
    cd bundle/LuaJIT-2.1-20150120/
    make clean && make && make install
    ln -sf luajit-2.1.0-alpha /usr/local/bin/luajit

    (4) 下载ngx_cache_purge模块,该模块用于清理nginx缓存

    1
    wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz

    (5) 下载nginx_upstream_check_module模块,该模块用于ustream健康检查

    1
    wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz

    (6) 安装ngx_openresty

    1
    2
    3
    4
    5
    6
    7
    8
    9
    cd /usr/servers/ngx_openresty-1.7.7.2
    ./configure 
    --prefix=/usr/servers 
    --with-http_realip_module  
    --with-pcre  
    --with-luajit 
    --add-module=./bundle/ngx_cache_purge-2.3/ 
    --add-module=./bundle/nginx_upstream_check_module-0.3.0/ -j2
    make && make install

    (7) 到/usr/servers目录下,会发现多出来了如下目录,说明安装成功

    (8) 启动nginx:/usr/servers/nginx/sbin/nginx(其实我们可以配置好系统的环境变量,配置好后就可以直接数据nginx命令了)

    六.防刷(黑白名单)简单例子的搭建

    1. 首先我们先可以在/usr/servers/nginx/conf/ 目录下创建我们自己的一个简单的lua文件,就叫做example.lua好了。

    输入如下命令,我们就可以创建一个example.conf文件,或者我们可以cp nginx.conf  example.conf 或者mkdir example.conf

    2. 接下来我们需要编辑nginx.conf这个启动配置的文件了

    ok,我们进入到编辑界面,接下来我们需要将我们的example.conf文件给引入进来,在nginx.conf的http体里添加一下命令:include example.conf

    nginx.conf 的具体内容如下:

    其中大家可以看到用红线框框的是自己项目文件的引入和lua模块的引入。

    3. 接下来我们可以在example.conf文件中写我们的逻辑实现了

    4. 我们可以看到,在example.conf中的server里面配置多个location,而location中嵌入了content_by_lua_file  /usr/example/lua/redis_black_limit.lua,从这可以看出在content阶段嵌入了lua脚本,进行了内容的响应,在这里,我们进去看看相应的代码是如何来处理的:

    这是一个防刷的demo,从中我们可以看出,我是更具ip,从redis里面取值,然后通过请求ip的匹配,来做到防刷的功能,除此之外,这里有一个语句,我们的注意到,那就是require,这就相当于我们的类加载器,class.forname,从而做到加载进来lua的模块。

    5. 除此之外,还简单的做了一个设置黑名单和取消黑名单的功能,用来充当我们以后的管理中心,具体逻辑写在set_black.lua和cancel.lua中,然后在lua.conf中配置好url,具体如下图所示:

    在lua.conf中server体里加入一下代码:

    接下来我们需要写set_black.lua和cancel.lua文件,文件内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    v  set_black.lua:
    local redis =require "resty.redis"
    local cache =redis.new()
    cache:set_timeout(6000)
    local ok,err=cache.connect(cache,'192.168.150.61',6379)
    if not ok then
            ngx.say("failed to connect:",err)
            return
    end
    local ip = ngx.var.remote_addr
    cache:set("user:"..ip..":block",1)
    ngx.say("user:"..ip..":block".."设置黑名单成功")
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    v  cancel_black.lua:
    local redis =require "resty.redis"
    local cache =redis.new()
    cache:set_timeout(6000)
    local ok,err=cache.connect(cache,'192.168.150.61',6379)
    if not ok then
            ngx.say("failed to connect:",err)
            return
    end
    local ip = ngx.var.remote_addr
    cache:expire("user:"..ip..":block",0)
    ngx.say("user:"..ip..":block".."移除黑名单")

    7. 效果

    做好了以上配置,我们可以开始先设置好黑名单,然后访问请求,返回的结果是被黑名单了,然后再取消黑名单,再访问请求,显示访问成功。

    其他例子:https://www.cnblogs.com/digdeep/p/4859575.html

  • 相关阅读:
    Java 中日常使用的 IO 流总结
    NIO 实现非阻塞 Socket 通讯
    Java NIO 的简单介绍和使用
    常用设计模式 -- 一分钟就能学会的门面模式(外观模式)
    Java日志框架介绍和 Slf4j 使用
    Linux学习一
    JavaScript-数组
    javascript
    idea 快捷键汇总
    正则表达式
  • 原文地址:https://www.cnblogs.com/slqt/p/10949256.html
Copyright © 2020-2023  润新知