百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

浅谈OpenResty在Web应用防火墙中的应用

liebian365 2025-02-15 16:25 2 浏览 0 评论

随着互联网的兴起,Web应用也越来越多。企业Web应用功能丰富性的增加必然带来对应用统一管理的需求,如路由、权限管控、安全、日志监控分析等,这些管理需求由业务网关(API网关)来实现。作为企业Web应用的入口,这就要求网关具备高性能、高可靠性、开发和维护成本低等特性。

作者:吴卫东

单位:中国移动智慧家庭运营中心

1、OpenResty起源

OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。Nginx由俄罗斯工程师Igor Sysoev于2002年基于C语言开始开发,并于2004年开源,目的是解决Apache HTTP服务器不能满足C10K(单个HTTP服务器处理10000并发连接)的问题。随着Web的快速发展普及,Nginx因为其开源、跨平台、可支持百万级别的TCP并发连接、高稳定性等优点迅速传播开来,当前全球有近三分之一的HTTP服务器使用的是Nginx。

Nginx生态的丰富性归功于由于它高内聚、低耦合的模块化设计。Nginx提供的主要模块包括Core模块、Event模块、Http模块、Mail模块、Stream模块等。开发者根据Nginx模块开发规范很容易能扩展Nginx的功能。

Nginx存在局限性:对于一般的业务系统使用Nginx,业务变动仅需要改动Nginx相关配置文件重启即可,但如果需要开发或者更新第三方模块则需要重新编译安装Nginx,这个对于线上系统是不太友好的,重新编译安装Nginx是个操作程度较麻烦和变更风险性较高的过程。由此Nginx对脚本语言的支持是有必要的,Perl、Python、Js、Lua都有C的API,这几年从开发者的应用来看,Lua这种天然就是C的脚本语言使用最广泛。Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,一个完整的Lua解释器不过200k,在所有脚本引擎中,Lua的速度是最快的。

OpenResty应运而生:基于Nginx,OpenResty通过LuaJIT扩展支持,让开发者可以使用Lua脚本语言调动Nginx支持的各种C以及Lua模块,大大提高了Nginx模块开发的生产力。

2、OpenResty工作原理

OpenResty本质是基于Nginx的单Master多Worker进程模型,将LuaVM嵌入到进程中,通过LuaVM来执行Lua代码获得高性能,同时LuaVM的自动内存管理也提高了开发者的开发效率。OpenResty的两大技术特点:(1)多阶段处理;(2)Lua协程与Nginx event的高效NIO结合。下面分别介绍。

2.1 OpenResty的多阶段处理

OpenResty的多阶段处理基于Nginx的HTTP多阶段处理。如前介绍,Nginx对Http的处理也是一个个HTTP模块协作完成的,对于HTTP模块,数据的流转,衔接等管理,Nginx将它划分成11个处理阶段,每个处理阶段由多个HTTP模块进行流水线处理:

typedef enum {
    NGX_HTTP_POST_READ_PHASE = 0,    //读取请求体阶段
    NGX_HTTP_SERVER_REWRITE_PHASE,    //server URI重写阶段
    NGX_HTTP_FIND_CONFIG_PHASE,      //location查找阶段
    NGX_HTTP_REWRITE_PHASE,      //location URI重写阶段
    NGX_HTTP_POST_REWRITE_PHASE,    //检查是否发生了URI重写
    NGX_HTTP_PREACCESS_PHASE,      //访问限制阶段
    NGX_HTTP_ACCESS_PHASE,        //访问权限控制阶段
    NGX_HTTP_POST_ACCESS_PHASE,        //检查请求权限处理阶段
    NGX_HTTP_TRY_FILES_PHASE,      //try_file配置处理静态文件阶段
    NGX_HTTP_CONTENT_PHASE,      //返回内容生成阶段
    NGX_HTTP_LOG_PHASE              //日志记录阶段
} ngx_http_phases;

OpenResty将这11个阶段简化成Rewrite/Access Phase、Content Phase、 LogPhase,加上进程启动初始化的Initialization Phase共四个大阶段11个*_by_lua可重写指令。

每个阶段分工清晰,各个阶段处理http请求不同阶段的数据,分层更易于理解和开发。

2.2 Lua协程与Nginx Event的NIO结合

对于Http请求的处理,性能消耗主要在网络IO处理,Nginx相对于Apache Server多线程模型处理效率高的原因就是在于Nginx的Event处理机制。具体到Linux,Event处理机制基于Epoll实现,所有读写事件不会阻塞主线程,而是注册到epoll,主线程通过调用epoll_wait来获取可读写事件,对准备好的事件进行相应的回调处理,实现非阻塞IO。

回到OpenResty,每个Worker进程有一个LuaVM,OpenResty通过LuaVM来执行Lua代码,每个外部请求都通过一个Lua协程来处理,每个协程互不影响,每当Lua代码需要处理IO时,都会yield当前协程,将IO事件交给Nginx的Event处理,这样就不会阻塞Worker主线程,待Nginx的Event处理完毕,Resume协程继续处理。协程仅在用户态处理相对于多线程切换的开销少。通过协程结合和Nginx的非阻塞I/O模型,不仅仅对HTTP客户端请求,甚至于对远程后端诸如MySQL、PostgreSQL、Memcached以及Redis等都进行一致的高性能响应。

3、OpenResty在网站安全建设中的应用

中国移动贯众安全云WAF是一款网站应用防火墙产品,通过对Http/Https流量的分析检测,拦截恶意流量,为Web业务安全运营提供保障。截至目前,中国移动贯众安全云WAF已为超2000家站点提供网站安全防护服务。团队在研发之初做技术选型时就采用了OpenResty,主要考虑它的一下优点:

  • 降低开发门槛,Lua库极其丰富,研发效率高,能适应功能快速迭代的需求;
  • 很容易支持热更新,研发、测试、发布效率高,对业务无感知;
  • 云原生支持,裸机,容器等都可以部署维护;
  • 高性能,基于Nginx的高性能Http应用,对MySQL、Redis等也支持非阻塞IO。

贯众安全云WAF部署架构图大致如下:

由于WAF节点是串接在系统内的,这对WAF节点的性能和稳定性有较高要求,如图所示,我们通过DPVS+KeepAlived做四层负载均衡保障包的高速转发和可靠性,后面直接通过OpenResty集群进行流量的分析。经过WAF的流量都经过了十几个步骤的检测,各个步骤相互独立,互不影响,非阻塞的IO保障了检测的性能。主要使用到的阶段如下:

如上表所示,每个阶段互相配合,分工明确,配置和云WAF配置中心实时同步,能热更新业务配置、防护配置、规则库等,运维成本低。防护阶段对性能要求高的检测手段会用C写成动态库,Lua的ffi能很方便调用,和需要存储、统计运算的均采用cosocket和数据库交互,非阻塞的特性保障和数据库交互的高性能。

4、总结

OpenResty是一个基于Nginx和Lua的优秀开源组件,保留了Nginx的高性能的同时,引入Lua,降低了开发门槛,研发效率高,运维成本低。对于有大量Web平台需要治理的企业比较试用。可以基于OpenResty二次开发动态路由、限流、缓存、权限控制、安全防护等能力,替代Nginx管理企业内部站点。

参考文献

[1]OpenResty.http://openresty.org/cn/.

[2]陶辉. 深入理解nginx:模块开发与架构解析[M]. 机械工业出版社. 2013-4.

[3]Lua Nginx Module. https://github.com/openresty/lua-nginx-module.

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: