一.前言 我们都知道Nginx有很多的特性和好处,但是在Nginx上开发成了一个难题,Nginx模块需要用C开发,而且必须符合一系列复杂的规则,最重要的用C开发模块必须要熟悉Nginx的源代码,使得开发者对其望而生畏。为了开发人员方便,所以接下来我们要介绍一种整合了Nginx和lua的框架,那就是OpenResty,它帮我们实现了可以用lua的规范开发,实现各种业务,并且帮我们弄清楚各个模块的编译顺序。关于OpenResty,我想大家应该不再陌生,随着系统架构的不断升级、优化,OpenResty在被广泛的应用。
二.OpenResty运行原理 Nginx 采用的是 master-worker 模型,一个 master 进程管理多个 worker 进程,基本的事件处理都是放在 woker 中,master 负责一些全局初始化,以及对 worker 的管理。在OpenResty中,每个 woker 使用一个 LuaVM,当请求被分配到 woker 时,将在这个 LuaVM 里创建一个 coroutine(协程)。协程之间数据隔离,每个协程具有独立的全局变量_G。 ps. 协程和多线程下的线程类似:有自己的堆栈,自己的局部变量,有自己的指令指针,但是和其他协程程序共享全局变量等信息。线程和协程的主要不同在于:多处理器的情况下,概念上来说多线程是同时运行多个线程,而协程是通过代码来完成协程的切换,任何时刻只有一个协程程序在运行。并且这个在运行的协程只有明确被要求挂起时才会被挂起。 原理图如下:
三.OpenResty的优势 首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。 借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。 而且OpenResty提供了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单。目前在京东如实时价格、秒杀、动态服务、单品页、列表页等都在使用Nginx+Lua架构,其他公司如淘宝、去哪儿网等。
四.Nginx和lua的简介 1. Nginx: (1) Nginx的优点
(2) Nginx为什么性能高,占用内存少 众所周知,nginx性能高,而nginx的高性能与其架构是分不开的。在这里,我们简单粗略的介绍一下nginx的架构。
2. lua: (1) Lua 是一个小巧的脚本语言。作者是巴西人。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能 (2) Lua的特点:
五.OpenResty的安装 上面我门对OpenResty进行了简单的介绍,运行原理的说明,还有Nginx、Lua优点的介绍,是为了更好的让大家理解。让大家知道用这个的好处,接下来我简单的介绍一下OpenResty的安装和搭建一个简单的限流的例子,这是为了让大家明白,除了上面说的好处,它到底能够做什么。 OpenResty的安装: (1) 需要事先安装一下所需的插件
(2) 下载ngx_openresty-1.7.7.2.tar.gz并解压
(3) 安装LuaJIT
(4) 下载ngx_cache_purge模块,该模块用于清理nginx缓存
(5) 下载nginx_upstream_check_module模块,该模块用于ustream健康检查
(6) 安装ngx_openresty
(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文件,文件内容如下:
7. 效果 做好了以上配置,我们可以开始先设置好黑名单,然后访问请求,返回的结果是被黑名单了,然后再取消黑名单,再访问请求,显示访问成功,具体结果如下图。 七.总结 上文简单的介绍一些OpenResty,以及搭建了一个简单的应用,目的是想让大家对这个框架有一个大体的了解。随着架构的升级,我们会慢慢的把一些不太复杂的业务可以移到nginx层,从而提高我们的吞吐量,解决一些性能上的瓶颈。例如在nginx这一层做简单的限流、黑白名单,缓存之类的业务复杂性不是太强的工作,从而增加我们的吞吐率,也可以再nginx这一层过滤掉一些垃圾流量,从而让tomcat层只需要更加专注于业务。(以上是我简单粗略的一些理解,如果有什么问题,欢迎大家一起讨论) 转载请并标注: “本文转载自 linkedkeeper.com (文/曾昌荣)” |
来源:https://www.cnblogs.com/eedc/p/11778174.html