`

Ceryx 动态的 NGINX

阅读更多

        这是转过来的,思路很好,实用性很强 ,学习了。

 

        反向代理包含数百甚至上千个微服务是一个很有意思的事情,也是我们在 Sourcelair 每天都要面对的事情。这也是为什么我们今天要很高兴地宣布 Ceryx,一个动态反向代理,使用 OpenResty,Lua 和 Flask,可以代理主机上任意多的服务。它的配置是即时生效。在过去几个月里我们一直在做 Ceryx 项目。现在我们将它开源。

Ceryx

摘要

 SourceLair,我们快速提供开发环境并努力让 web 开发可以无障碍,并使用云的力量。我们提供的一个优秀服务之一是每个项目有一个公共的 URL,它始终可用,并自动刷新你的代码。这样我们需要每小时启动和停止多用户容器,并在不停机的情况下路由每个用户的公共 URL 到当前容器。

以前的解决方案

Ceryx 是去年我们开发的内部项目。为了找到解决我们问题的最佳方案,我们尝试了各种技术。在这条路上,我们保持 API 的稳定不受变化的影响。有一个很好的话题没有放到这里,你可以在 API Meetup Athens 找到我们的 slides。

Twisted,MongoDB 和 Redis

首先,我们使用基于 Twisted 自定义反向代理,Twisted 非常好用,是使用 Python 写的事件驱动的网络引擎。如果在 Redis 缓存中没有查到,服务就以 MongoDB 查询做为路由。不管是使用数据库查询,还是调用 API 添加,更新或删除路由,缓存都是流行的方式。对我们来说,它工作得很好,很快 Twisted 有了一个很好用的反向代理 API 可以使用。这个应用让我们错失的一件事情是,Twisted 在默认情况下,每个反向代理头部不能设置成你想要的,在某些情况会导致一些无效的转发。但是用它工作是很方便的。

tproxy和Redis

在 Twisted 之后,我们又尝试了 tproxy。tproxy 是一个使用 Gevent 创建的 TCP 路由代理(第七层),Gevent 深受 Ruby 的 ProxyMachine 影响由著名的 Gunicorn 创建。我们创建了一个查找层用来替代静态路由和文件,它会查找后端的 Redis。我们从 MongoDB 彻底地分离了服务,因为路由是短暂且易于重建的。同样我们将 API 分离出来用 Flask 写了独立的服务。主要的问题是 tproxy 的开发有点被遗弃。最后一次提交是一年前。我们需要重新做一些性能优化,还有一个有趣的 bug,响应没有包含响应长度,并保持开放直到超时。

NGINX 和 etcd

我们已经决定将代理作为一个服务而不是一个盒子,我们调研了 NGINX 和 HAProxy。因为我们非常熟悉前者并且对它的表现很满意。我们所有的前端都是一直使用 NGINX。我们创建了一个监控脚本,它监控etcd 的重要变更,并自动加载 NGINX 的配置。我们还修改了我们的 API,让它和 etcd 一起做为后端工作。这大大改善了性能。但过了几周我们发现配置的变更没有我们想像得快。NGINX 的重新加载几乎是瞬间的。但配置要花一段时间接收人工配置才能生效。导致路由更新变得缓慢。对我们来说最重要的问题是这种重新加载时间超过10秒,导致多次出现“服务已停止"页面,直到新的配置生效。

OpenResty 和 Lua 就是我们的救星

当前,Github 记录关于他们在 NGINX 使用 Lua 脚本对 GitHub pages 进行更频繁的重载 - 之前他们大概 30 分钟重载一次。

当我们在寻找另外一个替代品的时候,对这篇博文非常感兴趣,就开始深入研究 OpenResty - NGINX 的风情版本,使用 Lua JIT 编译,还有其他第三方 NGINX 模块。

我们决定继续用回 Redis 作为后端,因为我们已经准备好 API ,Redis 也已经在内存中,也因此查询速度非常快。我们同时使用 Redis 进行其他服务和缓存,所以不需要再考虑其他集群。

解决方案就是 Ceryx,现在已经开源,提供给每个人使用。这包括了 NGINX lua 脚本和 API,可以轻松的使用 Docker Compose 部署。

把所有的一切都缝合在一起

NGINX 提供几个钩子,可以在请求的几个阶段执行 Lua 代码。Ceryx 只会在代理阶段之前采取行动 -在  "access_by_lua_file" 阶段,即是 Lua 路由器。

此路由器会查询 NGINX 和 Redis 后端的本地内存缓存,以此确定目标主机和将会到来的主机端口,如果没找到就返回一个通配符目标。一个 Redis 查询返回一个结果时,这个结果会被缓存 5 秒,所以后续请求不会影响 Redis - 当需要静态文件(比如 CSS,JavaScript 和图像)的时候这会是一个很好的改进,这时候会同时抛出多个请求。可以通过增加缓存超时来对 Ceryx 进行量身定做,适应各个应用的需求。

与此同时,提供一个简单的 Flask 服务,为路由和使用新路由更新 Redis 后端提供一个 CRUD API。代理和 API 服务共享相同的环境变量,用来配置 Redis,保持一致性。

第一印象

最新的 Ceryx 发布第一周后,我们看到了其在反向代理和大幅减少休眠服务页上的巨大改进。在更多地细节上,升级前的 Ceryx,每个开发会话平均有 10 个页面浏览量,而现在我们仅仅需要 2.5 个。

下一步

Ceryx 是在 MIT 协议下的开源项目,因此我们乐见用户贡献或者提出 bug 以及新功能请求。我们计划添加 StatsD 测量功能到 Ceryx,这样我们可以更好改进和优化一些相应的部分。

Ceryx Github项目期待你的想法和贡献。Ceryx 动态的 NGINX

分享到:
评论

相关推荐

    ceryx, 基于API的Nginx OpenResty动态反向代理.zip

    ceryx, 基于API的Nginx OpenResty动态反向代理 Ceryx - 简单,但功能强大的反向代理 Ceryx是一种基于 Nginx OpenResty的动态反向代理。Ceryx用于在 https://www.sourcelair.com 为数万个项目提供 public url 。代

    Python-Ceryx是基于NGINXOpenResty的动态反向代理

    Ceryx 是基于 NGINX OpenResty 的动态反向代理,带有一个 API。 代理 Ceryx 使用 NGINX OpenResty 为了基于请求主机进行路由请求。这个路由是使用 NGINX Lua 模块制作的,可以通过查询一个 Redis 后端获取结果。

    ceryx:基于NGINX OpenResty和API的动态反向代理

    Ceryx在后台使用NGINX OpenResty来路由请求,该请求基于HTTP请求的Host标头或HTTPS请求中的。 Ceryx查询Redis后端,以确定它将每个请求路由到哪个目标。 API Ceryx API使用户可以通过任何HTTP客户端动态创建,更新...

    基于带有API的NGINX OpenResty的动态反向代理-Python开发

    Ceryx-坚固,可编程的HTTP(S)反向代理Ceryx是坚固,可编程的反向代理,用于为成千上万的SourceLair项目提供其独特的,启用HTTPS的公共URL。...代理Ceryx在后台使用NGINX OpenResty路由请求,基于

    YOLO算法-数据集数据集-330张图像带标签-椅子-书桌.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    java毕设项目之ssm蜀都天香酒楼的网站设计与实现+jsp(完整前后端+说明文档+mysql+lw).zip

    项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    weixin138社区互助养老+ssm(论文+源码)-kaic.zip

    weixin138社区互助养老+ssm(论文+源码)_kaic.zip

    光纤到户及通信基础设施报装申请表.docx

    光纤到户及通信基础设施报装申请表.docx

    java毕设项目之ssm基于jsp的精品酒销售管理系统+jsp(完整前后端+说明文档+mysql+lw).zip

    项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    功能完善的电商数据智能爬虫采集系统项目全套技术资料.zip

    功能完善的电商数据智能爬虫采集系统项目全套技术资料.zip

    YOLO算法-刀数据集-198张图像带标签-刀-枪.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    Android程序开发初级教程WORD文档doc格式最新版本

    ### Android程序开发初级教程(一):初识Android **平台概述** Google推出的Android操作系统平台已经正式亮相,这是一个基于Linux内核的开源操作系统。对于开发者而言,了解其架构和支持的开发语言至关重要。以下是Android平台的架构概览: **平台架构及功能** 1. **应用框架(Application Framework)**:包含可重用和可替换的组件,确保所有软件在该层面上的平等性。 2. **Dalvik虚拟机(Dalvik Virtual Machine)**:一个基于Linux的虚拟机,为Android应用提供运行环境。 3. **集成浏览器(Integrated Browser)**:基于开源WebKit引擎的浏览器,位于应用层。 4. **优化图形(Optimized Graphics)**:包括自定义的2D图形库和遵循OpenGL ES 1.0标准的3D实现。 5. **SQLite数据库**:用于数据存储。 6. **多媒体支持(Media Support)**:支持通用音频、视频以及多种图片格式(如MPEG4, H.264

    【组合数学答案】组合数学-苏大李凡长版-课后习题答案

    内容概要:本文档是《组合数学答案-网络流传版.pdf》的内容,主要包含了排列组合的基础知识以及一些经典的组合数学题目。这些题目涵盖了从排列数计算、二项式定理的应用到容斥原理的实际应用等方面。通过对这些题目的解析,帮助读者加深对组合数学概念和技巧的理解。 适用人群:适合初学者和有一定基础的学习者。 使用场景及目标:可以在学习组合数学课程时作为练习题参考,也可以在复习考试或准备竞赛时使用,目的是提高解决组合数学问题的能力。 其他说明:文档中的题目覆盖了组合数学的基本知识点,适合逐步深入学习。每个题目都有详细的解答步骤,有助于读者掌握解题思路和方法。

    .net core mvc在线考试系统asp.net考试系统源码考试管理系统 主要技术: 基于.net core mvc架构和sql server数据库,数据库访问采用EF core code fir

    .net core mvc在线考试系统asp.net考试系统源码考试管理系统 主要技术: 基于.net core mvc架构和sql server数据库,数据库访问采用EF core code first,前端采用vue.js和bootstrap。 功能模块: 系统包括前台和后台两个部分,分三种角色登录。 管理员登录后台,拥有科目管理,题库管理,考试管理,成绩管理,用户管理等功能。 教师登录后台,可进行题库管理,考试管理和成绩管理。 用户登录前台,可查看考试列表,参加考试,查看已考试的结果,修改密码等。 系统实现了国际化,支持中英两种语言。 源码打包: 包含全套源码,数据库文件,需求分析和代码说明文档。 运行环境: 运行需vs2019或者以上版本,sql server2012或者以上版本。

    YOLO算法-易拉罐识别数据集-512张图像带标签-可口可乐.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    (175415460)基于SpringBoot的通用管理系统源码+数据库+项目文档,前后端分离的通用管理系统模版,可用于开发毕业设计

    包含了登陆注册、用户管理、部门管理、文件管理、权限管理、日志管理、个人中心、数据字典和代码生成这九个功能模块 系统采用了基于角色的访问控制,角色和菜单关联,一个角色可以配置多个菜单权限;然后再将用户和角色关联,一位用户可以赋予多个角色。这样用户就可以根据角色拿到该有的菜单权限,更方便管理者进行权限管控。 本系统还封装了文件管理功能,在其他模块如若要实现图片/文件上传预览时,前端只需导入现成的 Vue 组件即可实现(使用 viewerjs 依赖实现),后端只需定义 String 类型的实体类变量即可,无需再去研究文件上传预览的相关功能,简化了开发者的工作量。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    三相10Kw光伏并网逆变器 包含全套理图 PCB 源代码

    三相10Kw光伏并网逆变器。包含全套理图 PCB 源代码

    GJB 5236-2004 军用软件质量度量

    GJB 5236-2004 军用软件质量度量文档,本称准规定了车用软件产品的质重模型和基本的度量。本标准为确定车用软件质量需求和衡量军用 软件产品的能力提供了一个框架。

    (179941432)基于MATLAB车牌识别系统【GUI含界面】.zip

    基于MATLAB车牌识别系统【GUI含界面】.zip。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    (9546452)宿舍管理系统

    【宿舍管理系统】是一种专为高校或住宿机构设计的信息化解决方案,旨在提高宿舍管理的效率和准确性。该系统包含了多项核心功能,如宿舍管理员管理、宿舍信息维护、查询、卫生检查以及电费缴纳等,旨在实现全面的宿舍运营自动化。 **宿舍管理员管理**功能允许指定的管理员进行用户权限分配和角色设定。这包括对管理员账户的创建、修改和删除,以及设置不同的操作权限,例如只读、编辑或管理员权限。通过这样的权限控制,可以确保数据的安全性和管理的规范性。 **宿舍添加与管理**是系统的基础模块。管理员可以录入宿舍的基本信息,如宿舍号、楼栋、楼层、房间类型(单人间、双人间等)、容纳人数、设施配置等。此外,系统还支持批量导入或导出宿舍信息,方便数据的备份和迁移。 **查询功能**是系统的重要组成部分,它允许管理员和学生根据不同的条件(如宿舍号、楼栋、学生姓名等)快速查找宿舍信息。此外,系统还可以生成各种统计报告,如宿舍占用率、空闲宿舍数量等,以便于决策者进行资源优化。 **卫生检查**功能则是对宿舍卫生状况进行定期评估。管理员可设定检查计划,包括检查周期、评分标准等,并记录每次检查的结果。系统能自动生成卫生报表,用于

Global site tag (gtag.js) - Google Analytics