龙空技术网

Nginx模块开发概述

坏坏大百利 119

前言:

此刻朋友们对“nginx合并文件”大概比较关怀,看官们都需要知道一些“nginx合并文件”的相关知识。那么小编同时在网摘上搜集了一些关于“nginx合并文件””的相关内容,希望大家能喜欢,咱们一起来学习一下吧!

这里是纯粹的IT知识分享频道,关注知识,创造价值。

本期内容让你知道NGINX模块的基本框架、以及编写模块前你应该准备的一些知识。

想必大家都看过电影蝙蝠侠,回想并理解漫画人物蝙蝠侠有助于理解Nginx的模块角色。蝙蝠侠很快,Nginx 很快;蝙蝠侠打击犯罪,Nginx与浪费的 CPU 周期和内存泄漏作斗争。蝙蝠侠在压力下表现出色。 就 Nginx 而言,它在服务器负载很重的情况下表现出色。但如果没有蝙蝠侠实用腰带,蝙蝠侠几乎什么都不是。

在任何时候,蝙蝠侠的实用腰带都可能包含一个开锁器、几个蝙蝠镖、蝙蝠袖口、一个蝙蝠示踪剂、蝙蝠飞镖、夜视镜、铝热剂手榴弹、烟雾弹、一个手电筒、一个氪石环、一个乙炔手电筒 , 或 Apple iPhone。

当蝙蝠侠需要镇静、失明、震耳欲聋、昏迷、追踪、停止、熄灭敌人或给敌人发短信时,你最好相信他正在伸手去拿他的蝙蝠腰带。腰带对蝙蝠侠的行动至关重要,如果让蝙蝠侠在穿裤子和系实用腰带之间做出选择,他肯定会选择腰带。事实上,他确实选择了实用腰带,这就是蝙蝠侠穿橡胶紧身裤而不是裤子的原因。:^(

Nginx 没有实用工具带,而是有一个模块链。当 Nginx 需要对响应进行 gzip 或块编码时,它会抽出一个模块来完成工作。当 Nginx 根据 IP 地址或 HTTP 身份验证凭据阻止对资源的访问时,模块会进行偏转。当 Nginx 与 Memcache 或 FastCGI 服务器通信时,一个模块就是对讲机。蝙蝠侠的实用腰带上挂着很多打冰球,但蝙蝠侠偶尔需要一个新工具。

也许有一个新的敌人,蝙蝠袖口和蝙蝠镖对它无效。 或者蝙蝠侠需要一种新的能力,比如能够在水下呼吸。就在那时,蝙蝠侠打电话给卢修斯·福克斯来设计合适的蝙蝠小工具。

文章的最终目的是教你 Nginx 模块链的细节,让你像 Lucius Fox 一样。 当你完成本指南后,你将能够设计和生产高质量的模块,使 Nginx 能够做它以前做不到的事情。Nginx 的模块系统有很多细微差别和细节,所以你可能想经常回顾这篇文档。我试图让概念尽可能清晰,但我会直言不讳,编写 Nginx 模块仍然是一项艰巨的工作。但是谁说制作蝙蝠工具很容易呢?

0. 先决条件

a)您应该熟悉 C。不仅仅是“C 语法”;

b)您应该了解结构的使用方式,不要被指针和函数引用吓跑,并了解预处理器。

c)对 HTTP 的基本了解很有用。 毕竟,您将在 Web 服务器上工作。

d)您还应该熟悉 Nginx 的配置文件。如果你不是对配置熟悉,这里是它的要点:有四种上下文(称为 main、server、upstream 和 location)可以包含带有一个或多个参数的指令。

主要上下文中的指令适用于所有内容;服务器上下文中的指令适用于特定的主机/端口; 上游上下文中的指令指的是一组后端服务器; 位置上下文中的指令仅适用于匹配的 Web 位置(例如,“/”、“/images”等)位置上下文继承自周围的服务器上下文,服务器上下文继承自主上下文。上游上下文既不继承也不赋予它的属性;它有自己的特殊指令,这些指令并不真正适用于其他地方。我会多次提到这四种情况,所以……不要忘记它们。让我们开始吧。

1.Nginx 模块高级概述

Nginx 模块具有我们将介绍的三个角色:处理程序(handlers)处理请求并产生输出;过滤器(filters)操纵处理程序产生的输出;当多个后端服务器符合条件时,负载均衡器(load-balancers)选择一个后端服务器来发送请求;

模块完成所有可能与 Web 服务器关联的“实际工作”:每当 Nginx 提供文件或将请求代理到另一台服务器时,都会有一个处理程序模块执行工作;当 Nginx 压缩输出或执行服务器端包含时,它使用过滤器模块。Nginx 的“核心”只负责处理所有网络和应用程序协议,并设置有资格处理请求的模块序列。这种分散式架构使您可以制作一个漂亮的独立单元来做您想要的事情。

注意:与 Apache 中的模块不同,Nginx 模块不是动态链接的。 (换句话说,它们被直接编译到 Nginx 二进制文件中。)

如何调用模块?通常,在服务器启动时,每个处理程序都有机会将自己附加到配置中定义的特定位置;如果多个处理程序附加到特定位置,则只有一个将“获胜”。处理程序可以通过三种方式返回:一切正常,出现错误,或者它可以拒绝处理请求并推迟到默认处理程序(通常是提供静态文件的东西)。如果处理程序(handler)恰好是一组后端服务器的反向代理,则可以使用另一种类型的模块:负载平衡器(load-balancer)。负载均衡器接受一个请求和一组后端服务器,并决定哪个服务器将获得该请求。Nginx附带两个负载平衡模块:循环法(round-robin)模块,它在扑克游戏开始时像处理纸牌一样轮询处理请求;哈希(IP-Hash)模块,它确保特定客户端将的多个请求可以访问同一后端服务器;

如果处理程序(Handler)没有产生错误,则调用过滤器(Filter)。多个过滤器可以挂接到每个位置,以便(例如)可以压缩(zip)响应,然后对它进行分块(chunk),它们的执行顺序在编译时已经确定。过滤器具有经典的“责任链”设计模式:一个过滤器被调用,完成它的工作,然后调用下一个过滤器,直到最后一个过滤器被调用,Nginx 完成响应。过滤器链最酷的部分是每个过滤器都不会等待前一个过滤器完成;它可以在生成前一个过滤器的输出时对其进行处理,有点像 Unix 管道。过滤器在缓冲区上运行,通常是页面大小 (4K),尽管您可以在 nginx.conf 中更改它。这意味着,例如,模块可以开始压缩来自后端服务器的响应,并在模块收到来自后端的整个响应之前将其流式传输到客户端。因此,为了总结概念性概述,典型的处理周期如下:

1.1.客户端发送HTTP请求

1.2.Nginx根据location config选择合适的handler进行处理

1.3.(如果适用)负载均衡器选择后端服务器

1.4.处理程序(Handler)做它的事情并将每个输出缓冲区传递给第一个过滤器

1.5.第一个过滤器将输出传递给第二个过滤器

1.6.第二个过滤器将输出传递给第三个过滤器

1.7.等等

1.8.发送给客户的最终回复

通常,模块调用是不是固定不变化的,我说“通常”是因为 Nginx 的模块调用是高度可定制的。

它给模块编写者带来了很大的负担来准确定义模块应该如何以及何时运行。 调用其实是通过一系列的回调来进行的,而且有很多。

即,您可以在以下执行流程中,提供要执行的回调函数:

a)在服务器读取配置文件之前

b)位置和服务器的每个配置指令;

c)Nginx初始化主配置时

d)当 Nginx 初始化服务器(即主机/端口)配置时

e)当 Nginx 将服务器配置与主配置合并时

f)Nginx初始化location配置时

g)当 Nginx 将位置配置与其父服务器配置合并时

h)当 Nginx 的 master 进程启动时

i)当一个新的工作进程(worker)启动时

j)当工作进程(worker)退出时

k)当master进程退出时

l)处理请求

m)过滤响应头

n)过滤响应体

o)选择后端服务器

p)向后端服务器发起请求

q)重新向后端服务器发起请求

r)处理来自后端服务器的响应

s)完成与后端服务器的交互

这有点让人不知所措。 您确实拥有大量的权力供您使用,但您仍然可以仅使用其中的几个钩子和几个相应的函数来做一些有用的事情。

Okay,感谢你的阅读,恭喜你。想必您已经基本知道了NGINX的模块的基本框架了,时间关系,关于NGINX模块的其他的方面的内容,后续慢慢介绍。

你的关注和阅读将会成为原创的动力。Please,Stay tuned.

标签: #nginx合并文件