如何在openresty lua中使用内容的第一个字节将tcp请求分派到后端

2023-12-02

我已经启动了一个带有一个 tcp 服务器和两个后端的 openresty。 tcp服务器根据tcp流的内容将请求分发到后端。以下是 openresty 配置示例:

stream {
  # define a TCP server listening on the port 1234:
  upstream backend1 {
    server  172.17.0.1:8081;
  }
  upstream backend2 {
    server  172.17.0.1:8082;
  }

  server {
    listen 1234;

    content_by_lua_block {
      local sock = ngx.req.socket( true )
      -- reveive first byte
      local data, err = sock:receive( 1 )

      --dispatch two backend1 if data is greater than 'a', otherwise dispatch to backend2
      local a = string.byte(data, 1, 1 )
      if a > 'a' then
        --how to send to backend1
      else
        --how to send to backend2
      end
    }
  }
}

我不知道如何使用lua脚本根据请求中的第一个字节在请求和后端之间建立桥梁。

如果有人可以帮忙吗?


这个问题很老了,但我希望我的答案仍然对你有用。

stream {

  lua_code_cache on;

  init_by_lua_block {
    -- cache package on startup
    require('ngx.balancer')
    -- share backend addresses via global table
    -- (not recommended, only for demo purposes)
    _G.BACKENDS = {
      {'172.17.0.1', 8081},
      {'172.17.0.1', 8082},
    }
  }

  upstream lua_dispatcher {
    # just an invalid address as a placeholder
    server 0.0.0.1:1234;

    balancer_by_lua_block {
      local balancer = require('ngx.balancer')
      local backend_index
      if ngx.ctx.request_first_byte > 'a' then
        backend_index = 1
      else
        backend_index = 2
      end
      local backend_table = _G.BACKENDS[backend_index]
      local ok, err = balancer.set_current_peer(table.unpack(backend_table))
      if not ok then
          ngx.log(ngx.ERR, err)
          ngx.exit(ngx.ERROR)
      end
    }
  }

  # proxy
  server {
    listen 9000;

    proxy_pass lua_dispatcher;

    # cosocket API not available in balancer_by_lua_block,
    # so we read the first byte here and keep it in ngx.ctx table
    preread_by_lua_block {
      local sock = ngx.req.socket()
      local data, err = sock:receive(1)
      if not data then
        ngx.log(ngx.ERR, err)
        ngx.exit(ngx.ERROR)
      end
      ngx.ctx.request_first_byte = data:sub(1, 1)
    }
  }

  # mock upstream 1
  server {
      listen 172.17.0.1:8081;
      content_by_lua_block {
        ngx.say('first')
      }
  }

  # mock upstream 2
  server {
      listen 172.17.0.1:8082;
      content_by_lua_block {
        ngx.say('second')
      }
  }

}

$ nc -C localhost 9000 <<< '123'
second
$ nc -C localhost 9000 <<< '223'
second
$ nc -C localhost 9000 <<< 'a23'
second
$ nc -C localhost 9000 <<< 'b23'
first
$ nc -C localhost 9000 <<< 'c23'
first
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在openresty lua中使用内容的第一个字节将tcp请求分派到后端 的相关文章

  • 使用 TCP 套接字在本地代理视频

    我一直对向媒体浏览器添加对视频播客的支持非常感兴趣 我希望用户能够浏览可用的视频播客并从互联网上流式传输它们 这真的很容易 因为媒体播放器等将愉快地播放存在于云中的文件 问题是我想在本地缓存这些文件 因此同一集的后续观看将不涉及流式传输 而
  • 在 nginx 后面运行 jasperserver:潜在的 CSRF 攻击

    我们使用 nginx 进行 https 流量卸载 代理到在端口 8080 上运行的本地安装的 jasperserver 5 2 internet https 443 gt nginx http 8080 gt tomcat jasperse
  • iPhone 上的 TCP 打洞

    我已经阅读了一些内容 虽然我是 iPhone 网络的新手 但我想知道 TCP 打孔是否可以通过 NAT 连接两台 iPhone 我还阅读了一些有关 uPnP 和发夹的有用内容 但我根本不熟悉这些内容 所以如果有人对这是否可能有任何想法 我的
  • 无法在 $.ajax 请求上设置 HTTP 主机标头

    之前已经以不同的方式讨论过这个主题 但我还没有找到适合我的解决方案 我正在使用jquery 1 7 1 我有一个 REST 风格的 Web 服务 可以返回 JSON 和 XML 但对于这个项目 我需要使用 XML 端点 为了绕过跨域限制 我
  • 用 C 语言进行非阻塞 udp 套接字编程:我能得到什么?

    我在理解从非阻塞 UDP 套接字返回什么recv recvfrom 时遇到问题 与 TCP 相比更具体一点 如果我错了 请纠正我 阻塞套接字 TCP 或 UDP 在缓冲区中有一些数据之前不会从 recv 返回 这可以是一定数量的字节 TCP
  • OpenShift 服务代理超时

    我有一个应用程序部署在OpenShift 容器平台 v3 6 它由多个彼此互连的服务组成 The frontend服务调用一个耗时的函数backend服务 通过 REST 调用 但之后30秒它收到一个 504网关超时 信息 Frontend
  • 使用 NestJS 的 TCP 服务器

    是否可以使用 NestJS 创建 TCP 服务器 我有一个仅通过 TCP 进行通信的 GPS 跟踪器 由于 NestJS 可以通过 TCP 在微服务之间进行通信 我认为也许 NestJS 可以用作低级网络应用程序 例如 java netty
  • 通过代理从java发送电子邮件

    我使用 Java Mail API 来发送和接收电子邮件 现在我做这个项目的地方有一个代理服务器 我可以知道如何通过代理服务器从java发送电子邮件吗 请参阅此处的常见问题解答 http www oracle com technetwork
  • 具有非阻塞或多线程功能的 Ruby Tcp Server 类

    找不到任何可以帮助创建非阻塞 多线程服务器的 gem 或类 哪里可以找到 The Ruby 文档 http ruby doc org core classes Socket html M002091关于套接字有一些很好的例子 使用该页面中的
  • 部署解耦的前端+后端应用程序

    我使用两个完全解耦的组件编写了一个网络应用程序 一个基于 Place Framework 并服务以下请求的 API 类型 api 任何客户 基于解耦的前端AngularJS建造使用grunt build 现在 前端与API但我希望这两个单元
  • PHP 通过 TCP/IP 发送消息

    我尝试通过 TCP IP 从 PHP 网站向 Arduino 发送消息 使用以下代码我可以从 php 网站发送消息 问题是 当第一次调用该网站时 消息不会立即发送 网站刷新几次后 消息就会到达 但逻辑上很多次 就像网站刷新量一样 已经尝试将
  • 将虚拟主机分配给 Docker 端口

    我设置了通配符 DNS 以便对自定义域 foo 的所有 Web 请求都映射到 Docker 主机的 IP 地址 如果我有多个运行 Apache 或 Nginx 实例的容器 每个容器都会将 Apache 端口 80 映射到某个外部入站端口 我
  • Gradle 从服务器收到状态代码 403:禁止

    由于这个错误 我无法构建我的 android 项目 Gradle 无法获取https www jitpack io com github Raizlabs DBFlow dbflow 3 1 1 dbflow 3 1 1 pom https
  • 如何在 python 中使用 requests.post() 进行代理身份验证?

    from bs4 import BeautifulSoup import requests from requests auth import HTTPProxyAuth url http www transtats bts gov Dat
  • C# P2P聊天应用程序设计

    我想创建一个不使用显式服务器的简单聊天应用程序 主要要求是用户可以同时与许多朋友聊天 就像在 Skype 等上一样 我在这里指的不是会议聊天 而是多个单独的聊天窗口 目前 我只想要一个 LAN 消息应用程序 但如果设计能够轻松扩展到 Int
  • .NET 中有什么方法可以以编程方式侦听 HTTP 流量吗?

    我正在使用浏览器自动化来测试网站 但我需要验证来自浏览器的 HTTP 请求 即图像 外部脚本 XmlHttpRequest 对象 有没有一种方法可以以编程方式实例化代理以供浏览器使用以查看其发送的内容 我已经在使用 Fiddler 来监视流
  • 伪TCP通道

    什么是伪 TCP 通道以及如何实现 伪 TCP 是一种协议 它实现了 TCP 的一些思想 通过不可靠的基于数据包的接口提供可靠的数据流 例如 如果您只能访问 UDP 但想要 一种可靠的方式来传递数据 则可以使用此方法 您可以在这里找到示例代
  • 如何让WebClient(Web服务客户端)自动使用默认代理服务器?

    我正在从 WinForms 应用程序调用 Web 服务 当不使用代理服务器时 一切工作正常 但是当使用代理时 应用程序会崩溃 因为它收到的不是它期望的 SOAP 请求的 XML 响应 而是一个 HTML 错误页面 显示 需要身份验证 看来你
  • 如何使环境变量可用于 docker-compose 中的 Docker RUN 命令?

    我有一个 Dockerized 应用程序 我想在代理和非代理主机环境中运行 我试图通过将普通环境变量 例如 http proxy 复制到容器中 当且仅当它们存在于主机中时 来解决此问题 我可以通过跑步完成 90 的任务 set grep i
  • 通过 SO_RCVTIMEO 套接字选项在 Ruby 中设置套接字超时

    我试图通过 SO RCVTIMEO 套接字选项在 Ruby 中设置套接字超时 但它似乎对任何最近的 nix 操作系统都没有影响 使用 Ruby 的 Timeout 模块不是一个选择 因为它需要为每个超时生成和连接线程 这可能会变得昂贵 在需

随机推荐

  • SoftLayer 通过 userStatusID 获取用户

    我正在尝试检索SoftLayer 用户配置文件通过用户状态 ID 我正在使用网址
  • Discord.js v13 语音通道数据未更新

    我的 Slash 命令已注册 但它们出现不一致 我的用法的简化版本 client on interactionCreate async interaction gt if interaction isCommand return conso
  • 如何创建输出自定义类型的 Swift Regex?

    In the 全球开发者大会视频 结果表明你可以这样做Captures TryCapture正则表达式生成器中的 s let regex Regex TryCapture OneOrMore digit transform Int 0 和输
  • 在 Android 中嵌入 Knopflerfish 不起作用

    我正在尝试将 Knopflerfish 框架嵌入到 Android 应用程序中以动态加载和卸载包 我跟着this教程 我做的第一步是从下载framework jarthis链接 并将其添加到我的 Eclipse 项目中的类路径中 另外 下面
  • Titanium - Android 外部存储 - 创建新目录,然后将文件写入其中

    我们是否不能简单地以编程方式在 Android 的外部 SD 卡 而不是设备的内部存储器 上创建新目录 并且我们不能在 SD 卡上写入文件 Titanium 是否受到如此限制 即使在使用后也始终在内部存储器上写入文件Ti Filesyste
  • 直线与 AABB 矩形相交?

    最好不使用任何类型的循环 因为这将在游戏中使用 我希望将一条线与任意大小的矩形相交 但我也希望返回交点 有可能 我已经做了一些谷歌搜索 但仍然没有解决 该线使用 x1 y1 x2 y2 定义 矩形也有这两点 我建议简单地对构成矩形的每个线段
  • 可变参数模板参数总是必须放在最后吗?

    我是否总是必须将可变参数模板参数放在模板参数的末尾 template
  • 空手道框架 - 如何检查比赛中的条件 OR 包含响应

    作为示例 我尝试使用匹配包含来验证我的架构响应和数据类型 有时它返回 null 有时它会返回字符串 我正在尝试以下操作 但断言失败 因为它的计算结果不为 true 我正在尝试以下操作 match each response data Res
  • 表单中的条件字段

    我需要创建一个 Form 类 该类可能有或没有 ReCaptcha 字段 具体取决于用户是否登录 因为这是一个 CommentForm 所以我无权访问request表单创建 定义上的对象 所以我不能依赖它 For the POST请求解决方
  • 电子邮件触发 PHP 脚本...可能吗?

    我需要根据我控制的电子邮件帐户设置自动回复trigger words在电子邮件正文中 而且 它还需要根据发送到此电子邮件帐户 属于我的网站 的触发词从数据库表中添加 删除行 并且在某些情况下 如果发送到一个论坛 则需要在论坛内创建一个主题
  • 在 Swift 中从 NSString 创建 NSData

    我试图最终拥有一个NSMutableURLRequest具有有效的HTTPBody 但我似乎无法获取我的字符串数据 来自UITextField 转化为可用的NSData object 我见过这种方法可以用另一种方式 NSString dat
  • Facebook 博主的开放图标签 - OG 图像太小。我可以指定全尺寸图像而不是缩略图吗?

    Blogger 不允许您在每个帖子中指定开放图形图像 目前 模板中有一段代码指定自动生成的缩略图作为facebook的开放图图像 问题是 缩略图是 72 72 而 Facebook 现在要求 OG 图像的宽度至少为 200px 否则默认为页
  • Pyinstaller 在 python 3.7 中不起作用(找不到模块“编码”)

    我有下面的测试程序 我用 pyinstaller Python 版本 3 7b Windows 10 64 位 编译代码 在编译和错误期间注意到警告 我将不胜感激任何解决这个问题的见解 Test py import encodings pr
  • 在函数内部创建方法

    我正在尝试在函数内创建方法 我可以这样做 function sample sample show function alert 我会看到警报呼叫sample show 但出于代码美化的原因 我想将所有方法声明移至函数内 我尝试过 funct
  • Python 图像库 - 文本渲染

    我正在尝试使用 PIL 渲染一些文本 但坦率地说 结果很糟糕 例如 这是我在 Photoshop 中编写的一些文本 PIL 的结果是 正如您所看到的 PIL 的结果不太令人满意 也许我只是比较挑剔 但是有没有什么方法可以使用 PIL 绘制文
  • 添加抗锯齿功能

    我正在尝试使用抗锯齿功能 但我不知道为什么它不起作用 Pen pen new Pen Color Black 3 Pen r new Pen Color YellowGreen 3 Graphics b panel2 CreateGraph
  • Angular:路由器、子项(可选)参数

    所以 我希望生成这样的路径 比赛 页面 球队 赛季 其中 team 和 season 是可选参数 所以我可以有一个像这样的网址 matches results 4 2017 or matches results 4 or matches r
  • mysql 使用内连接更新查询

    我有两张桌子顾客和订单 我想用一个查询更新两个表中的不同值 例如 客户表有一个城市列 值为德国 订单表有状态列 值为保留 我想将德国更改为伦敦 并保留通过一个查询来解决 这是下面的查询 UPDATE customer order INNER
  • 将 HTML 和 javascript 代码添加到 R 中的 flexdashboard

    我有以下创建 Flexdashboard 的代码 title Untitled output flexdashboard flex dashboard orientation columns vertical layout fill run
  • 如何在openresty lua中使用内容的第一个字节将tcp请求分派到后端

    我已经启动了一个带有一个 tcp 服务器和两个后端的 openresty tcp服务器根据tcp流的内容将请求分发到后端 以下是 openresty 配置示例 stream define a TCP server listening on