Nginx 本身不支持动态域名解析(即运行时自动更新上游服务器的 IP 地址),但可以通过以下方法实现类似功能。以下是详细过程和解决方案:
Nginx 仅在启动或重载时解析域名(如 proxy_pass http://example.com;
),之后会缓存 IP 地址。若域名对应的 IP 变化,Nginx 不会自动更新,导致请求失败。
resolver
指令通过强制 Nginx 定期重新解析域名实现动态更新:
http {
resolver 8.8.8.8 valid=10s; # 使用 Google DNS,每 10 秒刷新
server {
location / {
set $backend "example.com";
proxy_pass http://$backend;
}
}
}
valid=10s
:DNS 记录有效期,超时后重新解析。resolver
:指定 DNS 服务器(必须显式配置)。$backend
)间接使用域名,直接写 proxy_pass http://example.com
不会触发动态解析。利用 OpenResty 的 Lua 扩展实现动态解析:
http {
resolver 8.8.8.8;
server {
location / {
access_by_lua_block {
local backend = "example.com"
local resolver = require "resty.dns.resolver"
local r, err = resolver:new{
nameservers = {"8.8.8.8"},
retrans = 5,
timeout = 2000,
}
local answers, err = r:query(backend)
if not answers then
ngx.log(ngx.ERR, "DNS query failed: ", err)
return
end
ngx.var.backend = answers[1].address
}
proxy_pass http://$backend;
}
}
}
通过外部脚本监控域名变化,触发 Nginx 重载: 1. 脚本示例(Python): ```python import dns.resolver import os
current_ip = None
while True:
new_ip = dns.resolver.resolve("example.com", "A")[0].address
if new_ip != current_ip:
os.system("nginx -s reload")
current_ip = new_ip
time.sleep(60)
2. **配置 Nginx**:
nginx
server {
location / {
proxy_pass http://example.com; # 普通配置即可
}
}
```
- 缺点:频繁重载可能影响性能。
ngx_http_dyups_module
)resolver
+ 变量(方案 1),简单有效。bash
tail -f /var/log/nginx/error.log | grep resolver
通过以上方法,Nginx 可实现类似动态域名解析的效果,适应后端 IP 变化场景(如容器调度、动态扩缩容等)。