This article is a continuation of retrying dynamically configured upstreams that gives an example of how you can configure OpenResty to update your upstream backend servers dynamically with DNS.
Breaking down init_worker_by_lua_block
init_worker_by_lua_block can be used to make an nginx worker do some fun stuff. In this instance we’re going to use it in conjunction with ngx.timer.every and the resty.dns.resolver.
Here is the full example of my init_worker_by_lua_block.
init_worker_by_lua_block { _backend_servers = {} local function update_dns() -- Set up the resolver local resolver = require "resty.dns.resolver" local r, err = resolver:new{ nameservers = {"1.1.1.1", {"1.0.0.1", 53} }, -- Cloudflare retrans = 5, -- 5 retransmissions on receive timeout timeout = 1000, -- 1 sec } if not r then ngx.log(ngx.ERR, "failed to instantiate resolver: ", err) return end -- Pull DNS records -- Use a hardcoded domain to make this example easier local answers, err, tries = r:query("kura.gg …