zhuizhuhaomeng Blog

「记录下来,一切都会更容易理解」

OpenResty 是如何打包的

序列文章 怎么编译 OpenResty 怎么编译 OpenCC 很多公司因为各种原因不能直接试用 OpenResty 官方提供的预编译的包。 但是由于对打包过程并不熟悉,因此他们可能不打包,也可能打包不规范。 因此这里介绍以下 OpenResty 官方是如何打包的。 下载 OpenResty 的 tar 包 1 2 cd ~ wget -O openresty-1.19.3.1.ta...

OpenResty 开发环境搭建

在开发 OpenResty 功能的时候需要能够本地执行所有的用例,因此就需要构建本地的开发环境。 如果都使用线上的 ci,那么经常会因为一些小问题需要提交很多次的代码。每次提交代码后等 CI 执行完成又需要很长的实际,这样就严重影响了开发效率。 本文基于 Rocky-8 环境搭建,不同的操作系统可能会有一点差异,需要自己调整。 sudo 用户添加 推荐用普通用户开发 OpenResty...

动态链接是怎么回事

背景 对于动态链接的详细工作过程一直很好奇,终于搞明白了其中的缘由,记录一下。 很多东西看起来很简单,但是如果你东西自己一步步的取验证,发现并没有那么的简单。因为涉及的知识点还是很多。 这里面因为部分术语还是没有搞得很清楚,因此看起来可能还是会有点晕头转向。 测试代码 这是一个最小化的代码,调用的 printf 函数是 libc 提供的,因此就涉及到动态链接了。 #include...

LuaJIT FFI 的注意事项

NULL 指针 与 nil 比较 我们一般是通过 ptr == nil 或者 ptr ~= nil 这样的方式来判断是否空指针。 但是下面的表达式却是错误的,无法达到判断 ptr 是否是 NULL 指针的目的: 1 2 3 if ptr then -- do something end 这个是因为 ptr 是一个 cdata 类型的数据,不同的数据类型的数据比较总是不相等。 ...

LuaJIT 代码片段

如何判断 IPv4 地址是内网地址 下面是 OpenResty 的一个片段代码,用于展示如何判断一个 IP 地址是否是内网地址。 这个比通过字符串判断是否是 127. 10. 172.16. ~ 172.31. 192.168. 的这些网段高效多了。 1 2 3 4 5 6 7 8 9 10 11 local bit_and = require "bit".band local addr...

LuaJIT 的参数传递

社区的问题 OpenResty 相比于 Nginx 的一大优点就是动态特性。社区上有人问想要在 404 的时候重试上游应该如何实现。 事实上这个功能 nginx 自身也可以实现,只不过 OpenResty 可以更加灵活的控制请求。 如何实现 想要动态控制上游就需要使用 balancer_by_lua* 这个指令。 为了实现 404 时候的重试,需要 nginx 的 proxy_nex...

LuaJIT 的参数传递

FFI 的方式调用 C 函数可以说是很简单,但是有时候缺个例子也是非常的难。 本文通过几个例子来展示 FFI 调用 C 函数。相信对于需要用到可变参数函数 以及需要传递数组参数的会有帮助。 传递数值类型参数 传递数值类型的参数可以说是最简单的了。FFI 会自动将数值转换为需要的类型。 比如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1...

使用 GDB 验证动态链接的过程

背景 对于动态链接的详细工作过程一直很好奇,终于搞明白了其中的缘由,记录一下。 以前一直以为自己明白了,其实不明白。动手验证,细节就是魔鬼。 本次验证使用了 gdb,过程非常有趣,你也可以自己动手试试看。 测试代码 这是一个最小化的代码,调用的 printf 函数是 libc 提供的,因此就涉及到动态链接的过程了。 #include<stdio.h> int mai...

通过 LuaJIT FFI 接口集成原有的 C 模块

LuaJIt FFI 接口和 Lua API 有什么差别 Lua 提供了一些接口用来实现和 C 代码的交互。比如 void lua_pushnumber(lua_State *L, lua_Number n) 这样的函数。更多的函数可以参考 Luajit 的 头文件。 传统上通过 Lua 的调用栈来传递参数的方法来跟 C 交互是非常麻烦的,而且有一些 Lua 的代码是晦涩难懂。 比如 m...

查看添加到 epoll 的文件描述符对应的事件

找到要分析的进程 比如我们要分析 nginx worker 进程的 epoll 都添加了哪些句柄,他们的 events 是如何。 我们用下列命令找到要分析的 nginx 进程。 1 2 $ ps aux | grep "nginx: worker" nobody 606535 0.0 0.0 78076 8488 ? S 17:22 0:11 ngi...