zhuizhuhaomeng Blog

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

lua_package_path of the OpenResty

OpenResty 官方发布的包的搜索路径默认包含 /usr/local/openresty/site/lualib,这个是如何做到的呢? 从 C 代码中我们可以看到, lua-nginx-module 的正常发布版本是不会有 LUA_DEFAULT_PATH 的,除非定义了 LUA_DEFAULT_PATH。 #if !defined(LUA_DEFAULT_PATH) &&a...

使用 OpenTelemetry 采集 Nginx 访问日志/错误日志/指标数据/Trace 数据

安装 nginx-otel 模块 安装 Nginx 模块参考 https://github.com/nginxinc/nginx-otel/blob/main/README.md 配置 Nginx 为了方便日志采集,将日志输出为 json 这种结构化的格式。注意 log_format 中指定 escape 为 json。 location /t 配置了推送 trace 信息到...

Nginx Shared Memory Fragment

从 如何估算共享内存大小 我们知道, 其实 Nginx 的共享内存分配是划分成固定大小的块的。 这些大小分别是 8, 16, 32,64, …, page_size / 2。以 4K 页面大小为例,这个固定的块就是 8,16, 32, …, 2048。 nginx 共享内存分配除了固定大小外还有另一个特性就是内存分配是池化的。也就是说,这些固定大小的内存块是以内存池的形式存在的。 要申请一...

How to estimate Nginx shared memory size

Why it is 8K entries in one megabyte From http://nginx.org/en/docs/http/ngx_http_proxy_module.html, we know that one megabyte zone can store about 8 thousand keys. But why it is 8 thousand? Let’s...

parsing file by token

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 sub parse_file($) { open my $in, $yfile or die "Cannot open file $yfile for r...

luarocks for openresty

luarocks 安装模块给 OpenResty使用,最好是要跟非 LuaJIT 的版本区分,因此应该使用类似这样子的命令 1 sudo luarocks install --force --lua-dir=/usr/local/openresty/luajit/ --tree=/usr/local/openresty/luajit --server=https://luarocks.or...

resty.core not found

在搞 OpenResty 应用的测试有时候突然遇到这样的错误,平常跑得好好的突然不行了,这是为什么呢? 如果不是修改一点就执行测试很难想起来是怎么回事。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 nginx: [alert] failed to load the 'resty.core' module (https://github.com/ope...

Lua 协程缓存池的实现

性能优化的一个关键就是使用缓存。从硬件层面的 CPU 的一级缓存,二级缓存,三级缓存 到操作系统内核的各种文件缓存,目录缓存,文件元数据信息缓存以及应用软件各种缓存都是为了 加速访问。 而我今天遇到了一个没有使用缓存会导致内存膨胀的问题。之所以会导致内存膨胀是因为每创建一个协程, 会创建一个对应的 C 的内存结构,而这个 C 结构体的内存的生命周期和协程的生命周期是不一致的。 因此即使协程...

cosocket 的上游元表是如何生效的

回收资源是一个很重要的问题。函数之间的调用非常复杂,所以一个资源的生命周期可能很难确定。 如果有一个统一的入口和统一的出口实现资源的分配和回收那么就可以极大的简化问题。 Lua 个 gc 回调就是一个很好的时机,可以作为一种最终的兜底方案。 下面看看 ngx_http_lua_socket_tcp_upstream_t 这个 GC 对象是如何设置 gc 函数回收资源的。 元表的创建 在...

为什么同一个上游的响应时间差别很大

最近遇到一个奇怪的问题,用户通过代理后响应时间和不通过代理的响应时间差别很大。 不通过代理只有几毫秒,而通过代理需要 100 毫秒以上。 直接访问 通过代理 用户提出问题的时候,用户给的信息是很简单的。而这个时候我们需要像医生给病人看病一样, 需要深入的询问病史而不是简单的接受病人提供的信息就一头栽进去。 我想应该是安装这样的步骤分析问题: 首先,我们需要仔细验证用户...