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