浏览 1.4k
默认情况下,nginx只会在启动的时候解析一次upstream块里配置的域名。这个模块为server
指令提供了resolve
参数,可以异步解析upstream域名。如果你的upstream服务器的ip经常变动的化这个功能是非常有用的。另外,还提供了另外一个参数use_last
,使用这个参数可以让nginx在dns解析超时的时候使用上一次的结果。
如果你的域名不能正确解析,通常情况下nginx不会正常启动,使用了这个模块之后(server
指令后面加resolve
,如果不加这个域名还是走原生的流程,不会动态解析),我会在配置阶段把它替换成一个无用的ip,所以无需阻塞等待ngx_parse_url
函数的返回值,无需担心,我会在进程的启动阶段把域名换回来并且进行动态解析。
注意:
和其它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 不过只解决了内存的问题
这个模块在原生的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
参数为可选
注意:
http
块中必须定义resolver
use_last
参数必须在resolve
参数后面
如果一个域名的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
按点赞数排序
按时间排序