点赞
评论
收藏
分享
举报
nginx-upstream-dynamic-resolve-servers
发表于2020-11-16 15:36

浏览 2.3k

文章标签

授权协议:
MIT license
原作者联系方式:
zhaofeng_0019@163.com
功能说明:
一个可以在upstream块里动态解析域名的nginx模块

默认情况下,nginx只会在启动的时候解析一次upstream块里配置的域名。这个模块为server指令提供了resolve参数,可以异步解析upstream域名。如果你的upstream服务器的ip经常变动的化这个功能是非常有用的。另外,还提供了另外一个参数use_last,使用这个参数可以让nginx在dns解析超时的时候使用上一次的结果。

如果你的域名不能正确解析,通常情况下nginx不会正常启动,使用了这个模块之后(server指令后面加resolve,如果不加这个域名还是走原生的流程,不会动态解析),我会在配置阶段把它替换成一个无用的ip,所以无需阻塞等待ngx_parse_url函数的返回值,无需担心,我会在进程的启动阶段把域名换回来并且进行动态解析。

注意:

  1. 和其它nginx第三方模块不同,在使用这个模块之前你需要对nginx原生代码进行一些修改。当然你也可以使用 https://github.com/GUI/nginx-upstream-dynamic-servers 里面的方式,也就是覆盖了原生的server指令,那样就不需要对原生的代码进行修改,只需要对我的代码做一点小改动就可以了(对比一下我代码里面的ngx_http_upstream_dynamic_resolve_directive函数和前面工程里的ngx_http_upstream_dynamic_server_directive函数),但我觉得这样不是很好,如果原生代码的server指令发生了更改,比如增加了一些新的特性,你还要同步到自己的第三方模块里面。我改了函数名称和结构体名称只是符合我自己的命名品味。你也可以看我在前面工程里的PR https://github.com/GUI/nginx-upstream-dynamic-servers/pull/33 不过只解决了内存的问题

  2. 这个模块在原生的upstream模块中可以正常使用,如果你使用了其它的第三方模块,你可能需要读一下源码并且考虑一下可行性

安装

修改

ngx_http_upstream.c

extern ngx_int_t ngx_http_upstream_dynamic_resolve_directive(ngx_conf_t *cf,         /* add */
ngx_http_upstream_server_t *us, ngx_uint_t *i);                                      /* add */

static char *
ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
      ...
      for (i = 2; i < cf->args->nelts; i++) {

        ngx_int_t res = ngx_http_upstream_dynamic_resolve_directive(cf, us, &i);  /* add */
        if (res == NGX_ERROR) {                                                   /* add */
            goto invalid;                                                         /* add */
        } else if (res == NGX_AGAIN) {                                            /* add */
            continue;                                                             /* add */
        }                                                                         /* add */
      ...
      }
      ...
}

编译

./configure --add-module=/path/to/nginx-upstream-dynamic-resolve-servers
make && make install

使用

在upstream里面的server指令的后面加上resolve参数,use_last参数为可选

注意:

  1. http块中必须定义resolver

  2. use_last参数必须在resolve参数后面

  3. 如果一个域名的server配置项后面不加resolve参数,那么它会走原生的流程也就是只解析一次并且如果这个域名不能正确解析,nginx不会启动

http {
  resolver 8.8.8.8;

  upstream example {
    server example.com resolve [use_last] ...;
  }
}

兼容性

nginx 1.6, 1.7, 1.8, 1.9.

其它选择

许可协议

nginx-upstream-dynamic-resolve-servers 开源并使用 MIT 许可协议

写在最后

基本上这个模块的使用了 https://github.com/GUI/nginx-upstream-dynamic-servers 并且几乎全部解决了其可能存在的问题(https://github.com/GUI/nginx-upstream-dynamic-servers/issues)

这个模块并不是一个典型的nginx第三方模块,在使用它之前,你需要对nginx的原生代码进行一些修改,改动不大并且是无害的

感谢 Nick Muerdter, Wandenberg Peixoto, Edward Riede

已修改于2023-03-07 20:24
创作不易,留下一份鼓励
皮皮鲁

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(1)

按点赞数排序

按时间排序

有一个三方插件  https://github.com/zhaofeng0019/nginx-upstream-dynamic-resolve-servers  也能帮助解决域名解析问题。


另外,想问一下,最近写了一个主动健康检查模块( https://github.com/alexzzh/ngx_health_detect_module),  已经在项目中经过测试,如果将该模块贡献到社区以及  https://github.com/orgs/nginx-modules 中,分享给更多的开发者以及一起让项目变得更好?  

赞同

0

回复举报

发表于2023-05-11 14:32



回复zzhenghao
回复

如何将该模块贡献到社区以及  https://github.com/orgs/nginx-modules 中,分享给更多的开发者以及一起让项目变得更好?  

0

回复举报

发表于2023-05-11 14:33



回复zzhenghao
回复
关于作者
皮皮鲁
这家伙很懒还未留下介绍~
85
文章
2
问答
41
粉丝
相关文章
概述 Nginx 从 1.9.0 开始加入了 stream 模块支持四层的代理,转发和负载均衡。但是,stream 模块的功能相对简单。对需要 ALG 处理的协议比如 FTP 的支持也远远不够。我试着去修改了 Nginx 的源代码,添加了alg模块。使之支持了 FTP主动模式和被动模式下的 ALG 功能。 Github 的源码地址为 : https://github.com/pei-jikui/nginx-alg。代码本身不困难,困难的是如何把代码模块化,有机地融入nginx原有的框架结构中,尽量少地修改已有的框架代码。而后者,需要对stream模块乃至nginx本身的框架和代码有一定的熟悉程度。图 1:FTP被动模式 数据连接 图2 :FTP主动模式 数据连接可能大家会说,Passive 模式不需要ALG 。准确
点赞 6
浏览 3.6k
使用配置方式:install./configure--add-module={module_dir}&&make&&makeinstallconfserver{ listen80; client_max_body_size100m; location/{ roothtml/upload; } #Uploadformshouldbesubmittedtothislocation location/upload{ #Passalteredrequestbodytothislocation upload_pass/example.php; #Storefilestothisdirectory #Thedirectoryishashed,subdirectories0123456789shouldexist
点赞 3
浏览 2.7k
使用方法:1.创建tableCREATETABLE oauth_access_token (id int(10)NOTNULLAUTO_INCREMENT,access_token varchar(255)DEFAULTNULL,expires_in int(10)NOTNULL,last_used_time int(10)NOTNULL,PRIMARYKEY(id),KEY ACCESS_TOKEN (access_token))ENGINE=InnoDBDEFAULTCHARSET=utf8;2.安装Oauth模块cd/work/nginx-1.8.0&&./configure--add-module=/work/nginx-http-oauth-module&&make3.添加配置请参照源码连接中的nginx.conf 4.使用Oauth模块a)创建访问tokenhttp://192.168.1.104/token?appid=
点赞 3
浏览 1.9k