当前位置: 首页 > news >正文

浅谈openresty

熟悉了nginx后再来看openresty,不得不说openresty是比较优秀的。

对nginx和openresty的历史等在这此就不介绍了。

首先对标nginx,自然有优劣

一、开发难度

nginx:

毫无疑问nginx的开发难度比较高,需要扎实的c/c++基础,而且还需要对nginx源码比较熟悉,开发效率慢,比如实现一个类似echo的功能,至少要上百行代码。而openresty只需要一句ngx.say即可。

openresty:

由于是lua脚本级别的,开发效率自然高出许多,开发难度也降低了很多,不需要知道nginx的源码,只需要知道nginx的大概的流程和基础原理,还有基础配置。当然必须要去了解openresty提供的接口。官方接口文档链接如下:

Lua Ngx API - OpenResty Reference

因此openresty开发容易上手,开发效率很高。

二、性能

这个是离不开的话题,nginx的性能在web架构上是出了名的高效。在大部分程序员固有的思维中可能想当然的认为脚本肯定比如c运行得快。当然这是正常的,毕竟绝大多数脚本确实如此。然而在openresty这你可能需要改变这样认知。

首先openresty的基于nginx的,在其中嵌入了lua模块,但是其也充分发挥了nginx的高性能,如果你认为使用lua脚本性能就降低了,那就错了。

首先lua虽是脚本语言,但是他特别小巧,也是使用c来实现的,而且使用的LuaJIT的技术编译lua代码,运行效率比原来的lua解释器高出了许多,如果再深入到源码,会发现,openresty大致是使用向lua注册c函数或ffi方式实现lua对nginx接口,也可以这么理解,lua脚本源码在nginx启动的时候,就被翻译成了二进制的代码。所以其性能非常好。

但是你非要和原生的nginx相比,性能到底有没有说的这么好,大家不防自己试试。看如下配置

server {

        listen 8888 ;

        server_name test;

        location /ngx {

            echo "ngx hello\n" ;

        }

        location /lua {

            content_by_lua_block {

                ngx.say("lua hello\n")

            }

        }

    }

使用ab测试工具进行10万次测试

ab -k -c 20 -n 100000 'http://localhost:8888/ngx'

ab -k -c 20 -n 100000 'http://localhost:8888/lua'

我在我的设备上测试结果则lua脚本完胜。而且某些指标lua还胜出不少。

我曾经是也自以为lua性能可不如c,自此我无数次的测试后,发现,我的认知错了。

因此从性能上而言,openresty是完全发挥了nginx的高性能,在某些方面性能不降还反超了。

三、灵活性

nginx:

灵活性是nginx的一个主要的特性。其完全模块化的设计,模块之间耦合度比较低,非模块代码极少,此设计使其具备高度的灵活性。

openresty:

openresty提供了大量比较精良的lua库,也具备比较高度的灵活性,但和nginx比起来要逊色一些。

openresty主要是使用其提供的lua库和一些第三方的lua库,对于nginx中一些复杂的开发,openresty可能达不到要求。

比如:mysql,openresty自带的库,有使用限制,不能在进程初始化,模块初始化等阶段使用

在nginx中,使用c自然使用c接口调用mysql可以在任何地方进行mysql的连接初始化等操作。当然我们或许可以使用第三方的mysql的lua库来解决此问题。

再如,如果我们需要额外新的内置变量,这个是就openresty所不能做到的。

总体而言,openresty灵活性也很不错,但是比nginx要逊色一些。

本次只是简单的浅谈。

总体而言,使用openresty比nginx更有性价比,主要就是nginx的开发难度比较大,而且openresty充分发挥了nginx的高性能,某些方面还反超了,因此只要能使用openresty开发,我肯定优先选择openresty。但是如果想要更加用好openresty还是需要进一步去了解openresty源码特别是nginx的源码,这样只会对你开发工作如虎添翼。

比如了解了openresty的源码,你才可能知道,其access_by_lua_block是在access阶段中最后一个被执行(第一次进入时,会自动将本模块移到最后该阶段最后一个,此操作进行一次,具体参见函数ngx_http_lua_access_handler的实现)

相关文章:

浅谈openresty

熟悉了nginx后再来看openresty,不得不说openresty是比较优秀的。 对nginx和openresty的历史等在这此就不介绍了。 首先对标nginx,自然有优劣 一、开发难度 nginx: 毫无疑问nginx的开发难度比较高,需要扎实的c/c基础&#xff…...

【学习笔记】2024最新版SpringCloud教程

2024最新版SpringCloud教程 0 前言闲聊开篇简介 1 SpringBoot和SpringCloud版本选型 2 SpringCloud是什么能干吗 3 SpringCloud各组件的停更升级替换说明 4 项目实战之需求说明 5 项目实战之Maven父工程聚合说明和mysql驱动选择 6 项目实战之Mapper4一键生成Dao层代码 …...

Proxyless Service Mesh:下一代微服务架构体系

一、项目背景及意义 在当今的微服务架构中,应用程序通常被拆分成多个独立的服务,这些服务通过网络进行通信。这种架构的优势在于可以提高系统的可扩展性和灵活性,但也带来了新的挑战,比如: 服务间通信的复杂性&#…...

大数据Flink(一百一十八):SQL水印操作(Watermark)

文章目录 ​​​​​​SQL水印操作(Watermark) 一、为什么要有WaterMark 二、​​​​​​​Watermark解决的问题 三、​​​​​​​​​​​​​​代码演示 ​​​​​​SQL水印操作(Watermark) 一、​​​​​​​为什么要…...

【QGC】把QGroundControl地面站添加到Ubuntu侧边菜单栏启动

把QGroundControl地面站添加到Ubuntu侧边菜单栏启动 简介准备工作步骤 1: 创建 Desktop Entry 文件步骤 2: 编辑 Desktop Entry 文件步骤 3: 刷新应用程序菜单步骤 4: 将 QGroundControl 固定到侧边栏 环境: Ubuntu :20.04 LTS 简介 QGroundControl 是…...

PostgreSQL配置主从同步

PostgreSQL配置主从同步 1 主、备库安装postgresql软件 su - pg12 cd /home/pg12/resource tar -zxvf postgresql-12.9.tar.gz cd postgresql-12.9/ ./configure --prefix/home/pg12/soft/ make -j 16 && make install2 主、备库配置环境变量 vi ~/.bash_profile…...

基于python+django+vue的鲜花商城系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的线…...

李飞飞任CEO,空间智能公司World Labs亮相,全明星阵容曝光

人工智能的下个大方向已经出现,标志性学者决定下场创业。 本周五,一个重磅消息引爆了 AI 圈:斯坦福大学计算机科学家李飞飞正式宣布创办 AI 初创公司 ——World Labs,旨在向人工智能系统传授有关物理现实的深入知识。 李飞飞说道&…...

PyTorch详解-可视化模块

PyTorch详解-可视化模块 Tensorboard 基础与使用启动 TensorBoard访问 TensorBoard使用 TensorBoardSummaryWriter类介绍参数说明常用方法 CNN卷积核与特征图可视化参数说明返回值 混淆矩阵与训练曲线可视化混淆矩阵可视化训练曲线绘制 模型参数打印参数说明输出解释 Tensorboa…...

Bootstrap 警告信息(Alerts)使用介绍

本章将讲解警告(Alerts)以及 Bootstrap 所提供的用于警告的 class。警告(Alerts)向用户提供了一种定义消息样式的方式。它们为典型的用户操作提供了上下文信息反馈。 您可以为警告框添加一个可选的关闭按钮。为了创建一个内联的可…...

uniapp(H5)设置反向代理,设置成功后页面报错

设置反向代理后,页面报错图: 反向代理代码:devServer下面就是配置对应的代理,一般这样就没问题了 "h5": {"router": {"mode": "hash"},"devServer": {"port": 517…...

define、typedef和using的使用

define、typedef 和 using 是 C(以及 C 语言中的 define)中用于定义别名或简化复杂类型的三个关键字,但它们各自有着不同的用途和行为。下面将分别对比这三个关键字: 1. #define 定义方式:#define 是预处理指令&…...

vue element时间选择不能超过今天 时间选中长度不能超过7天

背景: 使用elenmet plus 组件实现时间选择;且日期时间选择不能超过今天;连续选中时间的长度范围不能超过7天 效果展示: 实现思路: 一、使用element组件自带的属性和方法; :disabled-date"disabledDate…...

如何 吧一个 一维数组 切分成相同等分,一维数组作为lstm的输入(三维数据)的数据预处理 collate_fn的应用

要将一个一维数组切分成相同等分,你可以使用 Python 的内置功能或者 NumPy 库(如果你处理的是数值数据)。以下是几种不同的方法: 方法3 pad_sequence 结合dataloader 应该是最佳方案 ### 方法 1: 使用 Python 的内置切片功能 如果…...

Remix 学习 - @remix-run/react 中主要的 hooks

在 remix-run/react 中,有几个常用的 hooks,它们帮助你在 Remix 应用中处理路由、数据加载和其他功能。以下是一些主要的 hooks: useLoaderData: 用于获取从 loader 函数中返回的数据。 通常在组件中调用,以便访问路由加载的数据…...

STL之stack

stack容器 - 先进后出” - stack是堆栈容器&#xff0c;是一种的容器。 - 头文件&#xff1a;#include <stack> stack的push()与pop()方法 stack.push(elem);//往栈头添加元素 stack.pop();//从栈头移除第一个元素 stack<int> stkInt; stkInt.push(1);stkInt…...

如何用3个月零基础入门网络安全?_网络安全零基础怎么学习

前 言 写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全&#xff0c;实现自己的“黑客梦”。文章的宗旨是&#xff1a; 1.指出一些自学的误区 2.提供客观可行的学习表 3.推荐我认为适合小白学习的资源.大佬绕道哈&#xff01; →点击获取网络安全资料攻略← 一、自学…...

适合学生党开学买的蓝牙耳机?分享开放式耳机排行榜前十名

学生党开学想买耳机的话&#xff0c;我觉得比较适合入手开放式耳机&#xff0c;因为这类耳机佩戴舒适度高&#xff0c;长时间使用也不会感到不适或疲劳&#xff0c;同时保持耳道干爽透气&#xff0c;更加健康卫生&#xff0c;还能提供自然、开阔的音场&#xff0c;音质表现优秀…...

汽车租赁系统1.0版本

汽车租赁系统1.0版本比较简陋&#xff0c;以后还会有2.0、3.0……就像《我爱发明》里面的一代机器二代机器&#xff0c;三代机器一样&#xff0c;是一个迭代更新的过程&#xff08;最近比较忙&#xff0c;可能会很久&#xff09;&#xff0c;这个1.0版本很简陋&#xff0c;也请…...

DockerDocker Compose安装(离线+在线)

Docker&Docker Compose安装(离线在线) Docker离线安装 下载想要安装的docker软件版本&#xff1a;https://download.docker.com/linux/static/stable/x86_64/ 如目标机无法从链接下载&#xff0c;可以在本机下载后 scp docker版本压缩包[如docker-20.10.9.tgz] usernameh…...

Reddit内容获取引擎:从API调用到自动化管道的实战指南

1. 项目概述与核心价值 最近在折腾一个挺有意思的小玩意儿&#xff0c;叫 Cat-tj/reddit-reader 。乍一看名字&#xff0c;你可能觉得这又是一个简单的Reddit爬虫或者内容聚合器。但如果你深入了解一下&#xff0c;会发现它远不止于此。这个项目本质上是一个高度定制化、可编…...

基于sagents框架的AI智能体开发:从核心原理到实战应用

1. 项目概述&#xff1a;一个面向开发者的AI智能体构建框架最近在AI应用开发圈子里&#xff0c;一个名为sagents的开源项目开始引起不少同行的注意。如果你正在寻找一个能帮你快速构建、测试和部署AI智能体&#xff08;Agent&#xff09;的框架&#xff0c;而不是从零开始造轮子…...

基于TRRS Trinkey的辅助技术设备开发:从接口转换到可编程交互

1. 项目概述&#xff1a;当辅助技术遇上可编程硬件如果你接触过辅助技术&#xff08;Assistive Technology, AT&#xff09;&#xff0c;或者身边有朋友需要借助特殊设备与数字世界交互&#xff0c;你可能会发现&#xff0c;市面上很多现成的开关、控制器要么功能单一&#xff…...

Perplexity最新v2.4文档重大更新预警:3个已删除接口、2个强制迁移路径、1个即将下线的Auth Flow——错过今晚将无法兼容生产环境

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Perplexity最新v2.4文档重大更新预警总览 Perplexity v2.4 文档体系迎来结构性升级&#xff0c;核心聚焦于开发者体验一致性、API 响应语义增强及本地化支持扩展。本次更新不再仅限于补丁式修订&#x…...

QClaw 多智能体协同全攻略:总智能体统一调度子智能体(创建 + 调用 + 实操)

摘要 QClaw(腾讯龙虾 AI)自 v0.2.14 起接入Hermes 多智能体框架,支持创建1 个总智能体(主 Agent)+N 个子智能体(专业 Agent),由总智能体统一理解用户意图、拆解任务、调度子智能体执行并汇总结果,实现 “一个入口、分工协作、自动完成” 的复杂工作流。本文详解:是否…...

Wand-Enhancer终极指南:3步免费解锁WeMod Pro高级功能的完整方案

Wand-Enhancer终极指南&#xff1a;3步免费解锁WeMod Pro高级功能的完整方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod专业版的订阅费…...

AI技能实战:本地部署大模型构建智能摘要工具

1. 项目概述&#xff1a;一个面向AI技能实践的开发者工具箱最近在GitHub上看到一个挺有意思的项目&#xff0c;叫inblog-inc/inblog-ai-skills。光看这个名字&#xff0c;你可能会觉得它又是一个关于“AI技能”的教程合集或者理论文档。但点进去之后&#xff0c;我发现它的定位…...

ESP32-S3物联网开发实战:从点灯到上云Adafruit IO

1. 项目概述&#xff1a;从点灯到上云&#xff0c;解锁ESP32-S3的完整能力拿到一块ESP32-S3开发板&#xff0c;比如Adafruit的QT Py ESP32-S3&#xff0c;很多朋友的第一步就是让板载的RGB LED&#xff08;NeoPixel&#xff09;闪起来&#xff0c;这就像嵌入式世界的“Hello Wo…...

PP 蜂窝板生产线智能控制系统架构与 PLC 程序设计思路

PP 蜂窝板生产线智能控制系统架构与 PLC 程序设计思路摘要&#xff1a;针对 PP 蜂窝板产线多段速度同步、温度压力闭环、真空度稳定与定长裁切精度要求&#xff0c;本文介绍基于 PLCHMI 的智能控制系统整体架构&#xff0c;分模块阐述挤出温控、真空定型、牵引同步、在线测厚与…...

从Simulink的Vector信号到C代码数组:手把手拆解初始化(initialize)与步进(step)函数的生成逻辑

从Simulink的Vector信号到C代码数组&#xff1a;手把手拆解初始化与步进函数的生成逻辑 在嵌入式系统开发中&#xff0c;Simulink模型到C代码的转换过程往往被视为一个"黑箱"——工程师们习惯性地点击生成按钮&#xff0c;然后接受输出的代码文件。然而&#xff0c;当…...