基本信息

【插图】

编辑推荐
Nginx模块开发领域的里程碑之作,阿里巴巴资深Nginx技术专家多年工作经验结晶
深度还原Nginx设计思想,揭示快速开发简单高效Nginx模块的技巧;透彻解析Nginx架构,拓展开发高性能Web服务器的思路
内容简介
计算机书籍
《深入理解Nginx:模块开发与架构解析》是阿里巴巴资深Nginx技术专家呕心沥血之作,是作者多年的经验结晶,也是目前市场上唯一一本通过还原Nginx设计思想,剖析Nginx架构来帮助读者快速高效开发HTTP模块的图书。
《深入理解Nginx:模块开发与架构解析》首先通过介绍官方Nginx的基本用法和配置规则,帮助读者了解一般Nginx模块的用法,然后重点介绍如何开发HTTP模块(含HTTP过滤模块)来得到定制的Nginx,其中包括开发一个功能复杂的模块所需要了解的各种知识,如Nginx的基础数据结构、配置项的解析、记录日志的工具以及upstream、subrequest的使用方法等。在此基础上,综合Nginx框架代码分析Nginx的架构,介绍其设计理念和技巧,进一步帮助读者自由、有效地开发出功能丰富、性能一流的Nginx模块。
作译者
目录
前 言
第一部分 Nginx能帮我们做什么
第1章 研究Nginx前的准备工作 / 2
1.1 Nginx是什么 / 2
1.2 为什么选择Nginx / 4
1.3 准备工作 / 7
1.3.1 Linux操作系统 / 7
1.3.2 使用Nginx的必备软件 / 7
1.3.3 磁盘目录 / 8
1.3.4 Linux内核参数的优化 / 9
1.3.5 获取Nginx源码 / 11
1.4 编译安装Nginx / 11
1.5 configure详解 / 11
1.5.1 configure的命令参数 / 12
1.5.2 configure执行流程 / 18
1.5.3 configure生成的文件 / 22
1.6 Nginx的命令行控制 / 24
1.7 小结 / 27
第2章 Nginx的配置 / 28
前言
当我试图在产品的关键位置设计一个高性能Web服务器时,我选择使用成熟的Nginx。选择它的理由为:首先,它对服务器性能上的挖掘已经达到了很高水平,它能尽量使不同的硬件(包括网卡、硬盘、不同的CPU核心)并发运行,同时软件中又没有阻塞进程使之睡眠的代码,从性能上来说,它可以挑战任何服务器。其次,完全基于事件驱动的服务器开发效率往往很不理想,它们要处理的事件过于底层化、细节化,这使得各功能模块无法聚焦于业务,最终产品的功能都较为单一,不会有丰富的可选功能。但Nginx却不然,由于它在软件架构上具有优秀的设计,使得Nginx完全由许多简单的模块构成,各模块(特别是HTTP模块)不用介入底层细节,在尽享分阶段、无阻塞的事件驱动架构下,可以专注于业务功能的实现,这样最终为Nginx带来了大量的官方、第三方的功能模块,使得功能同样强大的Nginx在产品核心位置上足以担当重任,经受住海量请求的考验。
当Nginx已有模块提供的功能不能完全实现我的所有业务需求时,我可以在Nginx的后端再搭建一个实现了缺失功能的非Nginx服务器,将Nginx无法实现的请求反向代理到这台服务器上处理。但这样也有一定的弊端,首先增大了处理请求的开销,其次后端服务器的设计仍然制约着总体性能(它依然需要解决Nginx解决过的无阻塞问题,那样才能像Nginx一样高效),这样做仅适用于对性能要求不高的场景。唯有开发一个实现了所需功能的自定义Nginx模块嵌入到Nginx代码中,才能让自己的业务像Nginx一样充分挖掘服务器的硬件资源,及时地响应百万级别的并发TCP连接。
当我在开发Nginx模块之前,试图在市面上找到一本关于Nginx模块开发的书籍(无论是中文还是英文)时却一无所获。我只能找到如何使用Nginx及其已有模块的书籍。为了开发Nginx模块,我只能通过阅读Nginx极度缺少注释的源代码,并分析各种官方Nginx模块来逐步还原其设计思想,反复尝试、验证着怎样的模块能够使用Nginx的基础架构,和丰富的跨平台工具方法,同时符合Nginx设计思想,使Nginx拥有媲美Linux内核的一流效率。这个过程耗费了我很多的精力,因此,我希望今后的Nginx使用者、开发者在遇到同样的问题时,不至于还要很痛苦地阅读源代码来找到模块开发方法,而是简单地按照章节查阅本书,就可以快速找到怎样简单、高效地开发Nginx模块,把精力放在业务的实现上。这是我写这本书的第一个目的。
当我们产品中运行的Nginx出现了问题时,往往是通过找到错误的配置项、使用方式来解决的,这样也的确能够修复大部分问题。但是更深层次的问题,或者是使用场景比较偏僻,抑或是Nginx自身代码考虑得不够全面时,这些问题往往只能由那些花费大量精力研究Nginx源代码的工程师来解决。我写作本书的第二个目的是希望通过透彻地解析Nginx架构,帮助读者深入理解Nginx,既能够正确地使用它,也能在它出现任何问题时找到根本原因,进而用最合适的方法修复或者回避问题。
Nginx是一个优秀的事件驱动框架,虽然它在HTTP的处理上非常出色,但它绝不仅仅用于Web服务器。Nginx非常适合开发在传输层以TCP对外提供服务的服务器程序。基于Nginx框架开发程序有5个优势:
1)Nginx将网络、磁盘及定时器等异步事件的驱动都做了非常好的封装,基于它开发将可以忽略这些事件处理的细节。
2)Nginx封装了许多平台无关的接口、容器,适用于跨平台开发。
3)优秀的模块化设计,使得开发者可以轻易地复用各种已有的模块,其中既包括基本的读取配置、记录日志等模块,也包括处理请求的诸如HTTP、mail等高级功能模块。
4)Nginx是作为服务器来设计其框架的,因此,它在服务器进程的管理上相当出色,基于它开发服务器程序可以轻松地实现程序的动态升级,子进程的监控、管理,配置项的动态修改生效等。
5)Nginx充分考虑到各操作系统所擅长的“绝活”,能够使用特殊的系统调用更高效地完成任务时,绝不会去使用低效的通用接口。尤其对于Linux操作系统,Nginx不遗余力地做了大量优化。
当我们期望编写一款能够以低负载处理高并发请求并且主要处理基于TCP的服务器程序时,推荐选择Nginx,它可能会带给我们意外的惊喜。这本书的第三部分,将通过分析Nginx的内部架构,帮助读者了解怎样基于Nginx开发高效的TCP服务器程序:通过开发一种新的模块类型,实现一种新的功能框架来提供极佳的扩展性,使得功能子模块仅关注于业务的开发,忽视底层事件的处理。这是我写作本书的第三个目的。
除了这3个主要目的外,我还希望通过这本书向大家展示Nginx在服务器开发上的许多巧妙设计,它们或在抽象设计上精妙,或通过操作系统精确、节省地使用硬件资源,这些细节之处的设计都体现了Igor Sysoev的不凡功底。即使我们完全不使用Nginx,学习这些技巧也将有助于我们服务器编程水平的提升。
读者对象
本书适合以下读者阅读。
对Nginx及如何将它搭建成一个高性能的Web服务器感兴趣的读者。
希望通过开发特定的HTTP模块实现高性能Web服务器的读者。
希望了解Nginx的架构设计,学习怎样充分使用服务器上的硬件资源的读者。
了解如何快速定位、修复Nginx中深层次Bug的读者。
希望利用Nginx提供的框架,设计出任何基于TCP的、无阻塞的、易于扩展的服务器的读者。
媒体评论
——郑志昊 腾讯公司副总裁
从耐心帮助读者了解“如何阅读本书”到书中详细的代码解析与注释、大量而精致的各种图表,以及为本书开发的在线支持网站等,无不体现了作者全身心投入本书的写作。更为可贵的是,作者在实际工作中一行行阅读Nginx源代码、不断尝试和探索,耗费了巨大的精力所积累的宝贵经验,无私地和读者分享。这也成就了Nginx这方面的巨作——覆盖了Nginx的安装、配置、模块开发、架构解析和深度应用等各个方面,适合不同层次的读者,并能切实地帮助读者有效地解决Nginx应用中所碰到的困惑与难题。
——朱少民 同济大学软件学院教授
这是国内(或许也是国外)第一本关于Nginx模块开发的书籍。作者有着丰富的Nginx开发和运维经验,其定制的Nginx服务于真实的大并发SaaS应用,因此其作品不是一本泛泛的手册,而是经验教训之心血结晶。这本书的面世,对于致力于打造符合自己应用场景之高性能Web服务器的开发人员来说,无疑是一大福音。
——Grant pan, 思科CRDC Senior Manager
在互联网上,关于如何安装及配置Nginx的文章可谓众多,可惜一直以来却缺少面向开发人员对其架构原理及核心模块进行系统阐述的相关著作。本书面向不同层次的读者,对Nginx的使用、配置、架构原理及模块开发进行了系统而细致的阐述,无论是单纯使用Nginx的系统工程师还是专注于高性能服务器端研发的开发人员,都可以在本书中发现你所需要的内容。向Igor Sysoev致敬!感谢陶辉为我们带来这本很棒的书!
——范昕 思科(美国),Senior Engineer
Nginx是一个功能丰富、插件(模块)众多、性能卓越的Web服务器,业界多把它放在业务的最前端充当静态资源服务器或者反向代理服务器,应用广泛。本书循序渐进地揭开了Nginx的面纱,从如何使用原生的Nginx入手,进而以几个简明的例子为主线说明如何开发http模块,最后再综合介绍Nginx的完整设计思路,帮助读者快速、深入地掌握如何基于Nginx开发出高性能服务器。
——吴峥涛 阿里巴巴云计算公司 架构师
书摘
4)如果handler方法返回除去NGX_DECLINED或者NGX_DONE以外的其他值,则调用ngx_http_finalize_request结束请求,其参数为handler方法的返回值。
可以注意到,ngx_http_core_rewrite_phase方法与ngx_http_core_generic_phase方法有一个显著的不同点:前者永远不会导致跨过同一个HTTP阶段的其他处理方法,就直接跳到下一个阶段来处理请求。原因其实很简单,可能有许多HTTP模块在NGX HTTP SERVERREWRITE_PHASE和NGX_HTTP_REWRITE_PHASE阶段同时处理重写URL这样的业务,HTTP框架认为这两个阶段的HTTP模块是完全平等的,序号靠前的HTTP模块优先级并不会更高,它不能决定序号靠后的HTTP模块是否可以再次重写URL。因此,ngx http corerewrite_phase方法绝对不会把phase_handler直接设置到下一个阶段处理方法的流程中,即不可能存在类似下面的代码。
11.6.3 ngx http core access phase
ngx_http_core_access—phase方法是仅用于NGX_HTTP_ACCESS_PHASE阶段的处理方法,这一阶段用于控制用户发起的请求是否合法,如检测客户端的IP地址是否允许访问。它涉及nginx.conf配置文件中satisfy配置项的参数值,见表11—2。
对于表11—2的any配置项,是通过ngx_http_request_t结构体中的access_code成员来传递handler方法的返回值的,因此,ngx_http_core_access_phase方法会比较复杂,如图11—10所示。
……