当上游服务器无法解析且仍然有 proxy_pass URI/URI 重写规则时启动 nginx?

当上游服务器无法解析且仍然有 proxy_pass URI/URI 重写规则时启动 nginx?

这个 nginx 配置对我有用:

location /foo/ {
  proxy_pass http://a.bar.mesos/;
}

请注意,location选择器和proxy_pass值都是 URI。因此,您知道,这会影响上游服务器的 URL 重写方式。例如,http://.../foo/bar被重写为http://a.bar.mesos/bar。如果proxy_passhttp://a.bar.mesos没有尾随斜杠,则 URL 将被重写为,http://a.bar.mesos/foo/bar这对我来说是不正确的。

您可能还知道,如果a.bar.mesos在 nginx 启动时无法解析,则 nginx 将不会启动。此站点上的其他问题中提到了一种解决方法,即使用resolver指令和变量,如下所示:

location /foo/ {
  resolver 127.0.0.1;
  set $a_bar_mesos a.bar.mesos;
  proxy_pass http://$a_bar_mesos/;
}

确实,这解决了 nginx 不以无法解析的主机名开头的问题,但它也使 nginx 不再识别该值具有 URI,因此 URL 重写对我来说变得不正确。也就是说,它使用与而不是的值proxy_pass相关联的重写规则。proxy_passhttp://a.bar.mesoshttp://a.bar.mesos/

我的问题是,有谁知道如何使用无法解析的主机名启动 nginx 并获取 URI/URI URL 重写规则?

所以你知道我的用例,我使用 Mesos 将程序启动到机器集群上。这些程序有众所周知的名称,如a.bar。然后我使用mesos-dns将程序名称a.bar与 Mesos 分配给它的机器的主机名a.bar.mesos和 IP 地址相关联。当程序未运行时,从其注册表中mesos-dns删除名称a.bar.mesos。我使用 nginx 通过上述配置将 HTTP 请求转发到程序。当我重新启动托管 nginx 的服务器时,无法保证所有被代理的程序都将启动并运行。

答案1

您可以在同一位置内使用来实现 URI/URI 重写规则rewrite ... break,而不是使用proxy_pass来为您完成此操作:

location /foo/ {
    resolver 127.0.0.1;
    set $a_bar_mesos a.bar.mesos;

    rewrite ^/foo(.*)$ $1 break;
    proxy_pass http://$a_bar_mesos;
}

这个文件了解详情。

相关内容