高性能web网关之Openresty相关基础知识

news2024/11/15 3:17:14

高性能web网关之Openresty

  • 一、Openresty 简介
  • 二、Openresty 应用场景
  • 三、lua-nginx-module
    • 3.1、Lua 模块指令顺序
    • 3.2、Lua嵌入nginx
  • 四、责任链
  • 五、cosocket
  • 后言

一、Openresty 简介

openresty 是一个基于 nginx 与 lua 的高性能 web 平台,其内部集成了大量精良的 lua 库、第三方模块以及大数的依赖项。用于方便搭建能够处理超高并发、扩展性极高的动态 web 应用、web 服务和动态网关。

openresty 通过汇聚各种设计精良的 nginx 模块,从而将 nginx有效地变成一个强大的通用 Web 应用平台。这样,可以使用 Lua 脚本语言调动 Nginx 支持的各种C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

openresty 的目标是让你的 Web 服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型(多reactor 模型),不仅仅对 HTTP 客户端请求(stream),甚至于对远程后端诸如MySQL、PostgreSQL、Memcached 以及 Redis etcd kafka grpc等都进行一致的高性能响应(upstream)。

二、Openresty 应用场景

奇虎360的所有服务端团队都在使用,京东、百度、魅族、知乎、优酷、新浪这些互联网公司都在使用。有用来写 WAF(web application firewall)、有做 CDN 调度、有做广告系统、消息推送系统,API server 的。还有用在非常关键的业务上。

  1. 在请求真正到达上游服务之前,Lua 可以随心所欲的做复杂的访问控制和安全检测。
  2. 随心所欲的操控响应头里面的信息。
  3. 从外部存储服务(比如 Redis,Memcached,MySQL,Postgres)中获取后端信息,并用这些信息来实时选择哪一个后端来完成业务访问。
  4. 在内容 handler 中随意编写复杂的 Web 应用,使用同步但依然非阻塞的方式,访问后端数据库和其他存储。
  5. 在 rewrite 阶段,通过 Lua 完成非常复杂的 URL dispatch。
  6. 用 Lua 可以为 nginx 子请求和任意 location,实现高级缓存机制。

三、lua-nginx-module

nginx 采用模块化设计,使得每一个 http 模块可以仅专注于完成一个独立的、简单的功能,而一个请求的完整处理过程可以由无数个 http 模块共同合作完成。为了灵活有效地指定下一个http 处理模块是哪一个;http 框架依据常见的的处理流程将处理阶段划分为 11 个阶段,其中每一个阶段都可以由任意多个http 模块流水式地处理请求。

openresty 将 lua 脚本嵌入到 nginx 阶段处理的末尾模块下;这样以来并不会影响 nginx 原有的功能,而是在 nginx 基础上丰富它的功能。

嵌入 lua 的优点是:使用 openresty 开发,不需要重新编译,直接修改 lua 脚本,重新启动即可。

nginx_lua
抽象:虚拟主机对应一个lua虚拟机,每个请求对应一个协程。

3.1、Lua 模块指令顺序

lua_nginx_module
new

3.2、Lua嵌入nginx

(1)init_by_lua。master fork之前调用,此阶段初始化的数据将被复制多个worker进程中。它的作用有:加载一些耗时模块、设置全局变量、初始化共享内存等。

在 nginx 重新加载配置文件时,运行里面 lua 脚本,常用于全局变量的申请。例如 lua_shared_dict 共享内存的申请,只有当 nginx 重启后,共享内存数据才清空,这常用于统计。

(2)init_worker_by_lua。master fork之后,worker初始化时调用,在每个 Nginx 工作进程启动时执行;此阶段初始化的数据各个worker可不同。它很重要的一个作用是开启定时器。

(3)ssl_certificate_by_lua。ssl阶段,在握手时设置安全证书。

(4)set_by_lua。用于设置nginx变量;设置一个变量,常用与计算一个逻辑,然后返回结果,该阶段不能运行Output API、Control API、Subrequest API、Cosocket API。

(5)rewrite_by_lua。用于执行内部url重写或外部重定向。在 access 阶段前运行,主要用于 rewrite url。

(6)access_by_lua。用于访问控制。这条指令运行于 nginx access 阶段的末
尾,因此总是在 allow 和 deny 这样的指令之后运行,它们同属 access 阶段。可用来判断请求是否具备访问权限。

(7)content_by_lua。用于内容管理。此阶段是所有请求处理阶段中最为重要的一个,运行在这个阶段的配置指令一般都肩负着生成内容(content)并输出HTTP 响应。

(8)header_filter_by_lua。设置应答消息的头部信息;一般只用于设置 Cookie 和 Headers 等。

(9)body_filter_by_lua。用于修改应答body的内容。一般会在一次请求中被调用多次,因为这是实现基于 HTTP 1.1 chunked 编码的所谓“流式输出”的。

(10)log_by_lua。用于log请求处理阶段,用lua处理日志。该阶段总是运行在请求结束的时候,用于请求的后续操作,如在共享内存中进行统计数据,如果要高精确的数据统计,应该使用 body_filter_by_lua

(11)balancer_by_lua。上游服务器的负载均衡。

四、责任链

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。接收者是由多个处理对象构成,把这些处理对象连接成一个链表,并沿着这个链条传递请求,直到由一个对象处理它为止。

责任链的执行流程是通过链表组合处理对象,按需打断。openresty将lua嵌入nginx处理阶段中,通过ngx.exit进行打断:ngx.OK打断当前阶段,执行下一个阶段;而>=200打断整个请求处理。

五、cosocket

openresty 为 nginx 添加的最核心的功能就是 cosocket。自cosocket 加入,可以在 http 请求处理中访问第三方服务。cosocket 主要依据 nginx 中的事件机制和 lua 的协程结合后实现了非阻塞网络 io。在业务逻辑使用层面上可以通过同步非阻塞的方式来写代码。引入 cosocket 后,nginx 中相当于有了多条并行同步逻辑线(lua 协程),nginx 中单线程负责唤醒或让出其中 lua 协程。唤醒或让出依据来源于协程运行的条件是否得到满足。

通过lua协程将socket的异步事件编程转化为同步处理。基于cosocket实现了很多精良的第三方库。

cosoket有:ngx.socket.tcp、ngx.socket.udp、resty.redis、resty.mysql等。

后言

本专栏知识点是通过<零声教育>的系统学习,进行梳理总结写下文章,对c/c++linux系统提升感兴趣的读者,可以点击链接查看详细的服务:C/C++服务器开发 。

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

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

相关文章

148.排序链表

148.排序链表 题目&#xff1a; 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4]示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;…

【论文阅读】CVPR2018-深度材料感知跨光谱立体匹配

深度材料感知跨光谱立体匹配 摘要 跨光谱成像对识别和检测任务很有帮助。通常&#xff0c;多个相机用于跨光谱成像&#xff0c;因此需要图像对齐或双目系统中的视差估计。多相机跨光谱系统逐渐被嵌入到有源RGB-D设备中&#xff08;例如Kinect和iPhone X中的RGB-NIR相机&#…

2022 年度回忆

2022 年度回忆 过了今天就是2023年了&#xff0c;记录一下在这一年里发生的点点滴滴吧。 年度总结2022 年度回忆1.石家庄实习2.准备秋招&#xff0c;然后去沈阳实习3.回学校4.来北京实习了总结今年大体且分为四条故事线 1.22年上半年石家庄实习 2.实习结束回家准备秋招&#…

句子表征(各项异性等偏差):PromptBERT: Improving BERT Sentence Embeddings with Prompts

一、核心 句子表征存在不足之处&#xff0c;可能面临各向异性、可能受到词频的影响、可能受到子词、大小写等的影响等等。 Gao et al.(2019)和Wang et al.(2020)指出&#xff0c;对于语言建模&#xff0c;使用最大似然训练通常会产生一个各向异性的词嵌入空间。“各向异性”是…

BabaSSL:支持半同态加密算法 EC-ElGamal

01 背 景 随着大数据与人工智能的快速发展&#xff0c;个人隐私数据泄露和滥用时有发生&#xff0c;隐私安全问题也越来越被重视。 国家于 2020 年施行密码法、2021 年施行个人信息保护法&#xff0c;对个人隐私数据和数据安全加密有更高的要求。 因此&#xff0c;隐私计算也…

2022年博客之路总结

今年是不平凡的一年&#xff0c;IT行业 开卷 的一年&#xff0c;今年大多数人 都 因种种原因 被迫换了工作&#xff0c;再次 先感谢CSDN 这个平台&#xff0c;在这里 给自己了一块可以展示自己才华的空间&#xff0c;通过CSDN平台的各项运营数据&#xff0c;让我有幸 拿到了 更…

flv.js播放flv视频

flv.js是FLV视频播放器&#xff0c;纯JS开发&#xff0c;无需Flash。 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport"…

【虚幻引擎UE】UE5 制作一个元旦烟花短视频的小案例(使用sequence制作视频案例)

祝愿大家元旦快乐&#xff01; 效果预览 一、创建粒子烟花特效 可以使用现成的Niagara烟花粒子特效&#xff0c;直接跳过这一步。 1、 通过Niagara系统创建粒子特效 选择现有发射器素材。 或者也可新建空白特效&#xff0c;将发射器拖入轨道&#xff08;素材包含闪光、拖…

基于TP6+Uni-app框架开发的多端圈子社区论坛小程序H5系统,带数据库和安装教程

正文&#xff1a; 前台uni-app后台tp6开发的多端圈子社区论坛小程序H5系统,带数据库和安装教程。 系统基于TP6Uni-app框架开发&#xff1b;客户移动端采用uni-app开发&#xff0c;管理后台TH6开发。 系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步&#xff0c…

CSDN的2022和2023

前言 今天是2022年12月31日&#xff0c;今年的最后一天&#xff0c;年关已至。 又到了&#xff1a;回头看路&#xff0c;低头赶路&#xff0c;抬头望路的时候。 回顾2022 疫情中的2022 今年应该算是疫情的高峰期吧&#xff0c;各种新冠变异株横行&#xff0c;从严控到一夜…

Day845.Fork/Join -Java 并发编程实战

Fork/Join Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于Fork/Join的内容。 线程池、Future、CompletableFuture 和 CompletionService&#xff0c;仔细观察会发现这些工具类都是在帮助站在任务的视角来解决并发问题&#xff0c;而不是让纠缠在线程之间如何协作的…

深度学习:05 卷积神经网络介绍(CNN)

目录 卷积神经网络简介 为什么要用卷积神经网络 网络结构组成 卷积层 卷积计算 卷积核大小 f 边界填充 (p)adding 步长 (s)tride 计算公式 卷积层 激活函数 池化层&#xff08;pooling&#xff09; dropout层 全连接层 卷积神经网络简介 卷积神经网络由一个或多个…

DoIP协议从入门到精通系列——车载网络安全

现代社会慢慢步入数字时代,在这个时代,网络安全已经成为最重要的关注点。自从1980年第一次出现电脑病毒,网络威胁和攻击持续不断,给社会(经济)带来巨大影响。随着汽车的数字化和互联化发展,自然而然会联想到汽车也将为成为黑客攻击的目标。导致的问题除了单纯的不便(攻…

数据结构 | 十大排序超硬核八万字详解【附动图演示、算法复杂度性能分析】

写在前面 2023年的第一篇博客&#xff0c;在这里先祝大家兔年快乐&#x1f430; 本文从学习到搜寻各种资料&#xff0c;整理成博客的形式展现足足花了一个月的时间&#xff0c;慢工出细活&#xff0c;希望本篇文章可以真正带你学懂排序&#xff0c;不再为写排序算法而苦恼 博主…

MQTT协议的工作原理

一、MQTT概述 MQTT由IBM的Andy Stanford-Clark博士和Arcom&#xff08;现为Eurotech&#xff09;的Arlen Nipper于1999年发明。 MQTT 是物联网 &#xff08;IoT&#xff09; 最常用的消息传递协议。MQTT 代表 MQ 遥测传输。该协议是一组规则&#xff0c;用于定义物联网设备如何…

二叉树16:找树左下角的值

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;513.找树左下角的值 题目&#xff1a; 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边…

Android每周一轮子:Nvwa(热修复)

前言 &#xff08;废话&#xff09; 最近发现了一个问题&#xff0c;一些平时博客写的很多的程序员&#xff0c;反倒在日常的工作中&#xff0c;却是业务写的很一般&#xff0c;只会摆理论的人&#xff0c;甚至还跑出来教别人如何找工作&#xff0c;如何做架构&#xff0c;其实…

2022年终总结:少年不惧岁月长,彼方尚有荣光在。

2022年终总结&#xff1a;少年不惧岁月长&#xff0c;彼方尚有荣光在。 &#x1f3ac; 博客主页&#xff1a;王同学要努力 &#x1f3ac;个人简介&#xff1a;大三小白&#xff0c;喜欢前端 &#xff0c;热爱分享 &#x1f3a5; 本文由 王同学要努力 原创&#xff0c;首发于…

Eureka 注册中心

Eureka 注册中心目录概述需求&#xff1a;设计思路实现思路分析1.快速上手2.增加 Maven 依赖3.Client端配置注册中心Server端配置注册中心参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip ha…

R 语言 管道操作符

背景 关于代码的简洁性,就是你使用了比较简化的高级操作符,但是有时候会增加代码的可读性。这种可读性在于你是否真正的去了解R的高级语法。你了解高级语法,他就不难,你不了解,他就难,可读性差。 这里我们来讲解一下,关于管道操作符,使R语言编程简化一些。 管道操作…