浅尝OpenResty
文章目录
- 1. 写在前面
- 2. 下载安装openresty
- 2.1 下载Openresty
- 2.2 设置nginx启动
- 3. 嵌入lua脚本
- 4. 实践
- 5. 小结
1. 写在前面
当一个域名中衍生出多个服务的时候,如果想要保持对外服务始终是一个域名,则需要通过nginx反向代理来实现。如果在转发的时候需要对具体的规则进行一些逻辑运算的话,则需要通过嵌入lua脚本来实现,而nginx本身是不支持lua功能的,目前可以通过:
- nginx + lua module来实现
- Openresty来实现
我这里尝试使用Openresty来实现lua脚本嵌入逻辑实现nginx的请求转发。
2. 下载安装openresty
2.1 下载Openresty
下载可以按照官方文档的步骤进行具体的下载:Openresty下载 - 使用虚拟机Centos的话可以直接参照:Openresty-Centos
# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/openresty.repo# update the yum index:
sudo yum check-update# install openresty
sudo yum install -y openresty
完成上面三步就完成了openresty的安装了,此时进入到默认安装路径/usr/local/openresty/bin/可以直接使用./openresty直接启动。
2.2 设置nginx启动
使用openresty启动多少了我们平常使用的nginx有点差异,所以可以通过导入nginx启动的程序到PATH中实现nginx启动。
PATH=/usr/local/openresty/nginx/sbin:$PATH
export PATH
完成之后,就可以直接使用nginx启动了。此时访问localhost可以直接看到openresty的页面。
3. 嵌入lua脚本
我们需要修改/usr/local/openresty/nginx/conf路径下的nginx.conf文件来实现。
server {listen 8088;server_name localhost;location / {access_by_lua_block {percent = 50if math.random(0,100) > percent thenreturn ngx.exec("@8080")elsereturn ngx.exec("@9090")end}}location @8080 {proxy_pass http://127.0.0.1:8080;add_header Redirect true;}location @9090 {proxy_pass http://127.0.0.1:9090;add_header Redirect true;}
}
上面的lua命令是openresty的lua-nginx-module所支持的,这个命令的含义如下:
Acts as an access phase handler and executes Lua code string specified in
{ <lua-script }for every request. The Lua code may make API calls and is executed as a new spawned coroutine in an independent global environment (i.e. a sandbox).
充当访问阶段处理器并为每个请求执行{<Lua-script}中指定的Lua代码字符串。Lua代码可以进行API调用,并在独立的全局环境(即沙箱)中作为新的派生协程执行。
简单来说:这个命令就是在请求转发的维护执行,会解析lua,并执行lua中的命令。
lua-nginx-module还支持很多lua的命令,具体可以参照:https://github.com/openresty/lua-nginx-module
上面的lua脚本的含义随机将请求转发到8080和9090,并在response的响应头加上Redirect:true。
ngx.exec()这个命令相当于执行API的调用**syntax:** *ngx.exec(uri, args?)*,这里的API可以是具体的路径,也可以是我们配置的location路径,第二个参数为请求的参数。
4. 实践
编写了两个gin的程序,分别监听8080和9090端口。
func main() {engine := gin.Default()engine.GET("/", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"code": 0,"msg": "success","data": "hello world from 8080 port",})})engine.Run(":8080")
}func main() {engine := gin.Default()engine.GET("/", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"code": 0,"msg": "success","data": "hello world from 9090 port",})})engine.Run(":9090")
}
按照脚本的逻辑,请求8088的时候,我们的请求会按照50%的概率分别被转发到8080和9090的服务。


5. 小结
通过对Openresty的简单尝试,发现nginx+lua的组合可以帮助我们实现更多特定的转发逻辑,本次只是针对概率对不同的API进行转发,通过在请求访问nginx的最尾端实现了lua脚本的按概率转发。除了这一个脚本,Openresty的nginx-lua-module还支持很多诸如init_worker_by_lua、content_by_lua_block、set_by_lua_block等一些十分有用的可以嵌入lua脚本的命令。后续如果再遇到一些更复杂的转发特定逻辑,不妨考虑使用一下其他的命令来帮助我们实现。
相关文章:
浅尝OpenResty
文章目录 1. 写在前面2. 下载安装openresty2.1 下载Openresty2.2 设置nginx启动 3. 嵌入lua脚本4. 实践5. 小结 1. 写在前面 当一个域名中衍生出多个服务的时候,如果想要保持对外服务始终是一个域名,则需要通过nginx反向代理来实现。如果在转发的时候需…...
MySQL分页查询慢怎么办
今天看到一个问题。 MySQL分页查询慢怎么办? 第一反应是用limit限制返回的条数。 比如 select * from table order by idlimit 10, 100;实际上我们限制的只是返回的条数是100,并不是查询时就从第10条开始获取数据。 所以实际上MySQL会从第0条开始查询&a…...
mongodb集群
端口192.168.115.3 192.168.115.4 1192.168.115.5 下载MongoDB软件包版本为4.2.14并安装 rpm -ih --force --nodeps *.rpm 2创建文件夹mkdir -p /opt/local/mongo-cluster/conf 3.在目录里创建配置文件cd /opt/local/mongo-cluster/conf …...
回归预测 | MATLAB实现WOA-BP鲸鱼优化算法优化BP神经网络多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现WOA-BP鲸鱼优化算法优化BP神经网络多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现WOA-BP鲸鱼优化算法优化BP神经网络多输入单输出回归预测(多指标,多图)效果一览基本…...
【前端从0开始】JavaSript——循环控制语句
循环控制语句 while语句 While 循环会在指定条件为真时循环执行代码块。 While循环,先进行条件判断,再执行循环体的代码 while (条件表达式){循环体 }注意:当前循环中,如果不满足条件,一次都不会执行 var i 1; whi…...
【Elasticsearch】spring-boot-starter-data-elasticsearch的使用以及Elasticsearch集群的连接
更多有关博主写的往期Elasticsearch文章 标题地址【ElasticSearch 集群】Linux安装ElasticSearch集群(图文解说详细版)https://masiyi.blog.csdn.net/article/details/131109454基于SpringBootElasticSearch 的Java底层框架的实现https://masiyi.blog.c…...
Python学习笔记_进阶篇(四)_django知识(三)
本章内容: Django 发送邮件Django cookieDjango sessionDjango CSRF Django 发送邮件 我们常常会用到一些发送邮件的功能,比如有人提交了应聘的表单,可以向HR的邮箱发邮件,这样,HR不看网站就可以知道有人在网站上提…...
指针(初阶)
1. 指针是什么? 指针是什么? 指针理解的2个要点: 1. 指针是内存中一个最小单元的编号,也就是地址 2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量 总结:指针就是地址&…...
Flink内核源码解析--Flink中重要的工作组件和机制
Flink内核源码 1、掌握Flink应用程序抽象2、掌握Flink核心组件整体架构抽象3、掌握Flink Job三种运行模式4、理解Flink RPC网络通信框架Akka详解5、理解TaskManager为例子,分析Flink封装Akka Actor的方法和整个调用流程6、理解Flink高可用服务HighAvailabilityServ…...
Linux 压缩解压(归档管理):tar命令
计算机中的数据经常需要备份,tar是Unix/Linux中最常用的备份工具,此命令可以把一系列文件归档到一个大文件中,也可以把档案文件解开以恢复数据。 tar使用格式 tar [参数] 打包文件名 文件 tar命令很特殊,其参数前面可以使用“-”&…...
spring boot集成mqtt协议发送和订阅数据
maven的pom.xml引入包 <!--mqtt--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId><version>2.3.6.RELEASE</version></dependency><dependency…...
【数据库】详解数据库架构优化思路(两主架构、主从复制、冷热分离)
文章目录 1、为什么对数据库做优化2、双主架构双主架构的工作方式如下:双主架构的优势包括:但是一般不用这种架构,原因是: 3、主从复制主从复制的工作方式如下:主从复制的优势包括:主从复制的缺点 4、冷热分…...
el-table 实现动态表头 静态内容 根据数据显示动态输入框
直接放代码了 <el-table:data"form.tableDataA"borderstripestyle"width: 100%; margin-top: 20px"><el-table-columnv-for"(category, categoryIndex) in form.tableDataA":key"categoryIndex":label"category.name&qu…...
Reids 的整合 Spring Data Redis使用
大家好 , 我是苏麟 , 今天带来强大的Redis . REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选…...
3D数据转换工具HOOPS Exchange概览
HOOPS Exchange SDK是一组C软件库,使开发团队能够快速为其应用程序添加可靠的2D和3D CAD导入和导出功能。这允许访问广泛的数据,包括边界表示(BREP)、产品制造信息(PMI)、模型树、视图、持久ID、样式、构造…...
【从零开始的rust web开发之路 一】axum学习使用
系列文章目录 第一章 axum学习使用 文章目录 系列文章目录前言老规矩先看官方文档介绍高级功能兼容性 二、hello world三、路由四,handler和提取器五,响应 前言 本职java开发,兼架构设计。空闲时间学习了rust,目前还不熟练掌握。…...
oracle警告日志\跟踪日志磁盘空间清理
oracle警告日志\跟踪日志磁盘空间清理 问题现象: 通过查看排查到alert和tarce占用大量磁盘空间 警告日志 /u01/app/oracle/diag/rdbms/orcl/orcl/alert 跟踪日志 /u01/app/oracle/diag/rdbms/orcl/orcl/trace 解决方案: 用adrci清除日志 确定目…...
【vue】el-table 数据更新后,刷新表格数据
表格里面的数据更新后,可以通过以下方法来刷新表格 方法1 用更新后的数据,覆盖之前的数据 var newTableData[];for(var i0;i<that.tableData.length;i){ if(aIdthat.selectStationId&&bIdthat.selectDeviceId){that.tableData[i].physica…...
AVL——平衡搜索树
✅<1>主页:我的代码爱吃辣📃<2>知识讲解:数据结构——AVL树☂️<3>开发环境:Visual Studio 2022💬<4>前言:AVL树是对二叉搜索树的严格高度控制,所以AVL树的搜索效率很高…...
TCP通信流程以及一些TCP的相关概念
1.TCP和UDP区别 都为传输层协议 UDP:用户数据报协议,面向无连接,可以单播,多播,广播,面向数据报,不可靠 TCP:传输控制协议,面向连接的,可靠的,基…...
s2-pro效果惊艳展示:情感化语音合成——喜悦、平静、关切语调
s2-pro效果惊艳展示:情感化语音合成——喜悦、平静、关切语调 1. 专业级语音合成新标杆 s2-pro作为Fish Audio开源的专业级语音合成模型镜像,正在重新定义文本转语音的技术边界。不同于传统单调的语音合成,这款工具能够精准捕捉并复现人类语…...
SEER‘S EYE模型辅助计算机组成原理教学:概念可视化与问答
SEERS EYE模型辅助计算机组成原理教学:概念可视化与问答 计算机组成原理这门课,对很多学生来说,就像在学一门“外星语”。CPU、寄存器、流水线、缓存……这些词听起来就够抽象的,更别说理解它们是怎么协同工作的了。传统的教学方…...
Qwen3-32B-Chat API优化:降低OpenClaw任务Token消耗的5个技巧
Qwen3-32B-Chat API优化:降低OpenClaw任务Token消耗的5个技巧 1. 为什么需要关注Token消耗? 当我第一次在本地部署OpenClaw对接Qwen3-32B-Chat模型时,最让我震惊的不是它的推理能力,而是执行简单自动化任务后Token消耗的速度。一…...
nli-distilroberta-base多场景:跨境电商商品描述与用户评论的语义一致性检测
nli-distilroberta-base多场景:跨境电商商品描述与用户评论的语义一致性检测 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务,专门用于分析两个句子之间的逻辑关系。这个轻量级但强大的工具在跨境电商领域…...
智慧生鲜配送:揭秘生鲜配送商城APP功能版块设计
在数字化消费浪潮中,生鲜配送商城APP成为居民采购食材的重要渠道。其功能版块设计聚焦用户需求,通过智能化、便捷化的操作体验,打造高效生鲜购物场景。以下揭秘其核心功能玩法,解析如何实现“从指尖到餐桌”的流畅服务。一、首页&…...
科研加速器:GLM-4.7-Flash驱动OpenClaw自动整理文献综述
科研加速器:GLM-4.7-Flash驱动OpenClaw自动整理文献综述 1. 为什么需要自动化文献整理 作为每天需要阅读十几篇论文的科研工作者,我发现自己至少有30%的时间花在了机械性劳动上——下载PDF、重命名文件、提取关键结论、整理参考文献格式。这些工作虽然…...
洛谷 P1833:樱花 ← 混合背包(01 + 完全 + 多重)
【题目来源】 https://www.luogu.com.cn/problem/P1833 【题目描述】 爱与愁大神后院里种了 n 棵樱花树,每棵都有美学值 Ci(0<Ci≤200)。爱与愁大神在每天上学前都会来赏花。爱与愁大神可是生物学霸,他懂得如何欣赏樱花:一种樱花树看一遍…...
3大创新让你的设备静如耳语:智能风扇控制技术全解析
3大创新让你的设备静如耳语:智能风扇控制技术全解析 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/F…...
抖音视频智能管理:如何通过批量下载与自动化分类实现90%效率提升
抖音视频智能管理:如何通过批量下载与自动化分类实现90%效率提升 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在短视频内容爆炸的时代,高效的视频采集、批量下载与系统化内容管理已…...
STM32模拟Linux内核自动初始化机制实现
STM32模拟Linux内核自动初始化机制实现1. 项目概述1.1 技术背景在传统嵌入式开发中,程序通常按照顺序逻辑执行,当系统复杂度增加时会导致代码臃肿、模块耦合紧密。Linux内核通过initcall机制实现了模块化初始化,本项目在STM32平台上模拟实现了…...
