Nginx的模块开发指南(2)
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.同行释放函数
同行释放函数操作后上游连接发生;其目的是跟踪失败。这里是它的函数原型 ︰
前两个参数都一样正如我们看到在负载平衡器的作用。第三个参数是一个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 的高级主题
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
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
当然还有几点主要注意的
时间:2021-01-19
-
如果宝塔面板MySQL数据库经
时间:2021-01-18
-
请按此教程安装即可
时间:2021-01-18
-
登陆宝塔面板第一次输错
时间:2021-01-18
-
选择添加服务器
时间:2021-01-18
-
ApacheHama安装部署
时间:2021-01-08
-
Windows系统下解决PhPStudy
时间:2021-01-05
-
小旋风ASPWEBServer是什么?
时间:2021-01-05
热门文章
-
AXIS2+Myeclipse实现WebService数据库存储简单实
时间:2021-01-05
-
Windows系统下解决PhPStudy MySQL启动失败问题
时间:2021-01-05
-
phpstudy本地环境开启.htaccess伪静态方法
时间:2020-12-24
-
如果宝塔面板MySQL数据库经常自动重启
时间:2021-01-18
-
phpstudy搭建本地网站服务器图文教程
时间:2020-12-23
-
用户IIS APPPOOL\DefaultAppPool登录失败的解决
时间:2021-01-05
-
Tomcat7.0源码分析Session管理分析(上)
时间:2020-12-29
-
WEB服务器该选择 Apache 还是 Nginx?
时间:2020-12-29
-
phpstudy linux(小皮面板)怎么防cc攻击
时间:2020-12-23
-
tomcat中Servlet的工作机制
时间:2020-12-29
