如何给openresty打patch

由于很多功能实现的限制,我们不得不修改openresty,但我们又不一定能持续维护一个 openresty 分支,所有有了patch 这一操作。

patch是怎么补“漏洞”的?

patch 中文含义为补丁,给大家的感觉就像在原来的基础上修复漏洞,就像小时候旧衣服上缝缝补补的那些痕迹

比如在window 系统更新等等地方,每一个patch都是在做类似补漏洞的事情(或者添加一些新功能之类)

系统包含的东西太多,有内核,有功能组件,一个功能可能是一个程序,也可能是一堆程序,所以比较复杂。

我们不如将范围缩小到 openresty 这样单独具体的程序来举例说明。

首先我们回忆一下 openresty 各种各样的功能是怎么组合起来的呢?

openresty基于 nginx, Nginx 具有高扩展特性,它从设计上完全就由多个不同功能、不同层次、不同类型且耦合度极低的模块构成,因此,当对某一个模块修复 Bug 或 进行升级的时候,可以专注于模块本身,无需在意其他。

模块示意

下图展示了一次常规请求和响应的时序图

所以第一种打补丁的方式: 替换掉模块程序

替换掉模块程序

我们针对不同的模块程序,可以做不同的事情,举例如下:

1. 替换掉lua 代码

openresty 中lua为动态代码特性提供这个可能性

比如下图我们可以改掉 log的代码

2. 替换掉so

大家都知道 openresty的很多 c 库都是编译成 so 文件使用

so文件是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据

linux下何谓.so文件:

  1. 用过windows的同学应该都知道 .dll文件吧, 这二者有什么共通之处呢,其实 .so文件就跟.dll文件差不多
  2. 一般来说.so文件就是常说的动态链接库, 都是C或C++编译出来的。与Java比较就是:它通常是用的Class文件(字节码)
  3. Linux下的.so文件时不能直接运行的,一般来讲,.so文件称为共享库 比如在docker环境由于 lfs.so 有着 gcc版本要求(毕竟编译它的版本不算太低,有些docker阉割了gcc,导致加载有问题),所以就可以替换为符合docker环境的版本

简陋的patch方式有没有什么问题呢?

聪明的同学们肯定已经想到了上面说的方式太简陋了,

面临着以下几个问题:

  1. nginx 内部的一些代码无法patch,毕竟不是所有c 都变成了 so
  2. 手动打的这些patch 很难管理, openresty 一直在更新,每个版本都手动一行行改太累了

patch 的管理方式

现在大家在需要改动代码做patch 一般都使用 git 来完成这个事情

接下来我给大家做个示例:

1. 修改代码,生成 patch文件

修改代码就不用示例了吧

生成patch 文件可以用git 命令

git diff f915e0dbe520938b7a84bd0e5c1cf12cf64c4186 97d1b704d0d86b5370d57604a9e2e3f86e4a33ec --no-prefix > enable_keepalive.patch

部分文件结果

2. 应用 patch

在需要打补丁的目录下运行命令

patch -p0 --verbose < "enable_keepalive.patch"

代码文件就会被改变

一般这些patch 我们都会编写脚本做管理,

完整的一个例子你们可以参见 https://github.com/fs7744/nature/tree/main/openresty_patch

目录

构建api gateway之 如何给openresty打patch的更多相关文章

  1. 构建api gateway之 健康检查

    Healthcheck 由于服务无法保证永远不会下线,而且下线时不一定能有人员能及时发现, 所以api gateway 一般会引入一个监工 Healthcheck, 像大家每年体检一样定时确认服务是否 ...

  2. 构建api gateway之 动态插件

    动态插件 之前已经拆解细点逐个介绍了 tcp .http 代理相关核心点,现在介绍一个让 api gateway 变得很灵活的功能实现: 动态插件. 由于 lua 的动态语言特点,我们可以比较方便做到 ...

  3. 构建api gateway之 http路由实现

    http路由 路由是指路由器从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个接口的过程. 而这里的http路由其实等同于web开发中,根据http相关参数(比如url.http me ...

  4. 构建api gateway之 负载均衡

    什么是负载均衡 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡.分摊到多个操作单元上进行运行 以下为几种负载均衡策略介绍 1.随机(Random) 大家很多时候说 ...

  5. 构建api gateway之 基于etcd实现动态配置同步

    配置中心 在之前 tcp的yaml配置 介绍了如何监听yaml文件变化然后更新配置. 当然假如我们有很多实例,那么yaml改动将是非常痛苦的事情,那么如何做到配置文件统一管理,实时更新呢? 我们可以引 ...

  6. [转载] 构建微服务:使用API Gateway

    原文: http://mp.weixin.qq.com/s?__biz=MzA5OTAyNzQ2OA==&mid=206889381&idx=1&sn=478ccb35294c ...

  7. 0601-Zuul构建API Gateway-API gateway简介、基础使用、路由配置、负载配置

    一.API Gateway简介 参看:http://www.cnblogs.com/bjlhx/p/8794437.html 二.zuul简介[路由器和过滤器:Zuul] 在微服务架构的组成部分进行路 ...

  8. 谈谈微服务中的 API 网关(API Gateway)

    前言 又是很久没写博客了,最近一段时间换了新工作,比较忙,所以没有抽出来太多的时间写给关注我的粉丝写一些干货了,就有人问我怎么最近没有更新博客了,在这里给大家抱歉. 那么,在本篇文章中,我们就一起来探 ...

  9. 聊聊 API Gateway 和 Netflix Zuul

    最近参与了公司 API Gateway 的搭建工作,技术选型是 Netflix Zuul,主要聊一聊其中的一些心得和体会. 本文主要是介绍使用 Zuul 且在不强制使用其他 Neflix OSS 组件 ...

  10. 微服务中的 API 网关(API Gateway)

    API 网关(API Gateway)提供高性能.高可用的 API 托管服务,帮助用户对外开放其部署在 ECS.容器服务等云产品上的应用,提供完整的 API 发布.管理.维护生命周期管理.用户只需进行 ...

随机推荐

  1. LoadRunner11脚本小技能之添加请求头+定义变量+响应内容乱码转换打印+事务拆分

    一.添加请求头 存在一些接口,发送请求时需要进行权限验证.登录验证(不加请求头时运行脚本,接口可能会报401等等),所以需要在脚本中给对应请求添加请求头.注意:请求头需在请求前添加,包含url类.su ...

  2. JUC学习笔记——共享模型之内存

    JUC学习笔记--共享模型之内存 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的内存部分 我们会分为以下几部分进行介绍: Java内存模型 可见性 模式之两阶段终止 模式之Balk ...

  3. 基于iNeuOS工业互联网平台的板材实时质检系统

    1.  项目背景 刨花板生产线由于原料.生产工艺等原因,会有一些产品板面出现颤纹.漏砂.胶斑.胶块.大刨花.粉尘斑.板面划痕和油污等缺陷.表面缺陷会降低板材强度.影响板材外观和二次加工,给企业带来经济 ...

  4. 2022春每日一题:Day 19

    题目:吃奶酪 状压dp实现,dp[i][j]表示走过状态i,停到了j的位置的最小价值.枚举状态,起点终点,转移dp[i][j]=min{dp[i-(1<<s)][k]+dis(s,k)} ...

  5. tekla软件安装教程

    Tekla2020 WIN10 64位安装步骤: 1.先使用"百度网盘客户端"下载Tekla2020_x64软件安装包到电脑磁盘,并鼠标右击进行解压缩,安装前先断开电脑网络,然后找 ...

  6. cv2.imread opencv读取不到图片问题

    解决办法 cv2.imread 路径中包含中文,改为英文 其他 这个问题解决了很久,都属于库的问题

  7. 关于 risrqnis

    这道题里最有用的( Range Insert Subset Range Query [n?] In Set 破案了 我那五个点是因为维护不知道有什么用的东西炸了 删了就过了 题面 [JRKSJ R4] ...

  8. JavaScript入门③-函数(2)原理{深入}执行上下文

    00.头痛的JS闭包.词法作用域? 被JavaScript的闭包.上下文.嵌套函数.this搞得很头痛,这语言设计的,感觉比较混乱,先勉强理解总结一下. 为什么有闭包这么个东西?闭包包的是什么? 什么 ...

  9. 爬虫笔记之xpath

    目录 xpath如何取包含多个class属性 xpath获取当前标签下的所有文本(包括子标签) xpath如何取包含多个class属性 如果HTML结构是这样 <div class=" ...

  10. PostgreSQL函数:查询包含时间分区字段的表,并更新dt分区为最新分区

    一.需求 1.背景 提出新需求后,需要在www环境下进行验收.故需要将www环境脚本每天正常调度 但由于客户库无法连接,ods数据无法每日取,且连不上客户库任务直接报错,不会跑ods之后的任务 故需要 ...