Nginx完全开发指南:使用C、C++和OpenResty
  • 推荐0
  • 收藏7
  • 浏览2.6K

Nginx完全开发指南:使用C、C++和OpenResty

罗剑锋 (作者) 

  • 书  号:978-7-121-31457-5
  • 出版日期:2017-06-01
  • 页  数:632
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 维护人:孙学瑛
电子书 ¥59.00
购买电子书
纸质版 ¥99.00
Nginx是著名的Web服务器,性能优异,运行效率远超传统的Apache、Tomcat,广泛应用于国内外诸多顶级互联网公司。
Nginx的一个突出特点是其灵活优秀的模块化架构,可以在不修改核心的前提下增加任意功能,自2004年发布至今,已经拥有百余个官方及非官方的功能模块(如proxy、mysql、redis、rtmp、lua等),使得Nginx成长为了一个近乎“全能”的服务器软件。
Nginx功能强大,架构复杂,学习、维护和开发的门槛较高。为了帮助读者跨越这一障碍,《Nginx完全开发指南:使用C、C++和OpenResty》深入最新的Nginx源码(Stable 1.12.0),详细剖析了模块体系、动态插件、功能框架、进程模型、事件驱动、线程池、TCP/UDP/HTTP处理等Nginx核心运行机制,在此基础上讲解如何使用C、C++、Lua、nginScript等语言来增强扩展Nginx,让任何人都能够便捷、轻松地开发和定制Nginx,进而应用到自己的实际工作中,创造出更多的价值。
《Nginx完全开发指南:使用C、C++和OpenResty》结构严谨、脉络清晰、论述精确、详略得当、图文并茂,值得广大软件开发工程师、系统运维工程师和编程爱好者拥有。
现在市面上的nginx书籍大多数流于表面,主要讲述nginx的安装、配置、维护等浅层次知识,内容雷同的很多。本书特点之一是深入nginx源码内部,专注讲解开发实现nginx模块,技术含量高,特点之二是使用C++和Lua语言,这是目前市场上的空白,尚无任何书籍讲解使用C++、Lua来开发nginx。
罗剑锋(网名Chrono)1996年就读于东北财经大学;1997年开始接触C/C++;1998年参加计算机软件专业技术资格和水平考试,获高级程序员资质;2003年毕业于北京理工大学,获计算机专业硕士学位。主要研究方向为C/C++、设计模式、高性能网络服务器开发,业余爱好是阅读、旅游、欣赏音乐和电影。
缘起
最早接触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++
Igor Sysoev选择用C语言(准确地说是ANSI C)来实现Nginx肯定是经过了认真的考虑。
作为与UNIX一同诞生的编程语言,C语言一直是系统级编程的首选。和其他高级语言相比,它简单可靠,更接近计算机底层硬件,运行效率更高。指针更是C语言的一大特色,善用指针能够完成许多其他语言无法完成的工作。
以C语言实现的Nginx没有“虚拟机”的成本,省略了不必要的中间环节,直接操纵计算机硬件,从根本上提高了Web服务器的处理能力。虽然C语言不直接支持面向对象,但Nginx灵活运用了指针,采用结构体+函数指针的形式,达到了同样的效果,从而使软件拥有了良好的结构。
C++是仅次于C的系统级编程语言,在兼容C的同时又增加了类、异常、模板等新特性,还支持面向对象、泛型、函数式、模板元等多种编程范式,可以说是计算机语言里的一个“庞然大物”。C++的特性很多,有的也很好用,但总体上的确比较复杂,易学难精,容易被误用和滥用,导致低效、难维护的代码,我想这可能是Igor Sysoev放弃使用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搭建高并发、高性能、高扩展性的Web Server。
我接触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和Web Server,而将成为一个更通用的开发平台,工作语言也不仅限于Lua,可能还会有其他新的语言(例如agentzh正在做的edgelang和fanlang),让我们拭目以待。
致谢
首先当然要感谢Nginx的作者Igor Sysoev,没有他就不会有如此优秀的Web服务器,也就不会有本书的诞生。
OpenResty创始人章亦春(agentzh)是一位非常亲切随和的人,在Nginx、DSL、Dynamic Tracing等领域造诣极高,本书部分章节有幸经他审阅,在此表示最诚挚的谢意。
亲情永远是人生命中最值得珍惜的部分,我要感谢父母多年来的养育之恩和“后勤”工作,感谢妻子在生活中的陪伴,感谢两个可爱的女儿,愿你们能够永远幸福快乐。
最后,我也要感谢读者选择本书,希望读者能够在阅读过程中有所收获,在Nginx开发过程中获得乐趣。
您的朋友 罗剑锋
2017年4月28日于北京亚运村

目录

第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

读者评论

电子书版本

  • Epub

相关图书

Terraform:多云、混合云环境下实现基础设施即代码(第2版)

Yevgeniy Brikman ( (作者) 白宇 (译者)

Terraform工具已经成为DevOps领域的关键角色。在各种云平台和虚拟化环境(如AWS、Goolge Cloud、Azure等)中,可以对基础设施即代码(...

¥108.00

DevOps安全:云安全服务

Julien Vehent (作者) 覃宇 (译者)

本书主要介绍了 DevOps 实践中最容易被忽视的一环——安全,并且对云原生服务的安全保障也做了全面的阐述。书中详细介绍了 Web 攻击防范、权限验证、日志监控...

¥108.00

企业级DevOps技术与工具实战

刘淼 张笑梅 (作者)

本书包含DevOps理论的介绍,深入浅出地解析了DevOps体系所包括的Agile/Lean/ITSM/TPS各种方法的精粹和脉络,为DevOps爱好者提供了较...

 

SRE生存指南:系统中断响应与正常运行时间最大化

Nat Welch (作者) 冯文辉 冯文辉 (译者)

站点可靠性工程(Site Reliability Engineering,简称SRE)是一个令人兴奋的新兴领域,它专注于如何确保系统稳定、可靠地运行。本书基于一...

 

Zabbix企业级分布式监控系统(第2版)

吴兆松 (作者)

本书基于稳定版本Zabbix 4.0,对Zabbix的各项功能进行了详细而深入的讲解,包括监控系统规划、安装包定制、架构高可用、性能调优、指标数据采集、自动化处...

 

Nginx实战:基于Lua语言的配置、开发与架构详解

王力 王力 (作者)

本书主要讲解了Nginx在反向代理和应用开发中的作用,阅读本书可以了解Nginx在互联网开发中扮演的多个角色,充分利用这些角色的各项功能有助于提升服务的整体性能...

¥47.40