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

浅尝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 = 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的服务。
转发到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. 写在前面 当一个域名中衍生出多个服务的时候&#xff0c;如果想要保持对外服务始终是一个域名&#xff0c;则需要通过nginx反向代理来实现。如果在转发的时候需…...

MySQL分页查询慢怎么办

今天看到一个问题。 MySQL分页查询慢怎么办&#xff1f; 第一反应是用limit限制返回的条数。 比如 select * from table order by idlimit 10, 100;实际上我们限制的只是返回的条数是100&#xff0c;并不是查询时就从第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神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现WOA-BP鲸鱼优化算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本…...

【前端从0开始】JavaSript——循环控制语句

循环控制语句 while语句 While 循环会在指定条件为真时循环执行代码块。 While循环&#xff0c;先进行条件判断&#xff0c;再执行循环体的代码 while (条件表达式){循环体 }注意&#xff1a;当前循环中&#xff0c;如果不满足条件&#xff0c;一次都不会执行 var i 1; whi…...

【Elasticsearch】spring-boot-starter-data-elasticsearch的使用以及Elasticsearch集群的连接

更多有关博主写的往期Elasticsearch文章 标题地址【ElasticSearch 集群】Linux安装ElasticSearch集群&#xff08;图文解说详细版&#xff09;https://masiyi.blog.csdn.net/article/details/131109454基于SpringBootElasticSearch 的Java底层框架的实现https://masiyi.blog.c…...

Python学习笔记_进阶篇(四)_django知识(三)

本章内容&#xff1a; Django 发送邮件Django cookieDjango sessionDjango CSRF Django 发送邮件 我们常常会用到一些发送邮件的功能&#xff0c;比如有人提交了应聘的表单&#xff0c;可以向HR的邮箱发邮件&#xff0c;这样&#xff0c;HR不看网站就可以知道有人在网站上提…...

指针(初阶)

1. 指针是什么&#xff1f; 指针是什么&#xff1f; 指针理解的2个要点&#xff1a; 1. 指针是内存中一个最小单元的编号&#xff0c;也就是地址 2. 平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量 总结&#xff1a;指针就是地址&…...

Flink内核源码解析--Flink中重要的工作组件和机制

Flink内核源码 1、掌握Flink应用程序抽象2、掌握Flink核心组件整体架构抽象3、掌握Flink Job三种运行模式4、理解Flink RPC网络通信框架Akka详解5、理解TaskManager为例子&#xff0c;分析Flink封装Akka Actor的方法和整个调用流程6、理解Flink高可用服务HighAvailabilityServ…...

Linux 压缩解压(归档管理):tar命令

计算机中的数据经常需要备份&#xff0c;tar是Unix/Linux中最常用的备份工具&#xff0c;此命令可以把一系列文件归档到一个大文件中&#xff0c;也可以把档案文件解开以恢复数据。 tar使用格式 tar [参数] 打包文件名 文件 tar命令很特殊&#xff0c;其参数前面可以使用“-”&…...

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、双主架构双主架构的工作方式如下&#xff1a;双主架构的优势包括&#xff1a;但是一般不用这种架构&#xff0c;原因是&#xff1a; 3、主从复制主从复制的工作方式如下&#xff1a;主从复制的优势包括&#xff1a;主从复制的缺点 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 存储系统&#xff0c;是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选…...

3D数据转换工具HOOPS Exchange概览

HOOPS Exchange SDK是一组C软件库&#xff0c;使开发团队能够快速为其应用程序添加可靠的2D和3D CAD导入和导出功能。这允许访问广泛的数据&#xff0c;包括边界表示&#xff08;BREP&#xff09;、产品制造信息&#xff08;PMI&#xff09;、模型树、视图、持久ID、样式、构造…...

【从零开始的rust web开发之路 一】axum学习使用

系列文章目录 第一章 axum学习使用 文章目录 系列文章目录前言老规矩先看官方文档介绍高级功能兼容性 二、hello world三、路由四&#xff0c;handler和提取器五&#xff0c;响应 前言 本职java开发&#xff0c;兼架构设计。空闲时间学习了rust&#xff0c;目前还不熟练掌握。…...

oracle警告日志\跟踪日志磁盘空间清理

oracle警告日志\跟踪日志磁盘空间清理 问题现象&#xff1a; 通过查看排查到alert和tarce占用大量磁盘空间 警告日志 /u01/app/oracle/diag/rdbms/orcl/orcl/alert 跟踪日志 /u01/app/oracle/diag/rdbms/orcl/orcl/trace 解决方案&#xff1a; 用adrci清除日志 确定目…...

【vue】el-table 数据更新后,刷新表格数据

表格里面的数据更新后&#xff0c;可以通过以下方法来刷新表格 方法1 用更新后的数据&#xff0c;覆盖之前的数据 var newTableData[];for(var i0;i<that.tableData.length;i){ if(aIdthat.selectStationId&&bIdthat.selectDeviceId){that.tableData[i].physica…...

AVL——平衡搜索树

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——AVL树☂️<3>开发环境&#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;AVL树是对二叉搜索树的严格高度控制&#xff0c;所以AVL树的搜索效率很高…...

TCP通信流程以及一些TCP的相关概念

1.TCP和UDP区别 都为传输层协议 UDP&#xff1a;用户数据报协议&#xff0c;面向无连接&#xff0c;可以单播&#xff0c;多播&#xff0c;广播&#xff0c;面向数据报&#xff0c;不可靠 TCP&#xff1a;传输控制协议&#xff0c;面向连接的&#xff0c;可靠的&#xff0c;基…...

PyTorch学习笔记(十七)——完整的模型验证(测试,demo)套路

完整代码&#xff1a; import torch import torchvision from PIL import Image from torch import nnimage_path "../imgs/dog.png" image Image.open(image_path) print(image)# 因为png格式是四个通道&#xff0c;除了RGB三通道外&#xff0c;还有一个透明度通…...

WPF开篇

一、为什么要学习WPF 大环境不好&#xff0c;公司要求逐年提高&#xff0c;既要会后端又要会客户端WPF相对于WinForm来说用户界面效果更好&#xff0c;图像更加立体化也是给自己增加一项技能&#xff0c;谨记一句话&#xff0c;技多不压身&#xff1b;多一份技能就多一份竞争力…...

linux 压缩解压缩

压缩解压缩 linux中压缩和解压文件也是很常见的 zip格式 zip格式的压缩包在windows很常见&#xff0c;linux中也有zip格式的压缩包 #压缩#zip [选项] 压缩包名 文件(多个文件空格隔开)zip 1.zip 123.txt 456.txt zip -r 2.zip /home/user1 ---------------------- -r 压缩目录 …...

centos9 mysql8修改数据库的存储路径

一、环境 系统&#xff1a;CentOS Stream release 9 mysql版本&#xff1a;mysql Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL) 二、修改mysql的数据库&#xff0c;存储路径 查看目录数据存储的位置 cat /etc/my.cnf操作 1、新建存放的目录&#xff0c;…...

【C++】<Windows编程中消息即事件的处理>

目录 一、注册窗口类&#xff0c;指定消息处理函数&#xff0c;捕获消息并发给处理函数 二、消息处理函数 三、通用窗口消息 四、其他消息 1.滚动条消息 2.按钮控件消息 3.按钮控件通知消息 4.按键消息 5.系统菜单等消息 6.组合框控件消息 7.组合框控件通知消息 8.列…...

数据库SQL语句使用

-- 查询所有数据库 show databases; -- 创建数据库&#xff0c;数据库名为mydatabase create database mydatabase; -- 如果没有名为 mydatabase的数据库则创建&#xff0c;有就不创建 create database if not exists mydatabase; -- 如果没有名为 mydatabase的数据库则创建…...

从零开始 Spring Cloud 12:Sentinel

从零开始 Spring Cloud 12&#xff1a;Sentinel 1.初识 Sentinel 1.1雪崩问题 1.1.1什么是雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分…...

@Resurce和@Autowired的区别

Resource 和 Autowired 是 Java 中常用的两个注解&#xff0c;用于自动装配依赖对象。它们的主要区别如下&#xff1a; 来源不同&#xff1a; Resource 是 Java EE 提供的注解&#xff0c;属于 J2EE 的一部分&#xff0c;它由 JSR-250 规范定义。 Autowired 是 Spring 框架提供…...

ResNet简介

ResNet (Residual Network) 此网络于2015年&#xff0c;国人何先生提出&#xff0c;用于解决随着深度学习的层数加深造成的网络退化现象和梯度消失、梯度爆炸。 问题1 退化现象 当深度学习的各项指标能够随着训练轮数收敛的情况下&#xff0c;网络的层数增强未能像理论一样&…...

了解单例模式,工厂模式(简单易懂)

文章目录 单例模式饿汉模式懒汉模式对比 工厂模式简单工厂模式&#xff08;Simple Factory Pattern&#xff09;工厂方法模式&#xff08;Factory Method Pattern&#xff09;抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;对比 单例模式 什么是单例&#xff…...

医疗网站做药品是干嘛/哈尔滨seo优化公司

eigen 与 opencv 矩阵的相互转换 需要包含以下头文件&#xff1a; #include <Eigen/Dense> #include <Eigen/Core> // eigen 头文件必须放在 opencv 前面 #include <opencv2/opencv.hpp> #include <opencv2/core/eigen.hpp>然后使用 cv::cv2eigen 和…...

做兼职网站赚钱吗/河北网站建设案例

文章目录1. 背景2. 简介3. 查询3.1 /proc/meminfo的Slab和SReclaimable项3.2 命令slabtop查看slab占用情况3.3 cache查看3.4 系统缓存回收机制的设置项3.5 /proc/slabinfo文件信息3.6 统计Slab占用超过100M的对象slabtop1. 背景 Linux内存管理模式&#xff0c;页式管理适合于大…...

上海什么做网站的公司比较好/浏览器下载安装

题目链接&#xff1a;http://acm.swust.edu.cn/#/problem/698/-1 1000(ms) 65535(kb) 1006 / 2689 用2 台处理机A 和B 处理n 个作业。设第i 个作业交给机器A 处理时需要时间a[i] &#xff0c;若由机器B 来处理&#xff0c;则需要时间b[i]。由于各作业的特点和机器的性能关系…...

建设阿里巴巴网站首页/怎么做网站关键词优化

Scala Option(选项)类型用来表示一个值是可选的&#xff08;有值或无值)。 Option[T] 是一个类型为 T 的可选值的容器&#xff1a; 如果值存在&#xff0c; Option[T] 就是一个 Some[T] &#xff0c;如果不存在&#xff0c; Option[T] 就是对象 None 。 接下来我们来看一段代码…...

网站制作的流程是什么/站内推广方式

目录 柔性数组的定义 柔性数组的特点 柔性数组的优势 C语言&#x1f6f4; 柔性数组的定义 什么是柔性数组呢&#xff1f; C99中&#xff0c;如果在结构体定义的时候&#xff0c;结构体中的最后一个元素允许是未知大小的数组&#xff0c;那么这个数组便叫做 柔性数组 。 下面举个…...

东莞公司网站建设/公司网站建设服务机构

tshark 删除乱序、重传数据包&#xff1a; tshark -2 -R "not tcp.analysis.retransmission && not tcp.analysis.out_of_order" -r 源文件.pcap -w 目标文件名.pcaptshark 获取tcp流&#xff0c;并保存text格式 tshark -r 源文件.pcap -qz follow,tcp,raw…...