对于C语言,你应该十分熟悉,对于结构体和预处理命令应有深入的理解,不至于见到大量的指针和函数引用就惊慌失措。如果觉得需要补习,就多看看 K&R (C语言的语法书)。
如果你对于HTTP协议已经有了基本概念,那是很有好处的。毕竟你正在">Web服务器上做开发。
你应该熟悉 Ng inx的配置文件。如果不熟悉,也没关系,这里有一些基本理解: Nginx配置文件主要分成四部分:main(全局设置)、server(主机设置)、 upstream(上游服务器设置)和l ocation(URL匹配特定位置后的设置)。每部分包含若干个指令。main部分设置的指令将影响其它所有部分;server部分的指令主要用于指定主机和端口;upst ream的指令用于设置后端服务器; location部分用于匹配网页位置(比如,根目录“/”,“/images”等等)。 Location部分会继承 server部分的指令,而server部分的指令会继承 main部分;upst ream既不继承指令也不会影响其他部分。它有自己的特殊指令,不需要在其他地方的应用。在下面很多地方都会涉及这四个部分,不要忘记哟。
让我们开始吧。
Nginx模块任务委派的主要轮廓
Nginx模块主要有3种角色:
• handlers(处理模块)用于处理HTTP请求,
然后产生输出 • filters(过滤模块) 过滤handler产生的输出 • load-balancers(负载均衡模块)当有多于一台的后端备选服务器时,选择一台转发HTTP请求
模块可以做任何你分配给web服务器的实际工作:当 Ng inx发送文件或者转发请求到其他服务器,有处理模块为其服务;当需要Nginx把输出压缩或者在服务端加一些东西,可以用过滤模块;还有一些 Ng inx的核心模块主要负责管理网络层和应用层协议,以及针对特定应用的一系列模块。Nginx集中式的体系结构让你可以随心所欲地实现一些功能强大的内部单元。
注意:Nginx不像apache,模块不是动态添加的(换句话就是说,所有的模块都要预先编译进Nginx的二进制可执行文件)。
模块是如何被调用的?典型的讲,当服务器启动,每个处理模块都有机会映射到配置文件中定义的特定位置;如果有多个处理模块映射到同一个位置时,只
有一个会“赢”(聪明如你,当然不会让这些冲突产生)。处理模块主要以三种形式返回:正常、错误、或者放弃处理这个请求而让默认处理模块来处理。
如果处理模块把请求反向代理到后端的服务器,就变成另外一类的模块:负载均衡模块。负载均衡模块的配置中有一组后端服务器,当一个HTTP请求过来时,它决定哪台服务器应当获得这个请求。Nginx的负载均衡模块默认采用两种方法:轮转法,它处理请求的方式就像纸牌游戏一样从头到尾分发;IP哈希法,在众多请求的情况下,它确保来自同一个IP的请求会分发到相同的后端服务器。当然还有一些第三方的负载均衡方法,你可以从 这里 找到。
如果处理模块没有产生错误,过滤模块将被调用。过滤模块能映射到每个位置,而且过滤模块是有先后顺序的,它们的执行顺序在编译时决定。过滤模块是经典的“接力链表(CHAIN OF RESPONSIBILITY)”模型:一个过滤模块被调用,完成其工作,然后调用下一个过滤模块,直到最后一个过滤模块。一般来说压缩模块是比较靠后的,不然压缩以后的内容是很难用来读的。最后, Nginx发出回复。
真正 cool的地方是在过滤模块链中,每个过滤模块不会等上一个过滤模块全部完成;它能把前一个过滤模块的输出作为其处理内容;有点像 U nix中的流水线。过滤模块能以buffer(缓冲区)为单位进行操作,这些 buffer一般都是一页(4K)大小,当然你也可以在n ginx.conf文件中进行配置。这意味着,比如模块可以压缩来自后端服务器的回复,然后像流一样的到达客户端,直到整个回复发送完成。
所以总结下上面的内容,一个典型的处理周期是这样的:客户端发送HTTP请求->Nginx根据配置选择一个合适的处理模块->(如果有)负载均衡模块选择一台后端服务器,并负责完成后端的发送接收过程->处理模块进行处理并把输出缓冲放到第一个过滤模块上->第一个过滤模块处理后输出
给第二个过滤模块->然后第二个过滤模块又到第三个->依此类推->最后把回复
发给客户端。
我说“典型”这个词是因为 Ng inx的模块调用是具有很强的定制性的。模块开发者需要花很多精力精确定义模块在何时如何产生作用(我认为是件不容易的事)。模块的调用事实上通过一系列的回调函数来实现,很多很多。名义上来说,你的函数可在以下时段执行某些功能:
•当服务读配置文件之前 •读存在l ocation和 server或其他任何部分的每一个配置指令 •当 Ng inx初始化全局部分的配置时 •当 Ng inx初始化主机部分(比如主机/端口)的配置时 •当 Ng inx将全局部分的配置与主机部分的配置合并的时候 •当 Ng inx初始化位置部分配置的时候 •当 Ng inx将其上层主机配置与位置部分配置合并的时候 •当 Ng inx的主(master)进程开始的时候 •当一个新的工作进程(worker)开始的时候 •当一个工作进程退出的时候 •当主进程退出的时候 •处理请求 •过滤回复的头部 •过滤回复的主体 •选择一台后端服务器 •初始化到后端服务器的请求 •重新初始化到后端的服务器的请求 •处理来自后端服务器的回复 •完成与后端服务器的交互
难以置信,有点应接不暇!有这么多的功能任你处置,而你只需通过多组有用的钩子(由函数指针组成的结构体)和相应的实现函数。现在让我们开始接触一些模块吧。