zhuizhuhaomeng Blog

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

OpenResty 怎么做日志切割

logrotate in nginx nginx 官方给出的日志切割建议如下: 1 2 3 4 mv access.log access.log.0 kill -USR1 `cat master.nginx.pid` sleep 1 gzip access.log.0 # do something with access.log.0 可以参考官方文档 https://www.n...

OpenResty 集成 lfs 模块

为什么需要 lfs 文件操作是所有软件都需要具备的一个非常基本的操作。因为 Lua 本身没提供足够的文件操作接口。 因此就有了不少第三方模块。 Lua lfs 模块就是为了解决文件操作接口不足的问题。那么 OpenResty 应该如何集成 lfs 模块呢? 编译 lfs 模块 lfs 模块打 patch 在使用全局变量会导致 OpenResty 打印告警信息,为了消除这个告警信息,...

Nginx EBPF 是怎么工作的

背景 Nginx 是多进程的架构,一个端口就会被多个进程同时进行监听。 因此 Linux 内核在派发报文的时候就需要一个策略来确定如何将报文发送给哪个进程。 对于 TCP 来说,这个事情就显得简单得多了。因为 TCP 是采用面向连接的协议, 每一个连接会关联一个独立的 socket,这个 socket 拥有不同唯一的 4 元组(源 IP, 目的 IP,源端口,目的端口)。 因此,Linux...

wireguard 组网配置

安装 wireguard 客户端 参考 https://www.wireguard.com/install/ 1 yum install wireguard-tools 生成公钥和配置 IP 地址 带图形界面的客户端,新建一个隧道就会自动生成成对的私钥和公钥。 如果是命令行,则使用如下命令: 1 2 cd /etc/wireguard wg genkey | t...

mariner Linux 系统在 ssh 退出后杀死了手动启动的后台进程

问题 我们通过下面这样的命令启动了 OpenResty, 在 ssh 登出后,nginx 进程被系统杀死了。 1 sudo /usr/local/openresty/nginx/sbin/nginx -p /usr/local/openresty/nginx 定位是谁杀死了 nginx 要定位谁杀死了 nginx,就需要看看是什么进程发送了信号。这个可以使用 systemstap ...

OpenResty 过滤响应体

响应体过滤的问题 很多初学者在使用 OpenResty 过滤响应体的时候总是会遇到错误而调试半天。 最常见的就是没有先把 Content-Length 的响应头清空。 因为过滤响应体基本上是会修改响应体的大小,如果不删除响应头的 Content-Length, 那么响应体大小和 Content-Length 的值就对不上,这就导致协议错误。 另外一个是要对响应体进行修改,最好是未压缩的...

When Will Nginx Send 'Connection: close' Header

长链接对于降低请求延时,减少服务器开销是非常有好处的。然而有时候由于配置不当,导致 Nginx 服务器发送响应头包含 ‘Connection: close’。客户端在收到带有 ‘Connection: close’ 的响应后会关闭连接。 那么什么情况下会导致 Nginx 发送 ‘Connection: close’ 呢? 对于 Nginx,我们可以通过搜索 r->keepalive...

如何运行 systemtap 的测试用例

参与一个软件的开发,提交 PR 就需要能够通过相关的用例集合。因此跑用例是一个基础的步骤。 这里主要记录如何跑 systemtap 的测试用例。 安装依赖 测试的时候要用到 runtest 这个组件,需要安装 dejagnu。 编译的时候依赖 elfutils-devel, 因此需要安装改组件。 其它的 python3 的系统应该默认就存在了。 1 2 3 4 5 6 7 8 9 10...

C/C++/Rust 的堆栈回溯是怎么实现的

好文推荐 使用 -O2 编译的程序如果没有传递 -fno-omit-framepointer 这个编译参数,那么 rbp 寄存器就不会被用来作为调用栈回溯的栈帧寄存器。这个时候如果需要执行 unwind 应该如何处理呢? 这个文章通过一步步的手动解码告诉我们 C/C++ 的调用栈回溯是怎么处理的。 https://lesenechal.fr/en/linux/unwinding-the-...

Unwinding the stack the hard way

为了防止原文丢失,把该文章翻译成中文备份。原文地址:https://lesenechal.fr/en/linux/unwinding-the-stack-the-hard-way Kévin Lesénéchal 15 April 2023 假设你有一个 C 语言或 Rust 语言的程序,这个程序有一个错误。你在终端看到的只是可怕的分段错误(核心转储)。那么……假设这是一个...