新書推薦:
《
养育女孩 : 官方升级版
》
售價:HK$
51.8
《
跨界:蒂利希思想研究
》
售價:HK$
109.8
《
千万别喝南瓜汤(遵守规则绘本)
》
售價:HK$
45.9
《
大模型启示录
》
售價:HK$
115.0
《
东法西渐:19世纪前西方对中国法的记述与评价
》
售價:HK$
207.0
《
养育男孩:官方升级版
》
售價:HK$
51.8
《
小原流花道技法教程
》
售價:HK$
112.7
《
少女映像室 唯美人像摄影从入门到实战
》
售價:HK$
113.9
|
編輯推薦: |
资深技术专家Nginx 源码研习书强势升级!
深入新版Nginx 源码(Stable 1.12.0)!
详细剖析Nginx 核心运行机制!
便捷、轻松地开发和定制Nginx!
|
內容簡介: |
Nginx 是著名的Web 服务器,性能优异,运行效率远超传统的Apache、Tomcat,广泛应用于国内外诸多*互联网公司。Nginx 的一个突出特点是其灵活优秀的模块化架构,可以在不修改核心的前提下增加任意功能,自2004 年发布至今,已经拥有百余个官方及非官方的功能模块(如proxy、mysql、redis、rtmp、lua等),使得Nginx 成长为了一个近乎“全能”的服务器软件。Nginx 功能强大,架构复杂,学习、维护和开发的门槛较高。为了帮助读者跨越这一障碍,本书深入*的Nginx 源码(Stable 1.12.0),详细剖析了模块体系、动态插件、功能框架、进程模型、事件驱动、线程池、TCPUDPHTTP 处理等Nginx 核心运行机制,在此基础上讲解如何使用C、C++、Lua、nginScript 等语言来增强扩展Nginx,让任何人都能够便捷、轻松地开发和定制Nginx,进而应用到自己的实际工作中,创造出更多的价值。本书结构严谨、脉络清晰、论述精确、详略得当、图文并茂,值得广大软件开发工程师、系统运维工程师和编程爱好者拥有。
|
關於作者: |
罗剑锋(网名Chrono)1996年就读于东北财经大学;1997年开始接触CC++;1998年参加计算机软件专业技术资格和水平考试,获高级程序员资质;2003年毕业于北京理工大学,获计算机专业硕士学位。主要研究方向为CC++、设计模式、高性能网络服务器开发,业余爱好是阅读、欣赏音乐和旅游。
|
目錄:
|
第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.1.1 历史 .................................................. 10
1.1.2 特点 .................................................. 10
1.1.3 进程模型 .......................................... 11
1.1.4 版本 .................................................. 12
1.2 安装Nginx .......................................... 13
1.2.1 准备工作 .......................................... 13
1.2.2 快速安装 .......................................... 14
1.2.3 运行命令 .......................................... 14
1.2.4 验证安装 .......................................... 16
1.2.5 定制安装 .......................................... 16
1.3 配置Nginx .......................................... 19
1.3.1 配置文件格式 .................................. 19
1.3.2 进程配置.......................................... 20
1.3.3 动态模块配置 .................................. 22
1.3.4 运行日志配置 .................................. 22
1.3.5 events 配置 ...................................... 23
1.3.6 http 配置 .......................................... 23
1.3.7 server 配置 ....................................... 25
1.3.8 location 配置 .................................... 26
1.3.9 file 配置 ........................................... 27
1.3.10 upstream 配置 ................................ 27
1.3.11 变量 ................................................ 28
1.4 总结 ..................................................... 30
第2 章 Nginx 开发准备 ........................ 31
2.1 开发环境 ............................................. 31
2.1.1 C标准 .......................................... 31
2.1.2 Boost 程序库 ................................... 32
2.2 目录结构 ............................................. 32
2.3 源码特点 ............................................. 34
2.3.1 代码风格.......................................... 34
2.3.2 代码优化.......................................... 34
2.3.3 面向对象思想 .................................. 34
2.4 使用C ............................................. 35
2.4.1 实现原则.......................................... 35
2.4.2 代码风格 .......................................... 36
2.4.3 编译脚本 .......................................... 36
2.5 C包装类 .......................................... 38
2.5.1 类定义 .............................................. 38
2.5.2 构造和析构 ...................................... 39
2.5.3 成员函数 .......................................... 40
2.6 总结 ..................................................... 40
第3 章 Nginx 基础设施 ......................... 41
3.1 头文件 ................................................. 41
3.1.1 Nginx 头文件 ................................... 41
3.1.2 C头文件 ....................................... 42
3.2 整数类型 ............................................. 42
3.2.1 标准整数类型 .................................. 43
3.2.2 自定义整数类型 .............................. 43
3.2.3 无效值 .............................................. 44
3.2.4 C封装 ........................................... 44
3.3 错误处理 ............................................. 47
3.3.1 错误码定义 ...................................... 48
3.3.2 C异常 ........................................... 48
3.4 内存池 ................................................. 50
3.4.1 结构定义 .......................................... 51
3.4.2 操作函数 .......................................... 51
3.4.3 C封装 ........................................... 52
3.4.4 清理机制 .......................................... 54
3.4.5 C内存分配器 ............................... 57
3.5 字符串 ................................................. 58
3.5.1 结构定义 .......................................... 59
3.5.2 操作函数 .......................................... 59
3.5.3 C封装 ........................................... 61
3.6 时间与日期 ......................................... 64
3.6.1 时间结构定义 .................................. 64
3.6.2 时间操作函数 .................................. 64
3.6.3 日期结构定义 .................................. 65
3.6.4 日期操作函数 .................................. 66
3.6.5 C封装时间 .................................. 67
3.6.6 C封装日期 .................................. 68
3.7 运行日志 ............................................. 70
3.7.1 结构定义.......................................... 71
3.7.2 操作函数.......................................... 71
3.7.3 C封装 .......................................... 72
3.8 总结 ..................................................... 74
第4 章 Nginx 高级数据结构 ................. 77
4.1 动态数组 ............................................. 77
4.1.1 结构定义.......................................... 77
4.1.2 操作函数.......................................... 79
4.1.3 C动态数组 .................................. 79
4.2 单向链表 ............................................. 83
4.2.1 结构定义.......................................... 83
4.2.2 操作函数.......................................... 84
4.2.3 C迭代器 ...................................... 85
4.2.4 C单向链表 .................................. 87
4.3 双端队列 ............................................. 90
4.3.1 结构定义.......................................... 90
4.3.2 操作函数.......................................... 91
4.3.3 C节点 .......................................... 93
4.3.4 C迭代器 ...................................... 95
4.3.5 C双端队列 .................................. 97
4.4 红黑树 ............................................... 101
4.4.1 节点结构定义 ................................ 101
4.4.2 树结构定义 .................................... 102
4.4.3 操作函数........................................ 103
4.4.4 C红黑树 .................................... 104
4.5 缓冲区 ............................................... 108
4.5.1 结构定义........................................ 108
4.5.2 操作函数........................................ 110
4.5.3 C缓冲区 .................................... 111
4.6 数据块链 ........................................... 113
4.6.1 结构定义 ........................................ 114
4.6.2 操作函数 ........................................ 114
4.6.3 C节点 ......................................... 115
4.6.4 C迭代器 ..................................... 117
4.6.5 C数据块链 ................................. 118
4.7 键值对 ............................................... 120
4.7.1 简单键值对 .................................... 120
4.7.2 散列表键值对 ................................ 121
4.8 总结 ................................................... 121
第5 章 Nginx 开发综述 ....................... 123
5.1 最简单的模块 ................................... 123
5.1.1 模块设计 ........................................ 124
5.1.2 配置解析 ........................................ 124
5.1.3 处理函数 ........................................ 126
5.1.4 模块集成 ........................................ 128
5.1.5 编译脚本和命令 ............................ 129
5.1.6 测试验证 ............
|
內容試閱:
|
前言
缘起
最早接触Nginx 大概是在2011 年,面对着一个全新的Web 服务器,和大多数人一样最初我也是一片茫然,能找到的参考资料十分有限,安装、配置、运行几乎都是摸着石头过河,犯过许多低级错误。
随着对Nginx 逐渐熟悉,它的高并发处理能力给我留下了深刻的印象,作为一个开源软件的爱好者,很自然地想要探究一下它的内部工作原理。我由此开始了对Nginx 源码的钻研之路,中间经过了很多的艰辛曲折,走过不少的弯路。
我最常用的工作语言是C,所以在阅读Nginx 源码时也总以C的面向对象方式来思考和理解,以对象作为切入点记笔记、画UML:从最简单的ngx_str_t、ngx_array_t 入手,然后到ngx_request_t、ngx_upstream_t 等复杂的结构,再围绕着这些对象研究相关的功能函数和处理流程,梳理代码逻辑的同时也摸索着使用C编写Nginx 模块的方法,逐渐积累了一些用起来颇为顺手的小工具当然还是比较初级的形式。
三年多前,我被调到了新的工作岗位,需要重度使用Nginx 开发,这让我以前的零散积累终于有了用武之地。那段时间里使用CC陆续做了很多东西,也借着机会重新优化了原有的工具代码。
繁忙的工作之余,我有了种进一步整理经验的迫切感,因为只有系统完整地分享这些知识,才能让更多的人基于Nginx 二次开发,让Nginx 更好地为网络世界服务。
同一时间,市面上也出现了一些Nginx 开发相关的资料、书籍,但在我看来却有粗制滥造之嫌:行文混乱,车轱辘话、口头禅满天飞,甚至大段照抄指令说明,还有对源码的曲解,未免有点儿误人子弟,读起来实在是难受。终于,在忍无可忍的心态之下,我动起了写作本书的念头。
经过近一年的努力,现在这本书终于呈现在了读者面前,结构上基本反映了我学习研究Nginx 时的心路历程,从最初的一无所知起步,逐渐深入到定制开发的层次,希望能与读者心有戚戚焉。
Nginx 随感
毫无疑问,Nginx 是目前这个星球上所能获得的最强劲的Web 服务器(没有之一),同时也是目前最成熟、最优秀的TCPHTTP 服务器开发框架。
Nginx 资源消耗低,并发处理性能高,配置灵活,能够连接CGI、PHP、MySQL、Memcached等多种后端,还有着出色的负载均衡能力,可以整合封装各种service,构建稳定高效的服务。如今Nginx 已经成为了网站架构里不可或缺的关键组件,广泛应用于国内外许多大型IT企业。每一个繁忙的网站背后,可能都有Nginx 默默工作的身影。
在Nginx 出现之前,使用CC开发Web 服务器是项比较痛苦的工作,虽然有很多网络程序库可以使用(例如asio、libevent、thrift 等),但它们通常只关注较底层的基础功能实现,离成熟的框架相距甚远,不仅开发过程烦琐低效,而且程序员还必须要处理配置管理、进程间通信、协议解析等许多Web 服务之外的其他事情,才能开发出一个较为完善的服务器程序。但即使开发出了这样的服务器,通常性能上也很难得到保证,会受到程序库和开发者水平等因素的限制很长一段时间里,CC在Web 服务器领域都没有大展拳脚的机会。
Nginx 的横空出世为Web 服务器开辟了一个崭新的天地,它搭建了一个高性能的服务器开发框架,而且是一个完整的、全功能的服务器。模块化的架构设计很好地分离了底层支撑模块和上层逻辑模块,底层模块处理了配置、并发等服务器的外围功能,核心支撑模块定义了主体的TCPHTTP 处理框架。开发者可以把大部分精力集中在上层的业务功能实现上,再也不必去为其他杂事而分心,提高了软件的开发效率。
在Nginx 框架里,CC程序员可以尽情发挥自己的专长,充分利用Nginx 无阻塞处理的优势,打造出高质量的Web 应用服务器,与其他系统一较高下。
Nginx 和CC
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 等曾经的关键字在C11 里就已经被废弃),许多编译器对C的支持程度也有差异,这与Nginx 的高可移植性目标明显不符。
但C毕竟还是有很多的优点,类可以更好地封装信息、异常简化了错误处理、模板能够在编译期执行类型计算。在C11 标准颁布之后,C更是几乎变成了一门全新的语言,autodecltypenullptrnoexcept 等新关键字增强了语言的描述能力,标准库也扩充了相当多的组件,易用性和稳定性都大大提升。
在Nginx 里使用C时要对C的长处和不足有清醒的认识,避免多层次继承、虚函数等影响效率的编程范式,只使用经过充分验证的、能够切实提高开发效率和性能的语言特性和库,避免华而不实的技术炫耀,尽量做到像Nginx 源码那样质朴踏实。只有这样,才能够发挥出1 1>2 的作用,让Nginx 从C中得到更进一步的发展动力。
Nginx 和OpenResty
多年以前Nginx 开发使用的语言只能是C 和C,而现在,越来越多的开发者逐渐转向了OpenResty,使Lua 搭建高并发、高性能、高扩展性的Web Server。
我接触OpenResty 的时间并不算很长,大约在四年左右。由于CC程序员天生的傲慢,一开始对OpenResty 确实有点儿抵触情绪,总觉得脚本程序比不上CC实现。然而随着使用的增多,特别是在研究了它的源码之后,我不得不感慨OpenResty 的精致、完美和强大,简直是所有Nginx 开发者梦寐以求的至宝。
由于agentzh 对Nginx 的运行机制了如指掌,OpenResty 的核心部分ngx_lua一个模块就涵盖了accessrewritecontentlog 等多个处理阶段,再搭配上小巧灵活的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 日 于 北京 亚运村
|
|