Nginx 动态 proxy_pass 变量到 .local 区域

Vla*_*nov 6 dns nginx proxypass avahi vagrant

因此,我想proxy_pass在我的服务器上由 Avahi 控制的 .local 区域中对 vagrant 机器进行动态化。我有一个 nginx 虚拟主机配置:

server {
        listen 80;
        server_name     ~^(?<subdomain>.+)\.example\.com$;

        location / {

                resolver 127.0.0.1 valid=30s;

                proxy_set_header            Host $http_host;
                proxy_set_header            X-Real-IP $remote_addr;
                proxy_set_header            X-Forwarded-Proto $scheme;
                proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header            Host $host;

                proxy_pass                  http://$subdomain-example.local;
                proxy_connect_timeout       600;
                proxy_send_timeout          600;
                proxy_read_timeout          600;

                send_timeout                600;

        }
    }
Run Code Online (Sandbox Code Playgroud)

Nginx 在 /var/log/nginx/error.log 中返回了一个错误:

2016/09/26 18:03:34 [error] 24401#24401: 
*1 no resolver defined to resolve test-example.local, 
client: 192.168.1.101, 
server: ~^(?<subdomain>.+)\.example\.com$, 
request: "GET / HTTP/1.1", 
host: "test.example.com"
Run Code Online (Sandbox Code Playgroud)

但是,例如,如果我手动设置$subdomain为“测试”,它就可以工作并按照我真正想要的方式传递到 test-example.local 机器。

如何让它真正动态化?我应该在我的虚拟主机配置中更改什么?

小智 1

当 NGINX 启动或重新加载其配置时,它会查询 DNS 服务器来解析域名。NGINX 从操作系统配置文件 /etc/resolv.conf 中选择 DNS 服务器。当您在 proxy_pass 指令中使用变量指定域名时,NGINX 不会引用 /etc/resolv.conf。

您可以在 proxy_pass 指令中使用 IP 地址代替域名。

请阅读https://www.nginx.com/blog/dns-service-discovery-nginx-plus了解更多详细信息。