浅尝OpenResty

文章目录

  • 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脚本的命令。后续如果再遇到一些更复杂的转发特定逻辑,不妨考虑使用一下其他的命令来帮助我们实现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安全学习DAY16_信息打点-CDN绕过

信息打点-CDN绕过 文章目录 信息打点-CDN绕过本节思维导图相关链接&工具站&项目工具前置知识&#xff1a;CDN配置&#xff1a;配置1&#xff1a;加速域名-需要启用加速的域名配置2&#xff1a;加速区域-需要启用加速的地区配置3&#xff1a;加速类型-需要启用加速的资源…

阿里云ECS服务器安装PostgreSQL

1. 概述 PostgreSQL是一个功能强大的开源数据库&#xff0c;它支持丰富的数据类型和自定义类型&#xff0c;其提供了丰富的接口&#xff0c;可以自行扩展其功能&#xff0c;支持使用流行的编程语言编写自定义函数 PostgreSQL数据库有如下优势&#xff1a; PostgreSQL数据库时…

功率放大器在电子实验中的作用是什么

功率放大器在电子实验中扮演着重要的角色&#xff0c;它具有多种作用和应用。在本文中&#xff0c;我们将详细介绍功率放大器在电子实验中的作用。 信号放大&#xff1a;功率放大器能够将输入信号的功率放大到更高的水平。在电子实验中&#xff0c;信号放大是非常常见的需求。通…

SpringMVC之入门搭建框架

文章目录 前言一、SpringMVC简介1.什么是MVC2.什么是SpringMVC3.SpringMVC的特点 二、搭建框架——HelloWorld1.创建maven工程&#xff08;web项目&#xff09;2.配置web.xml3.配置springMVC.xml4.创建请求控制器 总结 前言 基础小白第一次走进SpringMVC&#xff1a;了解什么是…

如何使用PHP实现多语言网站功能

如何使用PHP实现多语言网站功能 在全球化的今天&#xff0c;开发多语言网站成为了一个必要的需求。PHP作为一种常用的编程语言&#xff0c;可以很方便地实现多语言网站功能。本文将介绍如何使用PHP实现多语言网站功能&#xff0c;并提供相应的代码示例。 一、创建语言文件 首先…

sd-webui安装comfyui扩展

文章目录 导读ComfyUI 环境安装1. 安装相关组件2. 启动sd-webui3. 访问sd-webui 错误信息以及解决办法 导读 这篇文章主要给大家介绍如何在sd-webui中来安装ComfyUI插件 ComfyUI ComfyUI是一个基于节点流程式的stable diffusion的绘图工具&#xff0c;它集成了stable diffus…

[Mac软件]MacCleaner 3 PRO 3.2.1应用程序清理和卸载

应用介绍 MacCleaner PRO是一个应用程序包&#xff0c;将帮助您清除磁盘空间并加快Mac的速度&#xff01; MacCleaner PRO - 让您的Mac始终快速、干净和有条理。 App Cleaner & Uninstaller PRO - 完全删除未使用的应用程序并管理Mac扩展。 磁盘空间分析仪PRO-分析磁盘空…

算法通关村第九关——中序遍历与搜索树

1 中序遍历和搜索树原理 二叉搜索树按照中序遍历正好是一个递增序列。其比较规范的定义是&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值均小于它的根节点的值&#xff1b;若它的右子树不为空&#xff0c;则右子树所有节点的值均大于它的根节点的值&…

分布式下的session共享问题

首页我们确定在分布式的情况下session是不能共享的。 1.不同的服务&#xff0c;session不能共享&#xff0c;也就是微服务的情况下 2.同一服务在分布式情况&#xff0c;session同样不能共享&#xff0c;也会是分布式情况 分布式下session共享问题解决方案(域名相同) 1.session复…

正演的数值模拟(零基础,学习中)

摘要: 本贴从零开始学习正演的数值模拟方法. 1. 偏微分基础 本小节仅涉及高等数学相关知识, 与领域无关. 1.1 导数 引例: 物体从一维坐标的原点开始移动, 在 t t t 时刻, 它在坐标轴的位置由函数 s ( t ) s(t) s(t) 确定, 则速度为位置变化量与时间的比值: v ( t ) d s…

k8s节点pod驱逐、污点标记

一、设置污点&#xff0c;禁止pod被调度到节点上 kubectl cordon k8s-node-145 设置完成后&#xff0c;可以看到该节点附带了 SchedulingDisabled 的标记 二、驱逐节点上运行的pod到其他节点 kubectl drain --ignore-daemonsets --delete-emptydir-data k8s-node-145 显示被驱逐…

2023年菏泽市中职学校技能大赛“网络安全”赛项规程

2023年菏泽市中职学校技能大赛 “网络安全”赛项规程 一、赛项名称 赛项名称&#xff1a;网络安全 赛项所属专业大类&#xff1a;信息技术类 二、竞赛目的 通过竞赛&#xff0c;检验参赛选手对网络、服务器系统等网络空间中各个信息系统的安全防护能力&#xff0c;以及分析…

测试框架pytest教程(2)-用例依赖库-pytest-dependency

对于 pytest 的用例依赖管理&#xff0c;可以使用 pytest-dependency 插件。该插件提供了更多的依赖管理功能&#xff0c;使你能够更灵活地定义和控制测试用例之间的依赖关系。 Using pytest-dependency — pytest-dependency 0.5.1 documentation 安装 pytest-dependency 插…

【小沐学NLP】Python进行统计假设检验

文章目录 1、简介1.1 假设检验的定义1.2 假设检验的类型1.3 假设检验的基本步骤 2、测试数据2.1 sklearn2.2 seaborn 3、正态分布检验3.1 直方图判断3.2 KS检验&#xff08;scipy.stats.kstest&#xff09;3.3 Shapiro-Wilk test&#xff08;scipy.stats.shapiro&#xff09;3.…

Php“牵手”淘宝商品详情页数据采集方法,淘宝API接口申请指南

淘宝天猫详情接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取商品的详细信息&#xff0c;包括商品的标题、描述、图片等信息。在电商平台的开发中&#xff0c;详情接口API是非常常用的 API&#xff0c;因此本文将详细介绍详情接口 API 的使用。 一、…

java八股文面试[java基础]——浅拷贝和深拷贝

自验证&#xff1a;创建Class Student两个类&#xff0c; Student中含有Class对象 public class Class implements Cloneable {public String getName() {return name;}public void setName(String name) {this.name name;}private String name;public Class(String name) {t…

【Flutter】Flutter 使用 geolocator 包进行地理定位、距离计算

【Flutter】Flutter 使用 geolocator 包进行地理定位、距离计算 文章目录 一、前言二、安装和基本使用1. 如何安装 geolocator 包2. 获取设备的当前位置3. 获取设备的最后已知位置 三、实际业务中的用法1. 连续定位更新2. 计算两个地理坐标之间的距离3. 检查和请求位置权限 四、…

如何评价国内的低代码开发平台(apaas)?

什么是低代码&#xff1f;低代码平台有什么价值&#xff1f;低代码开发到底能适应多广泛场景&#xff1f;低代码到底能做出多么复杂的应用&#xff1f;低代码平台应该如何筛选&#xff1f; 在低代码重新火爆的今天&#xff0c;我们又该如何利用低代码&#xff1f; 01 什么是a…

美妆行业产出一篇精美的软文,能获得多大回报/收益?

如今&#xff0c;很多美妆品牌运营工作者为了让自己的美妆营销软文发挥功效&#xff0c;就开始疯狂研究写作技巧或者是在网上广撒网&#xff0c;然而这样做依然没有得到正向的回报&#xff0c;因此容易大受打击。 其实也许不是你都内容不好&#xff0c;也不是美妆产品不行&…

HTTPS 握手过程

HTTPS 握手过程 HTTP 通信的缺点 通信使用明文&#xff0c;内容可能被窃听(重要密码泄露)不验证通信方身份&#xff0c;有可能遭遇伪装(跨站点请求伪造)无法证明报文的完整性&#xff0c;有可能已遭篡改(运营商劫持) HTTPS 握手过程 客户端发起 HTTPS 请求 用户在浏览器里…