浅尝OpenResty

news2024/12/26 20:59:41

文章目录

  • 1. 写在前面
  • 2. 下载安装openresty
    • 2.1 下载Openresty
    • 2.2 设置nginx启动
  • 3. 嵌入lua脚本
  • 4. 实践
  • 5. 小结

1. 写在前面

当一个域名中衍生出多个服务的时候,如果想要保持对外服务始终是一个域名,则需要通过nginx反向代理来实现。如果在转发的时候需要对具体的规则进行一些逻辑运算的话,则需要通过嵌入lua脚本来实现,而nginx本身是不支持lua功能的,目前可以通过:

  1. nginx + lua module来实现
  2. 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 = 50
						if math.random(0,100) > percent then
							return ngx.exec("@8080")
						else
							return 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的服务。
转发到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脚本的命令。后续如果再遇到一些更复杂的转发特定逻辑,不妨考虑使用一下其他的命令来帮助我们实现。

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

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

相关文章

Pixar、Adobe 和苹果等成立 OpenUSD 联盟推行 3D 内容开放标准

导读Pixar、Adobe、Apple、Autodesk 与 NVIDIA 联手 Linux 基金会旗下的联合开发基金会&#xff08;JDF&#xff09;宣布建立 OpenUSD 联盟&#xff08;AOUSD&#xff09;以推行 Pixar 创建的通用场景描述技术的标准化、开发、进化和发展。 联盟寻求通过推进开放式通用场景描述…

[附源码]计算机毕业设计-JAVA火车票订票管理系统-springboot-论-文-ppt

PPT论文 文章目录 前言一、主要技术javaMysql数据库JSP技术 二、系统设计三、功能截图总结 前言 本论文主要论述了如何使用JAVA语言开发一个火车订票管理系统 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想…

走嵌入式还是纯软件?学长告诉你怎么选

最近有不少理工科的本科生问我&#xff0c;未来是走嵌入式还是纯软件好&#xff0c;究竟什么样的同学适合学习嵌入式呢&#xff1f;在这里我整合一下给他们的回答&#xff0c;根据自己的经验提供一些建议。 嵌入式领域也可以分为单片机方向、Linux方向和安卓方向。如果你的专业…

魏副业而战:闲鱼卖货怎么取得更大的成就

我是魏哥&#xff0c;与其躺平&#xff0c;不如魏副业而战&#xff01; 社群成员小H又办证了&#xff0c;他想干什么&#xff1f; 这是他办了的第3个证了&#xff0c;这就意味这他有9家闲鱼店铺了。 之前有跟他聊过闲鱼卖货&#xff0c;想要在闲鱼上取得更大的成就&#xff…

【zabbix企业级监控】

目录 Zabbix Zabbix特点 实验环境准备 Server端 agent端 server端 配置阿里云yum源 启动LAMP对应服务 准备java环境 源码安装zabbix Mariadb数据库授权 创建zabbix程序用户并授权防止权限报错 修改zabbix配置文件 配置php与apache web安装zabbix Zabbix页面优化…

YOLOv8+BoT-SORT多目标跟踪(行人车辆计数与越界识别)

课程链接&#xff1a;https://edu.csdn.net/course/detail/38919 BoT-SORT是发表于2022年的先进的多目标跟踪算法&#xff0c;它结合了运动和外观信息、相机运动补偿和更准确的卡尔曼滤波状态向量&#xff0c;并把这些改进集成到ByteTrack&#xff0c;从而在MOTA、IDF1和HOTA性…

数据库结构差异对比工具

简介 前几年写了一个数据库对比工具&#xff0c;但是由于实现方式的原因&#xff0c;数据库支持有限&#xff0c;所以重新设计了一下&#xff0c;便于支持多种数据库&#xff0c;并且更新了UI。 新版地址&#xff1a;https://gitee.com/xgpxg/db-diff 旧版地址&#xff1a;h…

一文入门最热的LLM应用开发框架LangChain

在人工智能领域的不断发展中&#xff0c;语言模型扮演着重要的角色。特别是大型语言模型&#xff08;LLM&#xff09;&#xff0c;如 ChatGPT&#xff0c;已经成为科技领域的热门话题&#xff0c;并受到广泛认可。 在这个背景下&#xff0c;LangChain 作为一个以 LLM 模型为核…

【CC精品教程】ContextCapture 10.20安装教程(附CC10.20安装包下载)

文章目录 一、ContextCapture 10.20安装1. 安装主程序2. 打补丁3. 安装中文包二、ContextCapture 10.20下载一、ContextCapture 10.20安装 订阅《无人机航空摄影测量精品教程》专栏(可以免费获取安装包,也可以查看更多专业航测教程)。 1. 安装主程序 下载打开安装包,如下图…

漏洞复现 || 某我行CRM系统SQL注入

漏洞描述 某任我行 CRM SmsDataList 接口处存在SQL注入漏洞&#xff0c;未经身份认证的攻击者可通过该漏洞获取数据库敏感信息及凭证&#xff0c;SenderTypeId参数存在注入&#xff0c;最终可能导致服务器失陷。 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网…

如何找到一个数的所有质因数,以及如何快速判断一个数是不是质数

前情介绍 今天遇到一个需求&#xff1a;找到一个数所有的质因数。 初步解决 先定义一个判断质数的函数&#xff1a; def is_Prime(number):i 2count 0while i < number:if number % i 0 :count 1i 1if count > 0:return Falseelse:return True 接着定义一个寻找质…

信看课堂笔记—电路若只如初见

本节课结合我们模块经常遇到的电子元器件和电路讲解下原理和方案选型 认识电阻、电容和电感 以下是电阻、电容和电感的作用的简要对比表格&#xff1a; 作用 电阻 电容 电感 限制电流 通过阻碍电流流动&#xff08;欧姆定律IU/R&#xff09; 阻止直流电流通过 随频…

JDBCTEMPLATE 的基本使用----查询操作26

1、再讲一下聚合查询&#xff0c;首先我们先讲一下查询全部&#xff0c;copy一下代码&#xff1a;ROWapper是一个接口&#xff0c;返回的数据是List 1.1 Row 是行&#xff0c; Mapper映射&#xff0c;我们要用接口帮我们去完成数据实体类的封装这件事情&#xff1a; 2&#xf…

轻量级 Bean 实体校验器

简介 概述 利用 Spring 自带校验器结合 JSR 注解实现轻量级的 Bean 实体校验器。轻捷、简单、很容易上手&#xff0c;也容易扩展。 三个核心类ValidatorInitializing、ValidatorImpl、ValidatorEnum去掉注释不超过共200行源码实现 10多m 的 Hibernate Validator 多数功能。 …

使用VS code 编辑器 导出、导入和运行Excel中的VBA代码

使用VS code 编辑器 导出、导入和运行Excel中的VBA代码 前言 Excel自带的 Microsoft Visual Basic for Applications 编辑器常被人称为上古编辑器&#xff0c;的确不适合代码编辑&#xff0c;这是其一&#xff0c;其二是当系统语言与Excel的安装语言不一致时&#xff0c;往往出…

网络安全---负载均衡案例

一、首先环境配置 1.上传文件并解压 2.进入目录下 为了方便解释&#xff0c;我们只用两个节点&#xff0c;启动之后&#xff0c;大家可以看到有 3 个容器&#xff08;可想像成有 3 台服务器就成&#xff09;。 二、使用蚁剑去连接 因为两台节点都在相同的位置存在 ant.jsp&…

从关键新闻和最新技术看AI行业发展(2023.7.10-7.23第三期) |【WeThinkIn老实人报】

Rocky Ding 公众号&#xff1a;WeThinkIn 写在前面 【WeThinkIn老实人报】本栏目旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流…

字符设备驱动实例(ADC驱动)

四、ADC驱动 ADC是将模拟信号转换为数字信号的转换器&#xff0c;在 Exynos4412 上有一个ADC&#xff0c;其主要的特性如下。 (1)量程为0~1.8V。 (2)精度有 10bit 和 12bit 可选。 (3)采样时钟最高为5MHz&#xff0c;转换速率最高为1MSPS (4)具有四路模拟输入&#xff0c;同一时…

深入浅出解析Stable Diffusion中U-Net的核心知识与价值 | 【算法兵器谱】

Rocky Ding 公众号&#xff1a;WeThinkIn 写在前面 【算法兵器谱】栏目专注分享AI行业中的前沿/经典/必备的模型&论文&#xff0c;并对具备划时代意义的模型&论文进行全方位系统的解析&#xff0c;比如Rocky之前出品的爆款文章Make YOLO Great Again系列。也欢迎大家提…

FFmpeg中avfilter模块简介及测试代码(overlay)

FFmpeg中的libavfilter模块(或库)用于filter(过滤器), filter可以有多个输入和多个输出。为了说明可能发生的事情&#xff0c;考虑以下filtergraph(过滤器图): 该filtergraph将输入流(stream)分成两个流&#xff0c;然后通过crop过滤器和vflip过滤器发送一个流&#xff0c;然后…