知乎 - NGINX洪志道

18 篇内容

个人心得知乎 - NGINX洪志道

AI 时代,给自己做一件作品

文章从作者与 NGINX 作者 Igor 的交流切入,强调“实践”是架构与复杂性驾驭能力的主要来源。作者结合参与 NGINX、Unit 及新开源项目 Worker 的经历,主张通过完整做一个工具、网站或服务来训练软件设计能力:从功能组织、数据保存、模块协作到动态配置等都要自行权衡。作者认为 AI 在局部实现上很强,会减少手写锻炼,但也能充当随时可用的反馈者,帮助检查设计复杂性、可修改性和替代方案。最后强调还要走完“最后一公里”,包括安装部署、文档表达、获取用户反馈并据此迭代。适用边界是偏个人学习与工程成长心得,不是具体技术教程或可复现实验。

推荐收录:文章以 Worker、NGINX Unit 等真实项目为证据,把“完整作品”如何训练复杂性驾驭、软件设计与反馈循环讲得具体,并指出 AI 可降低获取专业反馈的门槛。适合希望从局部功能走向独立负责系统的开发者、开源维护者参考;局限是经验性反思,缺少量化验证,需结合自身项目实践。

技术文章知乎 - NGINX洪志道

一个应用服务器是怎么工作的

文章系统拆解应用服务器的工作原理,衔接外层 Web 服务器与语言运行时,分析其如何接收请求、管理进程并调用应用代码。作者将应用服务器分为两类:一类直接用应用语言实现 HTTP 服务并运行同生态代码,另一类用 C/C++/Rust 等系统语言实现服务器核心,通过语言适配器加载解释型语言引擎。文章以 PHP-FPM、Gunicorn、Uvicorn、NGINX Unit 等为例,解释 SAPI 与 Zend Engine、WSGI/ASGI 等接口差异,并阐述固定进程池、动态进程池和按需进程池的取舍。随后文章跟随一次请求从 accept 到语言运行时调用再到返回响应的完整链路,说明请求解析、应用选择、进程获取、适配器转换及错误分层。最后讨论应用服务器应负责多少功能的分层设计,强调统计应放在应用执行与响应返回的边界。文章基于通用部署模型,忽略具体协议细节,适合作为理解应用服务器基础架构的参照。

推荐收录。文章由 NGINX 背景作者写作,澄清了 Web 服务器、应用服务器、语言运行时时常被混淆的分层关系,并用一次请求的完整路径串联进程管理与语言适配等细节。适合初入后端的开发者建立系统认知,也适合需要设计或选择应用服务器形态的工程师作为思考框架;文中对多语言支持难点的分析具有普遍参考价值。

工程实践知乎 - NGINX洪志道

聊聊 NGINX 作者 Igor Sysoev 的遗珠之作:Unit

文章是 Unit 核心维护者对 NGINX Unit 的一手回顾。它指出 Unit 的定位是在 NGINX 之后再向前一步,用统一基础设施直接加载并管理 PHP、Python、Go 等应用进程,把配置变成可通过 REST API 修改的运行时对象树。文章解析了 router 多线程事件循环、任务队列、基于 port 的进程间通信,以及应用进程自动扩缩中对 pending、空闲、就绪和崩溃的生命周期处理。作者结合与 Igor 共事的经历,强调架构控制复杂性的能力,并指出 Unit 因市场定位与生态未闭环而在 2025 年归档。

推荐收录。文章由 Unit 核心维护者撰写,包含真实系统设计细节和一手维护经验,对 router 并发模型、动态配置与进程生命周期有扎实剖析。适合 Web 基础设施、应用服务器和系统设计方向的工程师阅读,可迁移的是对复杂状态和并发边界的工程判断。需要注意项目已停止维护,读者应结合当前生态评估其模式适用性。

工程实践知乎 - NGINX洪志道

10 | 好的软件设计,是 AI 编程的天花板

作者基于NGINX嵌入Lua开发了一个Web Runtime(nginx-lua-web),并借助AI辅助完成完整实现、自动化测试和性能对比。文章核心论点是:软件原有设计的质量决定了AI编程所能达到的天花板。项目难点在于端到端异步流式处理,涉及读、写、超时、背压等交织的复杂性,NGINX清晰的事件驱动架构、内存池、cleanup机制和模块边界为AI提供了可推理的上下文,使AI能够有效生成符合规范的C代码,并维持约7/10的代码质量和连贯设计。性能测试表明,增加Lua层后未付出失控代价。作者总结,AI加速了理解系统的过程,但理解本身才是对抗复杂性的基本能力,好的设计是AI放大的基础。文章以单个C扩展项目为案例,结论可能受限于特定技术栈,但提供了关于AI与系统设计关系的可迁移洞见。

推荐收录,因为文章结合真实工程案例和AI辅助开发经验,具体展示了软件设计如何制约AI生成代码的质量与系统复杂度管理。适合关注AI工程化、系统架构和扩展设计的读者,其分析方法、性能验证手段和设计原则可迁移至其他类似异步高并发系统的开发中。

工程实践知乎 - NGINX洪志道

09 | AI太擅长写业务了

文章以 Nginx 上 Lua Web API 的开发为例,介绍了如何利用 AI 辅助编程实现 Request、Response 和 Headers 对象。核心方法是统一对象模型的设计模式:通过 create(创建骨架)、get(取出 C 结构体)和 fill(填充数据)三个独立职责,解耦对象定义、数据来源和跨语言访问,确保 Lua 与 C 两侧的一致性。作者强调 AI 更适合在清晰的设计约束下快速复制正确模式,而人负责确定模型和边界。文章还讨论了 AI 在加速理解系统和生成代码方面的价值,以及如何在迭代中提升代码质量。结论是“人设计,AI 实现”能平衡效率与质量,但需要较强的设计能力来引导,且 AI 初始输出需人工审校。适用场景包括跨语言系统开发、嵌入式脚本扩展等,不足在于对设计者能力要求较高。

推荐收录,因为文章不仅展示了 Nginx/Lua 跨语言对象管理的具体工程实现,还提炼出可复用的 create/get/fill 设计模式,并提供了人机协作的实践边界。对于需要开发嵌入式脚本接口、处理跨语言对象生命周期,或希望利用 AI 提升编码效率的工程师,文中模式可以直接迁移,协作理念也具有长期参考价值。

工程实践知乎 - NGINX洪志道

08 | 开发最核心的fetch功能

文章记录了在 NGINX 环境下从零实现 fetch(独立 HTTP 客户端功能)的完整过程。作者以异步连接为起点,逐步加入请求发送、响应读取、Stream 流式处理、keepalive 连接池、DNS 解析和 HTTPS 等能力,每次迭代都先保证核心设计合理,再让 AI 实现具体代码并即时 review。文中还深入讨论了为何将所有实现放在单个 fetch.c 文件中符合高内聚原则,并指出过度拆分文件反而会增加不必要的边界复杂度。方法的核心是将复杂功能拆解为可验证的最小单元,由人把控理解、设计和拆解,AI 负责实现与测试,从而兼顾开发效率和代码质量。该案例适用于需要自行实现异步网络功能或探索人机协作开发的工程师,但要求开发者自身有扎实的编程和设计判断力。

推荐收录,因为它不是一个简单的功能实现记录,而是展示了从核心到外围的功能拆解策略、与 AI 协作的迭代方法,以及基于高内聚原则的文件组织决策。这些方法对需要做复杂功能开发的工程师具有直接借鉴意义,所讨论的 AI 编程边界、设计复杂度控制和代码结构选择都是长期有效的工程议题,可迁移到类似的网络服务或基础设施开发场景。

个人心得知乎 - NGINX洪志道

聊聊编程中的原创能力

作者结合在NGINX社区的真实经历,分享了对编程原创能力的思考。文章从一次设计任务讲起:当被要求实现文件服务时,借鉴 NGINX 现有方案的提议被同事否决,从而引导作者反思“对成熟系统祛魅”的必要性,并认识到原创能力源于对问题的深入理解和摆脱定式思维。接着以自主开发的 NGINX Lua Web 运行时项目为例,展示了如何在长期理解系统的基础上,设计出更符合当前目标的脚本化方案。文章还讨论了 AI 在加速原型验证和理解过程中的作用,但强调理解本身不可被跳过。最后提出提升原创能力的建议:在思维上保持开放、接纳多元设计;在技术上通过实践自己关心的项目,并在过程中不断追问核心价值和设计取舍。不足在于缺乏量化实验和具体的技术实现细节,更多是个人感悟与心态总结。

推荐收录。文章不是空泛的鸡汤,而是基于作者在 NGINX 社区的实际经历和亲手开发的项目,完整展现了从“尊崇已有设计”到“独立思考重新设计”的认知转变,并具体定义了编程原创能力的内涵。适合对软件设计进阶、突破思维惯性感兴趣的开发者阅读,可迁移价值在于帮助读者反思自身对既有方案的依赖,并提供了在个人项目中刻意训练原创能力的实践思路。

工程实践知乎 - NGINX洪志道

07|变化是复杂度的帮凶

这篇文章复盘了作者在 NGINX/Lua 项目中实现 Stream、并为后续 fetch 做铺垫的工程拆解过程。作者先把 fetch 分解为 Request、Response、Headers、URL、URLSearchParams 和 Stream,指出真正的复杂度主要集中在 body 的异步流转,以及 C 与 Lua 两套执行模型的衔接。为了避免 AI 一次生成过大的、难以重构的方案,他没有让模型直接实现完整 Stream,而是先压缩需求,只做异步核心,并把 handler 的输入输出临时改成 Stream。随后在这个更大的边界上补齐同步能力,使设计保持一致,代码增量主要是追加而非推翻重写。文章最后给出当前实现状态:请求体可作为异步 Stream 被 Lua 读取,Lua 可创建同步 Stream,响应体也能被 NGINX 消费;fetch 仍是后续更复杂的目标。

推荐收录,因为它不是泛泛谈“用 AI 写代码”,而是给出了真实项目里如何拆分复杂异步接口、如何设定最小可行边界、如何审阅 AI 方案的具体做法。适合做大型功能设计、AI 辅助开发和异步抽象设计的参考,尤其对需要在 C/Lua 或类似双模型系统间做桥接的工程场景很有迁移价值。

工程实践知乎 - NGINX洪志道

06|从哪个功能开始:最小、核心的流式处理

文章围绕一个 NGINX Lua Web runtime 的开发顺序选择展开,核心结论是应先实现 Stream,而不是先做 Headers、Request 或 Response。作者认为 body 才是请求、响应与 fetch 的共同底座,只有先把流式数据模型立住,后续 API 才不会停留在表层封装。文章进一步分析了流式处理的复杂性:它同时涉及客户端、上游和 Lua 自身创建的流,还要处理生产端、消费端、异步等待、状态保存以及 NGINX 事件与 Lua coroutine 的协同。作者指出,Headers 虽然更容易实现、也更适合快速出成果,但对系统最核心的异步与数据流问题牵引不足。本文的价值在于用最小可验证功能暴露架构关键点,帮助读者理解如何用功能排序来对抗复杂性。

推荐收录,因为文章明确给出了“先做 Stream、后做 Headers”的工程证据,并解释了 body 作为 runtime 底座为何决定整体架构形态。适合做 Web runtime、异步 I/O 和系统设计的项目规划参考,但它更偏方法论与阶段选择,尚未给出完整实现细节。

工程实践知乎 - NGINX洪志道

05|NGINX 脚本化历史,以及为什么选择官方 Lua

文章梳理了 NGINX 脚本化能力的演进脉络:从早期 Perl、SSI,到作者参与的 njs、QuickJS,再到自己尝试的 nginx-lua-web,说明 NGINX 一直在扩展可嵌入脚本运行时。核心论点是,这个新项目不想让用户直接面对 NGINX 的 body filter 等内部概念,而是提供更接近纯 Web 运行时的编程体验。作者进一步比较了 OpenResty 常用的 LuaJIT 与官方 Lua,认为后者在当前版本中性能、GC、稳定性和工程可用性已经足够,且更适合做 C 程序的嵌入式胶水语言。为提升易用性,文章还借鉴了 JS Web APIs,强调用 fetch 等标准接口降低脚本门槛。整体更像一次结合 AI 编程实践的工程选型记录,但其中部分关于版本演进和生态判断带有作者经验视角,适合与实际需求一起审视。

文章直接给出了 NGINX 脚本化路线、官方 Lua 选型和 Web API 设计的工程理由,不是泛泛而谈。适合做嵌入式脚本运行时、Nginx/OpenResty 生态或 AI 辅助开发实践的读者参考;但其中对 LuaJIT/官方 Lua 的结论带有作者立场,具体迁移前仍需结合基准测试验证。

工程实践知乎 - NGINX洪志道

03-AI 编程的粒度和节奏

文章讨论了用 AI 辅助开发时如何把任务切成合适粒度,并主张不要一开始就追求最终形态,而是按“逐步逼近目标”的方式推进。作者以 Nginx + Lua 的实现为例,先让 AI 完成 Lua 引擎接入,再把代码改为文件化管理,虽然离最终使用方式还有距离,但每一步都具备独立价值且可被解释清楚。文中强调粒度判断应以 Review 为准:功能独立、代码简洁、设计不过分离谱,并且每步都要有测试用例验证正确性。作者还指出,开发文档可以不先写,但测试和使用文档必须与代码同步维护。文章的适用边界是强依赖持续 Review 与代码理解,若缺少审查机制,AI 生成的中间态容易偏离目标。

推荐收录,因为文章给出了 AI 编程中“粒度”和“节奏”的直接实践证据:按 Review 标准拆分任务、每步独立有价值、并用测试保证方向不跑偏。适合正在用 AI 写代码、做重构或推进大改动的工程团队参考,但前提是具备稳定的人工审查与测试机制。

工程实践知乎 - NGINX洪志道

02-先把项目的骨架搭起来

文章围绕“先做最小、核心、可验证的东西”这一 AI 编程原则展开,强调软件开发应先收敛到一个能被验证的最小闭环,再逐步扩展功能。作者以 nginx-lua-web 项目为例,说明项目启动阶段如何同时建立源码、测试和使用文档,并先让 Nginx 具备一个可进入的入口,哪怕当前只是返回 404。文章还明确表达了代码驱动的推进方式:通过最小功能、明确测试和同步文档,让 AI 在局部清晰任务上高效工作。

推荐收录,因为它不是泛泛而谈 AI 写代码,而是给出了一个可执行的工程起步方法:先建立最小可验证骨架,再用测试和文档约束演进。这个思路对 AI 辅助开发、项目初始化和复杂系统拆分都具有较强迁移价值。

学习路线知乎 - NGINX洪志道

04-聊聊各主流编程语言还有软件工程

文章围绕“主流编程语言该怎么选”展开,但核心并不是语言排行榜,而是帮助读者建立对语言、运行时和软件工程之间关系的整体认知。作者用 C、JavaScript、PHP、Python、Go、Java、Rust 等语言为例,解释了编译与解释的直观差异、脚本引擎与宿主程序的关系,以及不同语言分别解决的工程问题和代价。文章最后强调:语言只是入门工具,真正决定长期成长的是对系统运行、架构边界、复杂度控制和性能问题的软件工程能力。

推荐收录,因为它不是单纯的语言推荐帖,而是把语言选择、工作场景、长期成长和软件工程素养放在同一框架里讨论,适合刚入行和正在转方向的读者参考。文章对“工作语言”和“个人成长语言”的区分、以及从语法走向运行时和系统理解的路径,具有较强的迁移价值。

工程实践知乎 - NGINX洪志道

重构是 AI 编程的基本功:从一次 nginx 实践说起

文章以 nginx 的 proxy HTTP/2 支持重构为例,讨论如何把一个承载请求状态、解析状态、stream 状态、connection 状态和控制帧临时状态的巨大 ctx 结构拆分为 frame_parse、stream、connection 与请求编排层。作者详细解释了为什么旧设计在单连接单请求时代“能工作”,却在 HTTP/2 单连接多请求和后续功能扩展下暴露出边界混乱、职责耦合和维护成本上升的问题。文章还给出了一套用 AI 辅助重构的实操方法:先明确边界,再按小步改动、逐步编译测试、查看 diff 并独立提交,借此把 AI 的执行力限制在正确的设计框架内。

推荐收录,因为它不是泛泛谈“AI 写代码”,而是基于真实 nginx 代码库展示了如何用重构重新整理核心抽象和模块边界。对做后端、基础设施或大型遗留代码维护的读者来说,文章提供了可迁移的拆分思路、变更节奏和验证方式。

工具笔记知乎 - NGINX洪志道

我如何用 AI 做真实编程

这篇文章记录了作者用 AI 辅助真实编程的一套实用方法,核心包括优先使用能力更强的大模型、用测试用例约束 AI 输出、频繁重构、以及通过“明确目标—拆小任务—让 AI 实现—自己理解 diff—写/跑测试—继续迭代”的循环推进开发。作者强调代码本身应当成为设计载体,而不是只依赖文档式 SPEC,同时认为真正有价值的经验来自在复杂、真实的任务中持续实践。

推荐收录,因为它给出了一套可直接迁移到日常开发中的 AI 编程工作流,而不是停留在抽象的“怎么问 AI”。其中关于测试、重构、理解 diff 和代码驱动的建议,对使用 AI 提升交付质量和保持代码可维护性都有长期参考价值。

学习路线知乎 - NGINX洪志道

03-应该自学什么

这篇文章讨论的是完成编程入门后的下一步该如何自学,核心建议是先继续巩固数组等基础数据结构,再通过经典书籍建立更长期的代码质量与软件设计意识。作者强调自学在编程中的重要性,并建议优先阅读《重构与模式》《敏捷软件开发》《领域驱动设计》,《深入理解计算机系统》可作为能力提升但非必读的补充。文章的边界也比较明确:它不是系统课程表,而是面向初学者的阶段性选书与学习方向建议。

推荐收录,因为它给出了入门之后很实用的自学顺序和阅读取舍,适合刚接触编程、正在从“会写语句”过渡到“会组织代码”的学习者。文章虽然简短,但对基础巩固、代码重构意识和长期自学心态的建议具有可迁移价值。

学习路线知乎 - NGINX洪志道

01-完全没基础,怎么开始学编程

这篇文章面向完全零基础的人,提出一条“先建立编程感觉、再补语言体系”的入门路径。作者主张用 JavaScript 和浏览器 Console 作为第一门工具,只学习顺序、条件、循环、变量、值与表达式、函数这六个最基础概念,并用“手机电量”这一单一主线把知识点串起来。文章还强调必须通过复制、修改、运行、观察结果的循环来学习,并把“能独立写出类似小程序”作为真正学会的标准。

推荐收录,因为它不是泛泛而谈“如何学编程”,而是给出了面向零基础学习者的具体起点、知识范围和练习方式,具备明确的可执行性。其价值在于帮助初学者避开环境配置、框架和概念堆砌带来的挫败感,适合作为编程启蒙的长期参考。

学习路线知乎 - NGINX洪志道

零基础编程入门

这篇文章是一套面向零基础读者的编程入门课程设计,主张先用 Chrome Console 和 JavaScript 建立“代码会执行”的直觉,再围绕一个手机电量模拟案例,按顺序讲解语句、条件、循环、变量、表达式和函数六个最基础概念。作者特别强调以实践驱动学习:先跑代码、再改参数、再回看结果,并把“能自己写出类似小程序”作为真正学会的标准,而不是停留在概念背诵。

推荐收录,因为它不是泛泛谈“如何学编程”,而是给出了清晰的入门顺序、最小工具链和可执行的练习方法,适合真正从零开始的人建立第一层编程感知。它的可迁移价值在于把“先跑起来、再理解”的方法论抽象得很清楚,对其他语言和初学课程设计也有参考意义。