Nginx能否无需重载即可自动更新upstream服务器的IP信息?
问题解答:Nginx upstream域名IP变更无需重载的实现方案
背景说明
Nginx默认仅在启动或执行nginx -s reload重载时,一次性解析upstream配置中域名对应的IP并缓存到内存,后续不会主动触发重新解析,因此服务节点IP变更后默认必须重载才能更新。
可行方案(无需重载Nginx)
方案1:开源版Nginx通用方案(resolver + 变量)
不需要额外编译模块,直接调整配置即可,是最常用的方案。
配置示例:
http { # 替换为你内网实际使用的DNS服务器地址,valid指定解析结果缓存时长 resolver 192.168.1.2 valid=10s; resolver_timeout 3s; server { listen 80; # 匹配entities相关请求的路由,按你原有实际规则调整 location /entities/ { # 将后端地址定义为变量触发动态解析 set $entities_backend http://entities.qa.local:8888; proxy_pass $entities_backend; proxy_set_header Host $host; # 其余原有proxy配置保持不变即可 } # 匹配workflow相关请求的路由 location /workflow/ { set $workflow_backend http://workflow.qa.local:9999; proxy_pass $workflow_backend; proxy_set_header Host $host; } } }
原理说明:
当proxy_pass后跟随变量时,Nginx会按照resolver中配置的规则自动定期重新解析域名,无需手动重载即可自动获取更新后的IP。
方案2:Nginx Plus商业版专属方案(upstream resolve参数)
如果使用Nginx商业版,可以直接在upstream的server配置后加resolve参数,无需调整原有代理规则。
配置示例:
http { resolver 192.168.1.2 valid=10s; resolver_timeout 3s; upstream entities { # 新增resolve参数触发动态解析 server entities.qa.local:8888 resolve; } upstream workflow { server workflow.qa.local:9999 resolve; } server { listen 80; location /entities/ { # 原有proxy_pass配置完全不用调整 proxy_pass http://entities; proxy_set_header Host $host; } } }
注意事项
- 配置的
resolver地址必须是可正常解析你内网私有域名的DNS服务器,否则会出现解析失败报错。 - 使用变量方案时如果原
proxy_pass配置了后缀路径,需要注意变量模式下的路径拼接规则和固定地址模式略有差异,按需调整路径规则即可。 - 如果希望保留原有upstream配置结构同时使用开源版Nginx,也可以选择编译第三方
ngx_upstream_dynamic模块实现,不过需要重新编译Nginx,复杂度高于第一种方案,非必要不推荐。
内容的提问来源于stack exchange,提问作者Naveen Digumurthy
相关产品推荐
相关产品推荐

