nginx 在流中使用解析器

nginx 在流中使用解析器

我正在尝试使用 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,它似乎会被忽略,而必须在根级别进行设置:resolverstreamserver

resolver 127.0.0.1 valid=10s;

server {
    location / {
        set $backend_servers backends.example.com;
        proxy_pass http://$backend_servers:8080;
    }
}

不是我的,在这里找到的:NGINX 上游域名解析

相关内容