WEB服务器

推荐列表 站点导航

当前位置:首页 > 服务器技术 > WEB服务器 >

Nginx的模块开发指南(2)

来源:互联网  作者:网友投稿  发布时间:2021-01-05 00:56
data是我们有用的信息,关于此客户端连接的结构。pc将有我们要连接到的服务器的信息。负载平衡功能的工作是填写pc-sockaddr、 pc-socklen,和pc-name值。如果...

data是我们有用的信息,关于此客户端连接的结构。pc将有我们要连接到的服务器的信息。负载平衡功能的工作是填写pc->sockaddr、 pc->socklen,和pc->name值。如果你知道一些网络编程,那么这些变量的名称可能是熟悉;但他们实际上不到手头的任务非常重要。我们不介意他们的代表;我们只是想要知道在哪里可以找到适当的值来填充。

此函数必须找到可用服务器的列表,选择一个行业,并将它的值分配给pc。让我们看看 upstream_hash 如何它。

upstream_hash 以前藏服务器列表到回中调用ngx_http_upstream_init_hash (以上) 的ngx_http_upstream_hash_peer_data_t结构。此结构现已作为data:

ngx_http_upstream_hash_peer_data_t *uhpd = data;

同行的列表现在存储在uhpd->peers->peer。让我们计算出来的散列值除以服务器数目选取同行从这个数组 ︰

ngx_peer_addr_t *peer = &uhpd->peers->peer[uhpd->hash % uhpd->peers->number];

结尾:

pc->sockaddr = peer->sockaddr; pc->socklen = peer->socklen; pc->name = &peer->name; return NGX_OK;

这就完了,如果负载平衡器返回NGX_OK,这意味着,”下去,试此服务器”。如果它返回NGX_BUSY,它意味着所有后端主机不可用,和 Nginx 应该再试一次。
……,但怎么做我们跟踪的不可用的是什么?我们不想再试一次吗?

5.6.同行释放函数

同行释放函数操作后上游连接发生;其目的是跟踪失败。这里是它的函数原型 ︰

void ngx_http_upstream_free_<module name>_peer(ngx_peer_connection_t *pc, void *data, ngx_uint_t state);

前两个参数都一样正如我们看到在负载平衡器的作用。第三个参数是一个state变量,指示连接是否成功。它可能包含按位或会在一起的两个值 ︰ NGX_PEER_FAILED (连接失败) 和NGX_PEER_NEXT (无论是连接失败,或它成功,但应用程序返回了一个错误)。零表示连接成功了。

它是模块的作者来决定如何处理这些失败事件。如果他们在所有使用,结果应该存储在data,自定义的每个请求的数据结构的指针。

但同行释放功能的关键目的是设置pc->tries为零如果你不想 Nginx 在此请求过程中不断尝试此负载平衡器。最简单的同行释放函数将如下所示 ︰

pc->tries = 0;

这将确保,如果有任何错误到达后端服务器,502 不良代理错误将返回给客户端。

这里是一个更复杂的例子,取自 upstream_hash 模块。如果后端连接失败时,它标记为失败的位向量 (称为tried,数组类型uintptr_t),然后选择一个新的后端,直到它找到一个没有保持。

#define ngx_bitvector_index(index) index / (8 * sizeof(uintptr_t)) #define ngx_bitvector_bit(index) (uintptr_t) 1 << index % (8 * sizeof(uintptr_t)) static void ngx_http_upstream_free_hash_peer(ngx_peer_connection_t *pc, void *data, ngx_uint_t state) { ngx_http_upstream_hash_peer_data_t *uhpd = data; ngx_uint_t current; if (state & NGX_PEER_FAILED && --pc->tries) { /* the backend that failed */ current = uhpd->hash % uhpd->peers->number; /* mark it in the bit-vector */ uhpd->tried[ngx_bitvector_index(current)] |= ngx_bitvector_bit(current); do { /* rehash until we're out of retries or we find one that hasn't been tried */ uhpd->hash = ngx_hash_key((u_char *)&uhpd->hash, sizeof(ngx_uint_t)); current = uhpd->hash % uhpd->peers->number; } while ((uhpd->tried[ngx_bitvector_index(current)] & ngx_bitvector_bit(current)) && --pc->tries); } }

这样做是因为负载平衡功能将只是看看新的uhpd->hash值.

许多应用程序不需要重试或高可用性的逻辑,但它是可能提供的只是几行代码就像你在这里看到。

6.编写和编译一个新的 Nginx 模块

所以到现在为止,你应该准备看看 Nginx 模块,试着了解什么 (和你会知道去哪里寻求帮助)。看看在src/http/modules/来查看可用的模块。选择一个模块,类似于你来完成,并通过它看到底。东西看起来很熟悉吗?它应该。请参阅本指南与模块源要了解什么。

但 Emiller 没有写出的球在指南阅读 Nginx 模块。地狱没有。这是一个球出指南。我们没有在读。我们正在编写。创建。与世界分享。

第一件事,你需要一个地方工作对您的模块。让您在您的硬盘的任何位置的模块文件夹但分开 Nginx 源 (和确保您有最新的副本从nginx.net)新文件夹应该开始于包含两个文件 ︰

'config' 'ngx_http_<your module>_module.c'

“配置”文件将包括由./configure,和它的内容将取决于类型的模块。

“配置”为滤波器模块 ︰

ngx_addon_name=ngx_http_<your module>_module HTTP_AUX_FILTER_MODULES='$HTTP_AUX_FILTER_MODULES ngx_http_<your module>_module' NGX_ADDON_SRCS='$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_<your module>_module.c'

“配置”为其他模块 ︰

ngx_addon_name=ngx_http_<your module>_module HTTP_MODULES='$HTTP_MODULES ngx_http_<your module>_module' NGX_ADDON_SRCS='$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_<your module>_module.c'

现在为你的 C 文件。我推荐复制一个现有的模块,做着类似的对你的希望,但重命名该”ngx_http__module.c”让这成为你的模型,当你改变行为,以满足您的需求,并参考本指南您理解并重塑的不同部分。

当你准备编译时,只是进入的 Nginx 目录

./configure --add-module=path/to/your/new/module/directory

然后make,make install像你通常会。如果一切顺利,将正确编译您的模块中。不错,是吧?不需要要与 Nginx 粪肥源,并将添加到新版本的 Nginx 模块一个单元,只需使用同一./configure命令。顺便说一句,如果您的模块需要的任何动态链接的库,您可以添加这到你的”配置”文件 ︰

CORE_LIBS='$CORE_LIBS -lfoo'

## 7.高级主题 ##
本指南涵盖 Nginx 模块开发的基本知识。在编写更复杂的模块上的提示,请务必查阅.Nginx 模块开发 Emiller 的高级主题   

附录 a ︰ 代码引用

Nginx 源代码树 (交叉引用)  

Nginx 模块目录 (交叉引用)  

示例插件 ︰ circle_gif   

示例插件 ︰ upstream_hash   

示例插件 ︰ upstream_fair    https://github.com/gnosek/nginx-upstream-fair/tree/master

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/server/web/11006.shtml

最新文章
当然还有几点主要注意的 当然还有几点主要注意的

时间:2021-01-19

如果宝塔面板MySQL数据库经 如果宝塔面板MySQL数据库经

时间:2021-01-18

请按此教程安装即可 请按此教程安装即可

时间:2021-01-18

 登陆宝塔面板第一次输错 登陆宝塔面板第一次输错

时间:2021-01-18

选择添加服务器 选择添加服务器

时间:2021-01-18

ApacheHama安装部署 ApacheHama安装部署

时间:2021-01-08

Windows系统下解决PhPStudy Windows系统下解决PhPStudy

时间:2021-01-05

小旋风ASPWEBServer是什么? 小旋风ASPWEBServer是什么?

时间:2021-01-05

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

Nginx的模块开发指南(2)

2021-01-05 编辑:网友投稿

data是我们有用的信息,关于此客户端连接的结构。pc将有我们要连接到的服务器的信息。负载平衡功能的工作是填写pc->sockaddr、 pc->socklen,和pc->name值。如果你知道一些网络编程,那么这些变量的名称可能是熟悉;但他们实际上不到手头的任务非常重要。我们不介意他们的代表;我们只是想要知道在哪里可以找到适当的值来填充。

此函数必须找到可用服务器的列表,选择一个行业,并将它的值分配给pc。让我们看看 upstream_hash 如何它。

upstream_hash 以前藏服务器列表到回中调用ngx_http_upstream_init_hash (以上) 的ngx_http_upstream_hash_peer_data_t结构。此结构现已作为data:

ngx_http_upstream_hash_peer_data_t *uhpd = data;

同行的列表现在存储在uhpd->peers->peer。让我们计算出来的散列值除以服务器数目选取同行从这个数组 ︰

ngx_peer_addr_t *peer = &uhpd->peers->peer[uhpd->hash % uhpd->peers->number];

结尾:

pc->sockaddr = peer->sockaddr; pc->socklen = peer->socklen; pc->name = &peer->name; return NGX_OK;

这就完了,如果负载平衡器返回NGX_OK,这意味着,”下去,试此服务器”。如果它返回NGX_BUSY,它意味着所有后端主机不可用,和 Nginx 应该再试一次。
……,但怎么做我们跟踪的不可用的是什么?我们不想再试一次吗?

5.6.同行释放函数

同行释放函数操作后上游连接发生;其目的是跟踪失败。这里是它的函数原型 ︰

void ngx_http_upstream_free_<module name>_peer(ngx_peer_connection_t *pc, void *data, ngx_uint_t state);

前两个参数都一样正如我们看到在负载平衡器的作用。第三个参数是一个state变量,指示连接是否成功。它可能包含按位或会在一起的两个值 ︰ NGX_PEER_FAILED (连接失败) 和NGX_PEER_NEXT (无论是连接失败,或它成功,但应用程序返回了一个错误)。零表示连接成功了。

它是模块的作者来决定如何处理这些失败事件。如果他们在所有使用,结果应该存储在data,自定义的每个请求的数据结构的指针。

但同行释放功能的关键目的是设置pc->tries为零如果你不想 Nginx 在此请求过程中不断尝试此负载平衡器。最简单的同行释放函数将如下所示 ︰

pc->tries = 0;

这将确保,如果有任何错误到达后端服务器,502 不良代理错误将返回给客户端。

这里是一个更复杂的例子,取自 upstream_hash 模块。如果后端连接失败时,它标记为失败的位向量 (称为tried,数组类型uintptr_t),然后选择一个新的后端,直到它找到一个没有保持。

#define ngx_bitvector_index(index) index / (8 * sizeof(uintptr_t)) #define ngx_bitvector_bit(index) (uintptr_t) 1 << index % (8 * sizeof(uintptr_t)) static void ngx_http_upstream_free_hash_peer(ngx_peer_connection_t *pc, void *data, ngx_uint_t state) { ngx_http_upstream_hash_peer_data_t *uhpd = data; ngx_uint_t current; if (state & NGX_PEER_FAILED && --pc->tries) { /* the backend that failed */ current = uhpd->hash % uhpd->peers->number; /* mark it in the bit-vector */ uhpd->tried[ngx_bitvector_index(current)] |= ngx_bitvector_bit(current); do { /* rehash until we're out of retries or we find one that hasn't been tried */ uhpd->hash = ngx_hash_key((u_char *)&uhpd->hash, sizeof(ngx_uint_t)); current = uhpd->hash % uhpd->peers->number; } while ((uhpd->tried[ngx_bitvector_index(current)] & ngx_bitvector_bit(current)) && --pc->tries); } }

这样做是因为负载平衡功能将只是看看新的uhpd->hash值.

许多应用程序不需要重试或高可用性的逻辑,但它是可能提供的只是几行代码就像你在这里看到。

6.编写和编译一个新的 Nginx 模块

所以到现在为止,你应该准备看看 Nginx 模块,试着了解什么 (和你会知道去哪里寻求帮助)。看看在src/http/modules/来查看可用的模块。选择一个模块,类似于你来完成,并通过它看到底。东西看起来很熟悉吗?它应该。请参阅本指南与模块源要了解什么。

但 Emiller 没有写出的球在指南阅读 Nginx 模块。地狱没有。这是一个球出指南。我们没有在读。我们正在编写。创建。与世界分享。

第一件事,你需要一个地方工作对您的模块。让您在您的硬盘的任何位置的模块文件夹但分开 Nginx 源 (和确保您有最新的副本从nginx.net)新文件夹应该开始于包含两个文件 ︰

'config' 'ngx_http_<your module>_module.c'

“配置”文件将包括由./configure,和它的内容将取决于类型的模块。

“配置”为滤波器模块 ︰

ngx_addon_name=ngx_http_<your module>_module HTTP_AUX_FILTER_MODULES='$HTTP_AUX_FILTER_MODULES ngx_http_<your module>_module' NGX_ADDON_SRCS='$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_<your module>_module.c'

“配置”为其他模块 ︰

ngx_addon_name=ngx_http_<your module>_module HTTP_MODULES='$HTTP_MODULES ngx_http_<your module>_module' NGX_ADDON_SRCS='$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_<your module>_module.c'

现在为你的 C 文件。我推荐复制一个现有的模块,做着类似的对你的希望,但重命名该”ngx_http__module.c”让这成为你的模型,当你改变行为,以满足您的需求,并参考本指南您理解并重塑的不同部分。

当你准备编译时,只是进入的 Nginx 目录

./configure --add-module=path/to/your/new/module/directory

然后make,make install像你通常会。如果一切顺利,将正确编译您的模块中。不错,是吧?不需要要与 Nginx 粪肥源,并将添加到新版本的 Nginx 模块一个单元,只需使用同一./configure命令。顺便说一句,如果您的模块需要的任何动态链接的库,您可以添加这到你的”配置”文件 ︰

CORE_LIBS='$CORE_LIBS -lfoo'

## 7.高级主题 ##
本指南涵盖 Nginx 模块开发的基本知识。在编写更复杂的模块上的提示,请务必查阅.Nginx 模块开发 Emiller 的高级主题   

附录 a ︰ 代码引用

Nginx 源代码树 (交叉引用)  

Nginx 模块目录 (交叉引用)  

示例插件 ︰ circle_gif   

示例插件 ︰ upstream_hash   

示例插件 ︰ upstream_fair    https://github.com/gnosek/nginx-upstream-fair/tree/master

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/server/web/11006.shtml

相关文章

风云图片

推荐阅读

返回WEB服务器频道首页