OpenResty介绍及实现限流

news2024/10/2 6:31:08

1 背景描述

Nginx作为一个高性能的Web服务器和反向代理服务器,已经稳定运行了多年。然而,考虑到后续分馆流量的接入,会对我们的系统造成难以预估的影响,因此在网关层对流量进行监控并管理就显得格外重要。本次调研目标为OpenResty,研究评估其是否值得将其引入替换原生Nginx

2 产品对比

2.1 产品简介

OpenResty是一个基于Nginx的Web服务器扩展,它结合了Nginx的高性能和Lua编程的灵活性,为开发人员提供了一个强大的工具来构建高性能、可扩展和定制化的Web应用程序。本文将介绍OpenResty的特点、用途、架构、Lua编程、性能优势以及如何入门使用OpenResty。

2.2 产品详情

我收集了目前市面上常见的几种流量网关,分别是OpenResty、Tengine、Kong和APISIX,以下是这四个不同的技术/产品的比较:

  1. OpenResty:
    • 类型: OpenResty是一个基于Nginx的Web服务器扩展,它结合了Nginx的高性能和Lua编程的灵活性。
    • 主要特点:
      • 强大的性能和扩展性。
      • 支持Lua编程,可以实现自定义逻辑。
      • 适用于构建高性能的Web应用程序和API代理。
      • 模块化架构,可以使用第三方模块扩展功能。
  2. Tengine:
    • 类型: Tengine是由淘宝开发的Nginx分支,专注于性能和扩展性。
    • 主要特点:
      • 高性能和性能优化。
      • 类似于Nginx,但包含一些额外的功能和性能优化。
      • 适用于构建高性能的Web应用程序和反向代理。
  3. Kong:
    • 类型: Kong是一个开源的微服务API网关,用于管理和路由API流量。
    • 主要特点:
      • 提供API管理和网关功能,包括路由、插件、认证、鉴权等。
      • 适用于微服务架构和API代理。
      • 丰富的插件生态系统,可扩展功能。
  4. APISIX:
    • 类型: APISIX是一个高性能、轻量级的开源API网关,专为微服务和云原生应用程序而设计。
    • 主要特点:
      • 高性能,基于Nginx/OpenResty构建。
      • 动态配置和多种路由方式。
      • 插件系统,可扩展功能。
      • 适用于云原生环境和微服务应用程序。

比较总结:

  1. OpenResty和Tengine都能提供高性能Web服务器和反向代理,他们都是基于Nginx并提供性能的优化
  2. Kong和APISIX重点是管理和路由API流量,比较适合充当业务网关
  3. Tengine目前除了阿里内部,对外商业运行的案例不多,并且OpenResty不管从迭代频率(最新版是23年7月份发布的)还是商业案例来说都有显著优势

3 OpenResty

3.1 版本介绍

OpenResy分为两个版本

  1. 开源官方网站:https://openresty.org/cn/
  2. 商业产品OpenResty Edge官网:https://openresty.com.cn/cn/edge/

其中开源版本需要自行组合各种库或用自己编写Lua来实现
而OpenResty Edge是完整的解决方案,开箱即用并且提供了管理界面,更易用,也有私有库私有功能

image.png

3.2 OpenResty架构

OpenResty的架构基于Nginx,但添加了一些关键组件,如LuaJIT和ngx_lua模块。下面是OpenResty的主要组件:

  1. Nginx
    Nginx是Web服务器和反向代理服务器,它处理HTTP请求和响应。它负责监听端口、路由请求和执行基本的HTTP服务器功能。
  2. LuaJIT
    LuaJIT是Lua的Just-In-Time(即时编译)编译器,它提供了高性能的Lua执行环境。OpenResty使用LuaJIT来执行Lua脚本,以实现高性能的自定义逻辑。
  3. ngx_lua模块
    ngx_lua是OpenResty的核心模块,它将LuaJIT嵌入到Nginx中,并提供了与Nginx请求处理流程的无缝集成。ngx_lua允许开发人员编写Lua脚本来扩展Nginx的功能,例如处理请求、访问控制、路由和缓存等。
  4. 第三方模块
    OpenResty支持各种第三方模块和库,可以通过安装扩展其功能。这些模块可以用于处理不同的任务,如处理JSON、与后端服务通信、执行数据转换等。

3.3 OpenResty特点

Nginx的底层模块一般都是用 C 语言写 的,如果我们想在 Nginx 的基础之上写业务逻辑会很不方便,所以这个时候我们还得借助 OpenResty,它是 Nginx 的一个社区分支。OpenResty 是中国人章亦春 发起,最早是雅虎中国的一个公司项目,基于 Perl 和 Haskell 实现,2007年开始开源,后来章亦春大佬加入淘宝后进行了彻底的设计和重写。
按照官网的说法,OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

3.4 OpenResty原理

image.png
Nginx 服务器启动后,产生一个 Master 进程(Master Process),Master 进程执行一系列工作后产生一个或者多个 Worker 进程(Worker Processes)。其中,Master 进程用于接收来自外界的信号,并向各 Worker 进程发送信号,同时监控 Worker 进程的工作状态。当 Worker 进程退出后(异常情况下),Master 进程也会自动重新启动新的 Worker 进程。Worker 进程则是外部请求真正的处理者。
多个 Worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 Worker 进程中处理,一个 Worker 进程不可能处理其它进程的请求。Worker 进程的个数是可以设置的,一般我们会设置与机器 CPU 核数一致。同时,Nginx 为了更好的利用多核特性,具有 CPU 绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来 cache 的失效(CPU affinity)。所有的进程的都是单线程(即只有一个主线程)的,进程之间通信主要是通过共享内存机制实现的。
OpenResty 本质上是将 LuaJIT 的虚拟机嵌入到 Nginx 的管理进程和工作进程中,同一个进程内的所有协程都会共享这个虚拟机,并在虚拟机中执行 Lua 代码。在性能上,OpenResty 接近或超过 Nginx 的 C 模块,而且开发效率更高。

4 应用操作

4.1 流量监控

  1. 根据官网教程下载并安装最新版的OpenResty:https://openresty.org/cn/linux-packages.html
  2. 启动并验证openResty

image.png

  1. 访问服务器

image.png

  1. 创建一个Lua脚本
-- 文件名:ip_monitor.lua
local ip = ngx.var.remote_addr -- 获取客户端IP地址

-- 打开文件句柄,指定日志文件的路径
local log_file = "/usr/local/openresty/nginx/lua/ip_monitor.log"
local file, err = io.open(log_file, "a")
if not file then
    ngx.log(ngx.ERR, "failed to open log file: ", err)
    return ngx.exit(500)
end

-- 写入日志
local log_message = "IP: " .. ip .. " 访问了网站\n"
local _, err = file:write(log_message)
if err then
    ngx.log(ngx.ERR, "failed to write log: ", err)
end

-- 关闭文件句柄
file:close()
  1. 在NG的配置文件中配置
location / {
    content_by_lua_file /usr/local/openresty/nginx/lua/ip_monitor.log;
    # 其他配置项
}
  1. 再次访问首页

image.png
可以看到日志已经完成了输出

4.2 限流

  1. 在ng中配置共享内存字典
http {
    ...
    lua_shared_dict my_limit 10m;  # 定义一个名为my_limit的共享内存字典,大小为10MB
    ...
}
  1. 创建lua脚本
-- 文件名:rate_limit.lua
local limit_req = require("resty.limit.req")

-- 使用正确的共享内存字典名称
local lim, err = limit_req.new("my_limit", 1, 1) -- 使用my_limit字典
if not lim then
    ngx.log(ngx.ERR, "failed to create rate limiter: ", err)
    return ngx.exit(500)
end

-- 检查客户端IP是否超出限制
local key = ngx.var.remote_addr
local delay, err = lim:incoming(key, true)
if not delay then
    if err == "rejected" then
        return ngx.exit(503) -- 返回503状态码表示请求被限制
    end
    ngx.log(ngx.ERR, "failed to limit req: ", err)
    return ngx.exit(500)
end

  1. ng中使用该脚本
location / {
    content_by_lua_file /path/to/rate_limit.lua;
    # 其他配置项
}
  1. 重载ng
sudo nginx -s reload
  1. 访问页面

image.png

  1. 一秒内再次访问页面

image.png

  1. 查看日志

image.png

总结

由此可见使用OpenResty进行简单开发即可以轻松完成流量监控以及限流操作,它继承了Nginx的性能优势,通过Lua编程提供了灵活性和可定制性。对于处理高流量和复杂逻辑的应用程序,OpenResty是一个强大的选择。通过使用OpenResty,可以大幅提高Web应用程序的性能和功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PowerQuery】Excel的PowerQuery的连接组的导入与导出

完成我们当前的数据连接之后,如果使用数据的用户不在本机该怎么办呢?这时候通常有两种方式来实现对于需要的数据访问。 将文件本身提供给最终用户如果数据文件本身不涉及到敏感数据连接定义,或者需要数据脱敏操作则比较适合使用这种方法提供给最终用户。但是如果使用的数据有…

IT运维监控系统和网络运维一样吗

IT运维监控系统和网络运维不是一样的。IT运维监控系统是一系列IT管理产品的统称,它所包含的产品功能强大、易于使用、解决方案齐全,可一站式满足用户的各种IT管理需求。而网络运维是指对网络设备进行监控、维护和管理,包括硬件故障的排除、软…

idea VCS配置多个远程仓库

Idea VCS配置多个远程仓库 首先要有连个远程仓库地址 idea 添加数据源 查看推送记录 添加数据源 ok之后填写账号密码 推送本地项目 选择不同远程地址 push 查看不同远程地址的 不同分支的 推送记录 不期而遇的温柔: 应用开源架构进行项目开发,特别是那…

android 注解详解

1,注解的概念 注解现在广泛的应用于android的各个开源框架中,不理解注解,我们就无法更好的提升我们的架构能力。那么什么是注解呢?注解(Annotation),是JDK5.0 引入的一种注释机制。 注解是元数…

印刷企业如何利用MES管理系统改善生产计划

随着科技的发展,印刷MES管理系统正在逐渐改变印刷企业的生产管理模式。印刷MES管理系统是一种用于监控、协调、优化生产流程的系统,它能够提供实时、准确的数据,帮助企业管理者做出更好的生产决策。本文将探讨印刷企业如何利用MES管理系统改善…

SQL sever中表管理

目录 一、创建表: 1.1语法格式: 1.2示例: 二、修改表: 2.1语法格式: 2.2示例: 三、删除表: 3.1语法格式: 3.2示例: 四、查询表: 4.1语法格式&…

C++新特性:智能指针

一 、为什么需要智能指针 智能指针主要解决以下问题: 1)内存泄漏:内存手动释放,使用智能指针可以自动释放 2)共享所有权指针的传播和释放,比如多线程使用同一个对象时析构问题,例如同样的数据…

台灯应该买什么样的才能护眼?推荐五款安全健康的护眼台灯

台灯主要还是以护眼台灯为主,因为不仅色谱丰富,贴近自然色的全光谱色彩,通常显色指数都能达到Ra95以上,显色能力特别强,而且还具有其他防辐射危害、提高光线舒适度的特性,比如侧发光技术、漫反射技术等大大…

社科院杜兰金融硕士不出国门获国家顶尖金融管理硕士学位及教育部留服中心学历学位认证

社科院杜兰金融硕士不出国门获国家顶尖金融管理硕士学位及教育部留服中心学历学位认证 中国社科院与美国杜兰大学金融管理硕士从默默无闻到人尽皆知,已在中外合作办学硕士领域走出了一条难以被模仿、无法被替代的特质。中国社会科学院与杜兰大学充分代表了中美两国…

JavaSE(一)--Java语法

!!!本文适合有c和c基础的,通过比较c和java的不同,快速入门java。!!! 这篇文章主要是介绍和c不同的地方,没说的知识点按照c写就行了。 零.整体的结构 Java是面向对象的程…

Python 套接字编程完整指南

推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 连接设备以交换信息是网络的全部意义所在。套接字是有效网络通信的重要组成部分,因为它们是用于通过本地或全球网络以及同一台计算机上的不同进程在设备之间传输消息的基本概念。它们提供了一个低级接口&am…

Java程序员学vue3最好的方式就是搭建后台管理模板

前言 作为Java程序员,vue3还是有必要学的,毕竟是国内最受欢迎的前端JS框架,你现在接手的项目,前端部分几乎都会和vue沾边,尤其是中小企业。 vue3作为新的大版本,相较于vue2改动还是很多的,目前企…

Kali Linux渗透测试技术介绍【文末送书】

文章目录 写在前面一、什么是Kali Linux二、渗透测试基础概述和方法论三、好书推荐1. 书籍简介2. 读者对象3. 随书资源 写作末尾 写在前面 对于企业网络安全建设工作的质量保障,业界普遍遵循PDCA(计划(Plan)、实施(Do…

基于Python开发的玛丽大冒险小游戏(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python开发的玛丽冒险小游戏程序,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含:项目源码、项目文档等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xf…

【PCL-11】提取平面上层的目标物,剔除平面下层目标物

因项目需求,需提取平面上的物体,不提取平面下的物体,尝试采用超体聚类+LCCP分割的方式,但由于上层点云模型一侧有空洞,导致分割效果不理想。 这里采用pcl::ExtractPolygonalPrismData类,实现平面上物体的提取。 pcl::ExtractPolygonalPrismData类是通过设定处于同一平面模…

对于html和css初学者,你有什么值得推荐的简单的网页适合练习?

前言 html和css方面个人认为主要是在于css的学习,变化最多的也在于css,下面主要是介绍一些css相关的练习网站及一些项目,希望对你有帮助~ 网站推荐 1、CODEPEN 代码与所展示的页面相互对应,你可以在上面找到其他人已经写好的de…

胖小酱之不龟手之药寓言故事

宋国有个人善于炼制一种预防皮肤冻裂的药膏。在冬天如果把这种药膏涂在手上的话就能够防止手冻裂,所以他家祖祖辈辈就靠冬天的时候,在河边把这些药膏卖给洗衣服的人们来为生。 有个外地人听说他们家善于炼制这种药膏,便寻上门来,情…

同旺科技USB to I2C 适配器烧写 Arduino 模块

所需设备: 内附链接 1、同旺科技USB to I2C 适配器 2、Arduino 模块 硬件连接: 用同旺科技USB to I2C 适配器连接芯片的TX、RX、GND; 打开Arduino IDE编辑工具, 点击“上传”按钮,完成程序的编译和烧录;

RabbtiMQ的安装与在Springboot中的使用!!!

一、安装Erlang与Rabbitmq 安装教程本教程是在centos8下试验的,其实linux系统的都差不多RabbitMQ官方:Messaging that just works — RabbitMQRabbitMQ是开源AMQP实现,服务器端用Erlang语言编写,Python、Ruby、 NET、Java、JMS、c…

使用Python操作MySQL数据库

准备 安装Python,打开命令提示符,我已经安装成功了 安装Mysql我也安装成功了 我在用户的86188下利用记事本写了一个.py的python代码,在命令提示符中运行 Python自带的集成式开发环境,在电脑搜索框直接IDEA你也会打开 一,建立连接 使用Python…