Nginx模块开发指南的基础知识

对于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)开始的时候 •当一个工作进程退出的时候 •当主进程退出的时候 •处理请求 •过滤回复的头部 •过滤回复的主体 •选择一台后端服务器 •初始化到后端服务器的请求 •重新初始化到后端的服务器的请求 •处理来自后端服务器的回复 •完成与后端服务器的交互

难以置信,有点应接不暇!有这么多的功能任你处置,而你只需通过多组有用的钩子(由函数指针组成的结构体)和相应的实现函数。现在让我们开始接触一些模块吧。

时间: 2024-09-23 02:57:26

Nginx模块开发指南的基础知识的相关文章

Nginx模块开发入门(转)

  前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并发情况下具有巨大的性能优势. Nginx属于典型的微内核设计,其内核非常简洁和优雅,同时具有非常高的可扩展性.Nginx最初仅仅主要被用于做反向代理,后来随着HTTP核心的成熟和各种HTTP扩展模块的丰富,Nginx越来越多被用来取代Apache而单独承担HTTP Server的责任,例如目前淘

Nginx模块开发入门(转)

前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并发情况下具有巨大的性能优势. Nginx属于典型的微内核设计,其内核非常简洁和优雅,同时具有非常高的可扩展性.Nginx最初仅仅主要被用于做反向代理,后来随着HTTP核心的成熟和各种HTTP扩展模块的丰富,Nginx越来越多被用来取代Apache而单独承担HTTP Server的责任,例如目前淘宝内

Nginx模块开发入门

前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并发情况下具有巨大的性能优势. Nginx属于典型的微内核设计,其内核非常简洁和优雅,同时具有非常高的可扩展性.Nginx最初仅仅主要被用于做反向代理,后来随着HTTP核心的成熟和各种HTTP扩展模块的丰富,Nginx越来越多被用来取代Apache而单独承担HTTP Server的责任,例如目前淘宝内

【J2ME3D系列学习文章之一】J2ME3D开发技术和基础知识

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/j2me-kjava/249.html         由于J2me 3D(jsr184)的文章网上也有了不少,这里就不多说了,只是概括的说下针对于j2me 3D开发基本需要了解的知识以及简单阐述几个术语;  第一:开发模式  :         J2me 3D(jsr184)api 分为两种开发模式,一个是立即模式,另一个就是保留模式.这里简

SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识

原文:SQL点滴17-使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识 在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息,今天把自己工作过程中经常用到的一些数据库引擎存储过程,系统视图等等总结一下以备不时之用.下面的知识多是自己总结,有一些参考了MSDN. sp_help 有时候想尽快查出数据库对象的相关信息,这个存储过程就很有用了.使用它可以查询出整个数据库中所有对象的相关信息.直接运行sp_help结果如下图1,

医学影像开发软件-医学影像开发需要哪些基础知识,需要哪些开发工具

问题描述 医学影像开发需要哪些基础知识,需要哪些开发工具 因为是新接触的医学影像开发,不知道该从哪里着手开始学习,需要哪些基础知识,需要哪些开发软件,哪种开发软件比较好用 解决方案 我也刚接触,之前师兄在用sql,我用的oracle,开发工具建议你用C#.

《React Native移动开发实战》一一2.1 开发具备的基础知识说明

2.1 开发具备的基础知识说明 日常生活中,人们越来越离不开的就是网购,因此,本书就以典型的电商类移动应用为例,向读者展示使用React Native设计.开发应用的全过程. 不过,在正式开发电商类移动应用之前,有必要先了解一些React Native开发的基础知识. 提示:本书面向对JavaScript有一定了解的读者,所以JavaScript相关知识本书不做深入解释,想要了解更多JavaScript知识,请读者参考相关书籍和教程. React Native开发中需要具备的基础知识如下. Gi

JavaScript的函数式编程基础指南_基础知识

引言 JavaScript是一种强大的,却被误解的编程语言.一些人喜欢说它是一个面向对象的编程语言,或者它是一个函数式编程语言.另外一些人喜欢说,它不是一个面向对象的编程语言,或者它不是一个函数式编程语言.还有人认为它兼具面向对象语言和函数式语言的特点,或者,认为它既不是面向对象的也不是函数式的,好吧,让我们先搁置那些争论. 让我们假设我们共有这样的一个使命:在JavaScript语言所允许的范围内,尽可能多的使用函数式编程的原则来编写程序. 首先,我们需要清理下脑子里那些关于函数式编程的错误观

JavaScript中的prototype原型学习指南_基础知识

原型是什么 Function 类型有一个属性 prototype,直接翻译过来就是原型.这个属性就是一个指针,指向一个对象,这个对象包含一些属性和方法,这些属性和方法会被当前函数生成的所有实例(对象)所共享. 这句话根据前面所说的,细细琢磨下来,就可以得到下面代码: function Person(){ ... } Person.prototype = { country : 'china', sayName : function(){ ... } } 先创建了一个 Function 类型的实例