资深技术专家Nginx源码研习书强势升级!
深入新版Nginx源码(Stable1.12.0)!
详细剖析Nginx核心运行机制!
便捷、轻松地开发和定制Nginx!
Nginx是知名的Web服务器,性能优异,运行效率远超传统的Apache、Tomcat,广泛应用于国内外诸多尖端互联网公司。
Nginx的一个突出特点是其灵活优秀的模块化架构,可以在不修改核心的前提下增加任意功能,自2004年发布至今,已经拥有百余个官方及非官方的功能模块(如proxy、mysql、redis、rtmp、lua等),使得Nginx成长为了一个近乎“全能”的服务器软件。
Nginx功能强大,架构复杂,学习、维护和开发的门槛较高。为了帮助读者跨越这一障碍,《Nginx完全开发指南:使用C、C++和OpenResty》深入新版Nginx源码(Stable1.12.0),详细剖析了模块体系、动态插件、功能框架、进程模型、事件驱动、线程池、TCP/UDP/HTTP处理等Nginx核心运行机制,在此基础上讲解如何使用C、C++、Lua、nginScript等语言来增强扩展Nginx,让任何人都能够便捷、轻松地开发和定制Nginx,进而应用到自己的实际工作中,创造出更多的价值。
《Nginx完全开发指南:使用C、C++和OpenResty》结构严谨、脉络清晰、论述精确、详略得当、图文并茂,值得广大软件开发工程师、系统运维工程师和编程爱好者拥有。
罗剑锋(网名Chrono)在1996年就读于东北财经大学;1997年开始接触C/C++;1998年参加计算机软件专业技术资格和水平考试,获高级程序员资质;2003年毕业于北京理工大学,获计算机专业硕士学位。主要研究方向为C/C++、设计模式、高性能网络服务器开发,业余爱好是阅读、旅游、欣赏音乐和电影。
我很感谢罗剑锋能在他的这本新书中帮忙推广和普及 OpenResty 这个开源 Web 平台的相关技术。我们最初做 OpenResty 和ngx_lua 等模块的目的其实就是希望开发者能尽量少写NGINX 的 C/C++ 模块,多写 Lua 以及我们即将推出的像fanlang 和 edgelang 这样更上层的高级编程语言。毕竟我们自己也深知 NGINX 级别的 C/C++编程的不易。无论如何,能有像罗剑锋这样的热心开发者,把 NGINX C/C++ 编程的主要方面比较详细地写下来,也是非常有意义的事情。
—— 章亦春 OpenResty 开源平台的作者,OpenResty Inc. 公司首席执行官
第0章 导读 1
0.1 关于本书 1
0.2 读者对象 2
0.3 读者要求 3
0.4 运行环境 4
0.5 本书的结构 4
0.6 如何阅读本书 7
0.7 本书的源码 8
第1章 Nginx入门 9
1.1 关于Nginx 9
1.2 安装Nginx 13
1.3 配置Nginx 19
1.4 总结 30
第2章 Nginx开发准备 31
2.1 开发环境 31
2.2 目录结构 32
2.3 源码特点 34
2.4 使用C++ 35
2.5 C++包装类 38
2.6 总结 40
第3章 Nginx基础设施 41
3.1 头文件 41
3.2 整数类型 42
3.3 错误处理 47
3.4 内存池 50
3.5 字符串 58
3.6 时间与日期 64
3.7 运行日志 70
3.8 总结 74
第4章 Nginx高级数据结构 77
4.1 动态数组 77
4.2 单向链表 83
4.3 双端队列 90
4.4 红黑树 101
4.5 缓冲区 108
4.6 数据块链 113
4.7 键值对 120
4.8 总结 121
第5章 Nginx开发综述 123
5.1 最简单的模块 123
5.2 开发基本流程 131
5.3 编译脚本 134
5.4 总结 137
第6章 Nginx模块体系 139
6.1 模块架构 139
6.2 配置解析 152
6.3 源码分析 168
6.4 C++封装 172
6.5 C++开发模块 180
6.6 总结 187
第7章 Nginx HTTP框架综述 191
7.1 框架简介 191
7.2 处理引擎 198
7.3 过滤引擎 205
7.4 源码分析 211
7.5 C++封装 213
7.6 总结 219
第8章 Nginx HTTP请求处理 221
8.1 状态码 221
8.2 请求结构体 222
8.3 请求行 223
8.4 请求头 225
8.5 请求体 226
8.6 响应头 227
8.7 响应体 229
8.8 源码分析 229
8.9 C++封装 232
8.10 开发handler模块 241
8.11 开发filter模块 246
8.12 总结 253
第9章 Nginx HTTP请求转发 255
9.1 框架简介 255
9.2 请求转发机制 261
9.3 负载均衡机制 266
9.4 源码分析 275
9.5 C++封装 281
9.6 开发upstream模块 288
9.7 开发load-balance模块 294
9.8 总结 299
第10章 Nginx HTTP子请求 301
10.1 子请求简介 301
10.2 子请求运行机制 307
10.3 C++封装 314
10.4 数据回传模块 317
10.5 在模块里使用子请求 323
10.6 总结 328
第11章 Nginx变量 329
11.1 结构定义 329
11.2 运行机制 332
11.3 复杂变量 334
11.4 C++封装 335
11.5 在模块里使用变量 341
11.6 在模块里使用复杂变量 343
11.7 总结 345
第12章 Nginx辅助设施 347
12.1 摘要算法 347
12.2 编码和解码 352
12.3 正则表达式 356
12.4 共享内存 356
12.5 总结 359
第13章 Nginx进程机制 361
13.1 基本系统调用 361
13.2 进程系统调用 362
13.3 信号系统调用 364
13.4 结构定义 365
13.5 全局变量 368
13.6 启动过程 370
13.7 信号处理 377
13.8 单进程模式 379
13.9 多进程模式 382
13.10 总结 390
第14章 Nginx事件机制 393
14.1 基本系统调用 393
14.2 socket系统调用 395
14.3 epoll系统调用 399
14.4 结构定义 403
14.5 定时器 415
14.6 模块体系 419
14.7 全局变量 425
14.8 运行机制 427
14.9 总结 452
第15章 Nginx多线程机制 455
15.1 eventfd系统调用 455
15.2 pthread系统调用 456
15.3 结构定义 457
15.4 事件通知 460
15.5 运行机制 463
15.6 在模块里使用多线程 469
15.7 总结 474
第16章 Nginx Stream机制 477
16.1 模块体系 477
16.2 监听端口 483
16.3 处理引擎 491
16.4 过滤引擎 495
16.5 运行机制 496
16.6 开发stream模块 507
16.7 总结 514
第17章 Nginx HTTP机制 517
17.1 结构定义 517
17.2 初始化连接 519
17.3 执行引擎 528
17.4 处理请求体 534
17.5 发送数据 540
17.6 结束请求 543
17.7 总结 548
第18章 Nginx与设计模式 551
18.1 设计模式简介 551
18.2 框架级别的模式 551
18.3 业务级别的模式 553
18.4 代码级别的模式 554
18.5 总结 556
第19章 OpenResty开发 557
19.1 简介 557
19.2 Lua语言 566
19.3 LuaJIT 577
19.4 Lua模块 581
19.5 功能接口 585
19.6 应用实例 594
19.7 Stream Lua模块 598
19.8 lua-resty库 601
19.9 总结 603
第20章 结束语 605
20.1 本书的遗憾 605
20.2 下一步 605
20.3 临别赠言 606
附录A 推荐书目 607
附录B GDB调试简介 609
附录C Nginx C++模块简介 611
附录D Nginx的字符串格式化 613
附录E nginScript简介 615
缘起
最早接触Nginx大概是在2011年,面对着一个全新的Web服务器,和大多数人一样最初我也是一片茫然,能找到的参考资料十分有限,安装、配置、运行几乎都是“摸着石头过河”,犯过许多低级错误。
随着对Nginx逐渐熟悉,它的高并发处理能力给我留下了深刻的印象,作为一个开源软件的爱好者,很自然地想要探究一下它的内部工作原理。我由此开始了对Nginx源码的钻研之路,中间经过了很多的艰辛曲折,走过不少的弯路。
我最常用的工作语言是C++,所以在阅读Nginx源码时也总以C++的面向对象方式来思考和理解,以对象作为切入点记笔记、画UML:从最简单的ngx_str_t、ngx_array_t入手,然后到ngx_request_t、ngx_upstream_t等复杂的结构,再围绕着这些对象研究相关的功能函数和处理流程,梳理代码逻辑的同时也摸索着使用C++编写Nginx模块的方法,逐渐积累了一些用起来颇为顺手的小工具——当然还是比较初级的形式。
三年多前,我被调到了新的工作岗位,需要重度使用Nginx开发,这让我以前的零散积累终于有了用武之地。那段时间里使用C/C++陆续做了很多东西,也借着机会重新优化了原有的工具代码。
繁忙的工作之余,我有了种进一步整理经验的迫切感,因为只有系统完整地分享这些知识,才能让更多的人基于Nginx二次开发,让Nginx更好地为网络世界服务。
同一时间,市面上也出现了一些Nginx开发相关的资料、书籍,但在我看来却有“粗制滥造”之嫌:行文混乱,“车轱辘话”“口头禅”满天飞,甚至大段照抄指令说明,还有对源码的曲解,未免有点儿“误人子弟”,读起来实在是难受。终于,在“忍无可忍”的心态之下,我动起了写作本书的念头。
经过近一年的努力,现在这本书终于呈现在了读者面前,结构上基本反映了我学习研究Nginx时的心路历程,从最初的“一无所知”起步,逐渐深入到定制开发的层次,希望能与读者“心有戚戚焉”。
Nginx随感
毫无疑问,Nginx是目前这个星球上所能获得的最强劲的Web服务器(没有之一),同时也是目前最成熟、最优秀的TCP/HTTP服务器开发框架。
Nginx资源消耗低,并发处理性能高,配置灵活,能够连接CGI、PHP、MySQL、Memcached等多种后端,还有着出色的负载均衡能力,可以整合封装各种service,构建稳定高效的服务。如今Nginx已经成为了网站架构里不可或缺的关键组件,广泛应用于国内外许多大型IT企业。每一个繁忙的网站背后,可能都有Nginx默默工作的身影。
在Nginx出现之前,使用C/C++开发Web服务器是项比较“痛苦”的工作,虽然有很多网络程序库可以使用(例如asio、libevent、thrift等),但它们通常只关注较底层的基础功能实现,离成熟的“框架”相距甚远,不仅开发过程烦琐低效,而且程序员还必须要处理配置管理、进程间通信、协议解析等许多Web服务之外的其他事情,才能开发出一个较为完善的服务器程序。但即使开发出了这样的服务器,通常性能上也很难得到保证,会受到程序库和开发者水平等因素的限制——很长一段时间里,C/C++在Web服务器领域都没有大展拳脚的机会。
Nginx的横空出世为Web服务器开辟了一个崭新的天地,它搭建了一个高性能的服务器开发框架,而且是一个完整的、全功能的服务器。模块化的架构设计很好地分离了底层支撑模块和上层逻辑模块,底层模块处理了配置、并发等服务器的外围功能,核心支撑模块定义了主体的TCP/HTTP处理框架。开发者可以把大部分精力集中在上层的业务功能实现上,再也不必去为其他杂事而分心,提高了软件的开发效率。
在Nginx框架里,C/C++程序员可以尽情发挥自己的专长,充分利用Nginx无阻塞处理的优势,打造出高质量的Web应用服务器,与其他系统一较高下。
Nginx和C/C++
IgorSysoev选择用C语言(准确地说是ANSIC)来实现Nginx肯定是经过了认真的考虑。
作为与UNIX一同诞生的编程语言,C语言一直是系统级编程的首选。和其他高级语言相比,它简单可靠,更接近计算机底层硬件,运行效率更高。指针更是C语言的一大特色,善用指针能够完成许多其他语言无法完成的工作。
以C语言实现的Nginx没有“虚拟机”的成本,省略了不必要的中间环节,直接操纵计算机硬件,从根本上提高了Web服务器的处理能力。虽然C语言不直接支持面向对象,但Nginx灵活运用了指针,采用结构体+函数指针的形式,达到了同样的效果,从而使软件拥有了良好的结构。
C++是仅次于C的系统级编程语言,在兼容C的同时又增加了类、异常、模板等新特性,还支持面向对象、泛型、函数式、模板元等多种编程范式,可以说是计算机语言里的一个“庞然大物”。C++的特性很多,有的也很好用,但总体上的确比较复杂,易学难精,容易被误用和滥用,导致低效、难维护的代码,我想这可能是IgorSysoev放弃使用C++的一个重要原因。
另一个可能的原因是C语言本身已经非常稳定,几十年来没有太大的变动,在各个系统里都支持得非常好。而C++在1998年才有了第一个标准,并且现在还在发展之中,语言特性还不够稳定(例如export、register等曾经的关键字在C++11里就已经被废弃),许多编译器对C++的支持程度也有差异,这与Nginx的高可移植性目标明显不符。
但C++毕竟还是有很多的优点,类可以更好地封装信息、异常简化了错误处理、模板能够在编译期执行类型计算。在C++11标准颁布之后,C++更是几乎变成了一门“全新”的语言,auto/decltype/nullptr/noexcept等新关键字增强了语言的描述能力,标准库也扩充了相当多的组件,易用性和稳定性都大大提升。
在Nginx里使用C++时要对C++的长处和不足有清醒的认识,避免多层次继承、虚函数等影响效率的编程范式,只使用经过充分验证的、能够切实提高开发效率和性能的语言特性和库,避免华而不实的技术炫耀,尽量做到像Nginx源码那样质朴踏实。只有这样,才能够发挥出1+1>2的作用,让Nginx从C++中得到更进一步的发展动力。
Nginx和OpenResty
多年以前Nginx开发使用的语言只能是C和C++,而现在,越来越多的开发者逐渐转向了OpenResty,使Lua搭建高并发、高性能、高扩展性的WebServer。
我接触OpenResty的时间并不算很长,大约在四年左右。由于C/C++程序员“天生的傲慢”,一开始对OpenResty确实有点儿“抵触情绪”,总觉得脚本程序比不上C/C++实现。然而随着使用的增多,特别是在研究了它的源码之后,我不得不感慨OpenResty的精致、完美和强大,简直是所有Nginx开发者“梦寐以求的至宝”。
由于agentzh对Nginx的运行机制了如指掌,OpenResty的核心部分——ngx_lua一个模块就涵盖了access/rewrite/content/log等多个处理阶段,再搭配上小巧灵活的Lua和高效的LuaJIT,我们就能够在更高级的业务层次上使用“胶水”代码来调用组合Nginx底层功能,轻松开发出丰富Web服务,极大地节约了宝贵的时间和精力。
当然,OpenResty并不只有ngx_lua,围绕着ngx_lua还有众多的库和辅助工具,构成了一个相当完善的生态环境,这些组件相互支撑,利用得当可以更好地提高生产效率。
OpenResty现在正处于蓬勃发展的阶段,今后的OpenResty也许不仅限于Nginx和WebServer,而将成为一个更通用的开发平台,工作语言也不仅限于Lua,可能还会有其他新的语言(例如agentzh正在做的edgelang和fanlang),让我们拭目以待。
致谢
首先当然要感谢Nginx的作者IgorSysoev,没有他就不会有如此优秀的Web服务器,也就不会有本书的诞生。
OpenResty创始人章亦春(agentzh)是一位非常亲切随和的人,在Nginx、DSL、DynamicTracing等领域造诣极高,本书部分章节有幸经他审阅,在此表示最诚挚的谢意。
亲情永远是人生命中最值得珍惜的部分,我要感谢父母多年来的养育之恩和“后勤”工作,感谢妻子在生活中的陪伴,感谢两个可爱的女儿,愿你们能够永远幸福快乐。
最后,我也要感谢读者选择本书,希望读者能够在阅读过程中有所收获,在Nginx开发过程中获得乐趣。
您的朋友罗剑锋
2017年4月28日于北京亚运村
我是一位有着多年经验的系统工程师,我的工作职责往往涉及到对网络基础设施的深度优化和性能调优。Nginx 作为我日常工作中不可或缺的一部分,我一直在寻找能够帮助我深入挖掘其潜力,并将其应用到更复杂场景的书籍。我对那些能够讲解 Nginx 内部工作原理,并提供高级定制化解决方案的书籍尤为看重。 我特别希望这本书能够详细阐述 Nginx 的核心架构设计,包括其事件模型、多进程/多线程的配合方式,以及各个模块之间的通信机制。理解这些底层原理,对于我进行性能瓶颈分析、故障排查,甚至预测潜在的系统问题至关重要。我希望能够从书中学习到如何针对特定的业务需求,对 Nginx 进行深度定制,例如开发自定义模块来处理特定的协议或实现特定的安全策略。 此外,对于 OpenResty 的集成和优化,也是我非常感兴趣的领域。我希望这本书能够深入讲解 OpenResty 如何利用 LuaJIT 的高性能特性,以及如何通过 Lua 脚本来扩展 Nginx 的功能,实现更加灵活和强大的应用。例如,如何利用 OpenResty 构建高性能的 API 网关、如何实现复杂的业务逻辑处理,以及如何进行精细化的流量控制和安全防护。这些内容将极大地丰富我的工具箱,并帮助我应对更加复杂的系统挑战。
评分作为一名经验丰富的软件架构师,我一直在寻找能够帮助我理解和掌握高性能网络服务核心技术的高阶读物。Nginx作为业界广泛使用的 Web 服务器和反向代理,其底层架构和性能优化一直是我的研究重点。我希望能够通过一本详实的著作,深入了解Nginx的内部机制,从而能够设计出更 robust、更 scalable 的系统。 我对这本书的期望是,它能够不仅仅停留在配置和使用层面,而是能够深入到Nginx的各个模块如何协同工作,以及其事件驱动模型是如何实现的。例如,我希望能够学习到Nginx如何处理连接、如何进行请求分发、如何进行缓冲和缓存,以及其内存管理机制等等。这些底层原理的理解,对于进行性能调优、故障排查,以及开发自定义模块都至关重要。 如果这本书能够对Nginx的各个核心模块,如event, http, stream等,进行深入的剖析,并提供其内部数据结构和算法的讲解,那将对我非常有帮助。我尤其关注 Nginx 如何通过事件驱动模型高效处理高并发连接,以及其 Worker 进程和 Master 进程之间的通信机制。了解这些细节,能够让我更好地理解 Nginx 的强大之处,并将其应用到更复杂的架构设计中。
评分作为一名资深的后端开发工程师,我对Nginx的深入了解一直是我职业生涯中一个重要的追求。市面上关于Nginx的书籍不少,但很多都停留在基础配置和常见用法层面,难以满足我对于其底层原理和高级开发的探究。我特别关注那些能够提供实践指导,并深入到代码层面的书籍。 我希望能找到一本能够讲解Nginx如何利用C语言进行扩展的教材。许多时候,我们需要定制一些Nginx不直接提供的功能,例如特殊的负载均衡算法、自定义的请求处理流程,甚至是与第三方系统进行更紧密的集成。这些都需要对Nginx的源码有一定程度的理解,并能够使用C语言进行开发。这本书如果能详细讲解Nginx的模块开发机制,包括如何编写自定义模块、如何处理HTTP请求的各个阶段,以及如何与Nginx主进程进行通信,那对我来说将是巨大的价值。 其次,对于C++在Nginx开发中的应用,我也抱有浓厚的兴趣。虽然Nginx核心是用C编写的,但在某些场景下,C++的强大功能,如面向对象特性、STL库等,可以极大地提升开发效率和代码的可维护性。如果这本书能够探讨如何利用C++来构建Nginx模块,或者如何将C++代码集成到Nginx的现有架构中,例如通过FFI(Foreign Function Interface)或者其他更直接的集成方式,那将是锦上添花。我期待看到书中能够提供清晰的代码示例和详细的解释,帮助我理解C++在Nginx开发中的最佳实践。
评分一直以来,我在工作中都致力于追求更高的性能和更灵活的解决方案,而OpenResty凭借其基于Nginx的强大能力,以及LuaJIT的卓越表现,成为了我重点关注的技术栈。我希望能有一本能够深度剖析OpenResty的图书,不仅仅是介绍其基本的Lua API,更重要的是能够深入到其内部工作原理,以及如何通过Lua和Nginx的深度整合,实现高性能的网络服务。 我期望书中能够详细讲解OpenResty的事件驱动模型,以及LuaJIT是如何与Nginx的事件循环协同工作的。例如,关于协程(coroutines)在OpenResty中的应用,如何使用它们来编写异步非阻塞的代码,以及如何管理并发连接,这些都是我非常感兴趣的方面。此外,对于OpenResty的常用模块,如ngx_lua、ngx_http_api_module等,我希望能够看到其工作机制的详细解析,以及如何根据实际业务需求,对这些模块进行定制和优化。 更重要的是,我希望这本书能提供一些关于如何将OpenResty集成到现有企业级应用中的案例分析。比如,如何利用OpenResty作为API网关,实现流量控制、认证授权、日志记录等功能,或者如何将其部署为高性能的Web服务器,处理海量请求。这些实战性的内容,能够帮助我更好地理解OpenResty的价值,并将其成功应用于实际项目中。
评分我是一名对技术有极强求知欲的初级开发者,最近开始接触到 Web 开发的后端部分,并对 Nginx 产生了浓厚的兴趣。我了解到 Nginx 在现代 Web 应用中扮演着至关重要的角色,但我发现市面上很多关于 Nginx 的资料都比较零散,或者过于偏重某些方面,让我感到难以系统地学习。 我期望能够找到一本能够从零开始,循序渐进地引导我理解 Nginx 的书籍。从最基础的概念,比如什么是 Web 服务器、反向代理,到 Nginx 的安装部署、基本配置,再到更进一步的常用功能,如负载均衡、SSL/TLS 加密、缓存策略等等。我希望这本书能够用清晰易懂的语言,配合大量的图示和代码示例,帮助我快速掌握 Nginx 的核心知识。 尤其重要的是,我希望能在这本书中找到关于如何通过 Nginx 实现一些常见的 Web 应用场景的解决方案。例如,如何配置 Nginx 来部署一个静态网站、如何配置 Nginx 来代理一个动态应用服务器,以及如何为网站添加 HTTPS 支持。这些实操性的指导,能够让我更快地将所学知识应用到实际项目中,从而增强我的学习信心和开发能力。
评分内容丰富,很实用,有帮助,很有深度
评分不错,挺好的,一直在京东上购买。
评分相当的不错,挺好的感觉,物美价廉!
评分还不错。。。。。。。。。。。。。。。。。。。。。。,,,
评分是正品,书的品质没得说,内容也好!
评分买来结合代码看看不定什么时候用到总会方便些
评分Boost 是一个功能强大、构造精巧、跨平台、开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉。Boost 由C++标准委员会部分成员所设立的Boost 社区开发并维护,使用了许多现代C++编程技术,内容涵盖字符串处理、正则表达式、容器与数据结构、并发编程、函数式编程、泛型编程、设计模式实现等许多领域
评分不错,好书,质量正版
评分还可以,内容挺实用
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 book.cndgn.com All Rights Reserved. 新城书站 版权所有