<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>C on Horeb</title><link>https://horeb.top/tags/c/</link><description>Recent content in C on Horeb</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>© 2026 JekYUlll</copyright><lastBuildDate>Fri, 29 May 2026 10:30:05 +0000</lastBuildDate><atom:link href="https://horeb.top/tags/c/index.xml" rel="self" type="application/rss+xml"/><item><title>Nginx 源码解析（十二）：模块系统与动态加载</title><link>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%8D%81%E4%BA%8C%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F%E4%B8%8E%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BD/</link><pubDate>Fri, 29 May 2026 00:00:00 +0000</pubDate><guid>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%8D%81%E4%BA%8C%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F%E4%B8%8E%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BD/</guid><description>&lt;p&gt;系列开篇就说过，Nginx 的所有功能都是模块提供的。前面的文章你看到了 HTTP 模块、Event 模块、Upstream 模块在各自领域的工作方式，现在是时候把视角拉回到模块系统本身，，看看 Nginx 的模块到底长什么样，静态模块怎么初始化，动态模块又是如何通过 &lt;code&gt;dlopen&lt;/code&gt; 加载进来的。&lt;/p&gt;
&lt;p&gt;这篇文章会深入 &lt;code&gt;ngx_module_t&lt;/code&gt; 的每一个字段，拆解 &lt;code&gt;ngx_modules.c&lt;/code&gt; 的生成逻辑、&lt;code&gt;ngx_count_modules()&lt;/code&gt; 的索引分配、&lt;code&gt;ngx_load_module()&lt;/code&gt; 的动态加载路径，以及模块 &lt;code&gt;commands&lt;/code&gt; 数组如何驱动配置文件解析器。&lt;/p&gt;</description></item><item><title>Nginx 源码解析（十一）：线程池与异步 IO</title><link>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%8D%81%E4%B8%80%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8E%E5%BC%82%E6%AD%A5-io/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><guid>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%8D%81%E4%B8%80%E7%BA%BF%E7%A8%8B%E6%B1%A0%E4%B8%8E%E5%BC%82%E6%AD%A5-io/</guid><description>&lt;p&gt;Nginx 以事件驱动模型闻名，核心 worker 进程是一个单线程事件循环。但网络 I/O 之外还有一类阻塞操作，磁盘 I/O、gzip 压缩、SSL 握手，它们会卡住整个事件循环。这篇我们从源码角度拆解 Nginx 1.24.x 如何用线程池和异步 I/O 两条路径来解决这个矛盾。&lt;/p&gt;</description></item><item><title>Nginx 源码解析（十）：定时器系统</title><link>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%8D%81%E5%AE%9A%E6%97%B6%E5%99%A8%E7%B3%BB%E7%BB%9F/</link><pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate><guid>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%8D%81%E5%AE%9A%E6%97%B6%E5%99%A8%E7%B3%BB%E7%BB%9F/</guid><description>&lt;p&gt;前面我们分析了 Nginx 事件循环的核心骨架，，&lt;code&gt;ngx_process_events_and_timers()&lt;/code&gt; 是每个 worker 进程里的主循环函数。不过之前一直留了一个坑：传给 &lt;code&gt;epoll_wait&lt;/code&gt; 的超时时间 timer 是怎么算出来的？超时后事件怎么处理？&lt;/p&gt;
&lt;p&gt;这一篇就来填这个坑。Nginx 的定时器系统用红黑树管理所有事件超时，逻辑写得很紧凑，总共不到 300 行。&lt;/p&gt;</description></item><item><title>Nginx 源码解析（九）：缓冲区与零拷贝</title><link>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E4%B9%9D%E7%BC%93%E5%86%B2%E5%8C%BA%E4%B8%8E%E9%9B%B6%E6%8B%B7%E8%B4%9D/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E4%B9%9D%E7%BC%93%E5%86%B2%E5%8C%BA%E4%B8%8E%E9%9B%B6%E6%8B%B7%E8%B4%9D/</guid><description>&lt;p&gt;响应 1000 并发静态文件请求时，单进程 CPU 都花在哪？大部分在拷贝上：磁盘→内核→用户→内核→网卡。每一跳都是宝贵的内存带宽和 CPU 缓存污染。Nginx 用两类手段解决：一是 &lt;code&gt;sendfile&lt;/code&gt; 零拷贝，完全绕过用户态；二是在必须拷贝的地方，用 &lt;code&gt;ngx_buf_t&lt;/code&gt; / &lt;code&gt;ngx_chain_t&lt;/code&gt; 这套设计把拷贝量压到最低，且让 buffer 在 filter 链中复用。&lt;/p&gt;</description></item><item><title>Nginx 源码解析（八）：连接管理</title><link>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%85%AB%E8%BF%9E%E6%8E%A5%E7%AE%A1%E7%90%86/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><guid>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%85%AB%E8%BF%9E%E6%8E%A5%E7%AE%A1%E7%90%86/</guid><description>&lt;p&gt;前几篇文章我们聊了事件驱动和内存池，这次来看连接管理。连接是 Nginx 处理所有请求的起点，从 accept 到 close 的完整生命周期都在 &lt;code&gt;src/core/ngx_connection.c&lt;/code&gt; 和 &lt;code&gt;src/event/ngx_event_accept.c&lt;/code&gt; 中实现。理解这套机制，就理解了 Nginx 为什么能在亿级连接下保持稳定。&lt;/p&gt;</description></item><item><title>Nginx 源码解析（七）：Upstream 与负载均衡</title><link>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E4%B8%83upstream-%E4%B8%8E%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/</link><pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate><guid>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E4%B8%83upstream-%E4%B8%8E%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/</guid><description>&lt;p&gt;Nginx 反向代理的核心是 upstream 模块。它负责从上游服务器池中选出一个 peer，建立 TCP 连接，转发请求，接收响应，然后回传给客户端。整个流程涉及连接管理、超时控制、负载均衡调度和事件驱动的 I/O 管理。&lt;/p&gt;</description></item><item><title>Nginx 源码解析（六）：HTTP 模块与请求处理</title><link>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%85%ADhttp-%E6%A8%A1%E5%9D%97%E4%B8%8E%E8%AF%B7%E6%B1%82%E5%A4%84%E7%90%86/</link><pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate><guid>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%85%ADhttp-%E6%A8%A1%E5%9D%97%E4%B8%8E%E8%AF%B7%E6%B1%82%E5%A4%84%E7%90%86/</guid><description>&lt;p&gt;前五篇我们从整体架构走到事件驱动和配置系统，现在终于到了最核心的 HTTP 处理层。这一篇拆解 Nginx 1.24.x 的 HTTP 模块体系与请求处理全流程，，从 &lt;code&gt;ngx_http_module_t&lt;/code&gt; 接口到 11 阶段处理引擎，从请求解析到 filter 链。HTTP 模块是 Nginx 最重要（也最大）的子系统，全部源码约 7 万行，分布在 &lt;code&gt;src/http/&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>Nginx 源码解析（五）：配置解析系统</title><link>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E4%BA%94%E9%85%8D%E7%BD%AE%E8%A7%A3%E6%9E%90%E7%B3%BB%E7%BB%9F/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E4%BA%94%E9%85%8D%E7%BD%AE%E8%A7%A3%E6%9E%90%E7%B3%BB%E7%BB%9F/</guid><description>&lt;p&gt;Nginx 的配置系统不是简单的 INI 解析，，它是一整套声明式 DSL，ngx_conf_parse() 递归地喂给 ngx_conf_handler()，后者根据指令名匹配模块、校验上下文和参数，最后调用模块注册的 set 回调填充配置结构体。今天把这套机制拆干净。&lt;/p&gt;</description></item><item><title>Nginx 源码解析（四）：内存管理</title><link>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%9B%9B%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%9B%9B%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/</guid><description/></item><item><title>Nginx 源码解析（三）：事件驱动核心</title><link>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E4%B8%89%E4%BA%8B%E4%BB%B6%E9%A9%B1%E5%8A%A8%E6%A0%B8%E5%BF%83/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><guid>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E4%B8%89%E4%BA%8B%E4%BB%B6%E9%A9%B1%E5%8A%A8%E6%A0%B8%E5%BF%83/</guid><description/></item><item><title>Nginx 源码解析（二）：进程模型与生命周期</title><link>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E4%BA%8C%E8%BF%9B%E7%A8%8B%E6%A8%A1%E5%9E%8B%E4%B8%8E%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/</link><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><guid>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E4%BA%8C%E8%BF%9B%E7%A8%8B%E6%A8%A1%E5%9E%8B%E4%B8%8E%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/</guid><description/></item><item><title>Nginx 源码解析（一）：整体架构总览</title><link>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E4%B8%80%E6%95%B4%E4%BD%93%E6%9E%B6%E6%9E%84%E6%80%BB%E8%A7%88/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://horeb.top/posts/infra-nginx-%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E4%B8%80%E6%95%B4%E4%BD%93%E6%9E%B6%E6%9E%84%E6%80%BB%E8%A7%88/</guid><description>&lt;p&gt;去年生产环境一个诡异的 TIME_WAIT 问题把我引进了 Nginx 源码，读完之后最大的感受是：代码写得比《Unix 网络编程》还干净。这个系列我会从整体架构到底层细节，逐层拆解 Nginx 1.24.x 的源码。&lt;/p&gt;</description></item></channel></rss>