我正在尝试使用 nginx 将传入连接传递到另一台服务器(我这样做的原因是 - 连接来自无法进行 DNS 解析的主机,最终应接收流量的服务器需要通过 DNS 解析)。我正在使用以下配置:
stream {
resolver 127.0.0.1 valid=1s;
upstream server_us {
server server.foo.com:22222;
}
server {
listen 11111;
proxy_pass server_us;
}
}
我不明白为什么名称解析没有按照“valid”指令指定的那样过期。(即,如果我在 /etc/hosts 中更改 server.foo.com 的 IP,nginx 不会识别该更改)。我做错了什么?
答案1
Nginx 在启动时解析文字域名并永久缓存已解析的 IP。
有resolve
参数server
指令来重新解析域名,但它仅在商业订阅中可用。
常见的“黑客”是在proxy_pass
(但将无法使用upstream
指令)。
也可以使用变量指定地址
[...]
在这种情况下,将在描述的服务器组中搜索服务器名称,如果没有找到,则使用 来确定
resolver
。
例如
stream {
resolver 127.0.0.1 valid=1s;
# a hack to declare $server_us variable
map "" $server_us {
default server.foo.com:22222;
}
server {
listen 11111;
proxy_pass $server_us;
}
}
答案2
对于非商业版本而言这也是可能的,但如果是在或指令下设置的话nginx
,它似乎会被忽略,而必须在根级别进行设置:resolver
stream
server
resolver 127.0.0.1 valid=10s;
server {
location / {
set $backend_servers backends.example.com;
proxy_pass http://$backend_servers:8080;
}
}
不是我的,在这里找到的:NGINX 上游域名解析