用openresty开发Nginx插件

OpenResty的优点html

首先咱们选择使用OpenResty,其是由Nginx核心加不少第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx能够做为一个Web Server使用。nginx

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

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

 

四.Nginx和lua的简介web

1. Nginx:redis

(1) Nginx的优势sql

  • 轻量级一样起web 服务比apache占用更少内存及资源 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

相关文章
相关标签/搜索