![当上游服务器无法解析且仍然有 proxy_pass URI/URI 重写规则时启动 nginx?](https://linux22.com/image/689600/%E5%BD%93%E4%B8%8A%E6%B8%B8%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%97%A0%E6%B3%95%E8%A7%A3%E6%9E%90%E4%B8%94%E4%BB%8D%E7%84%B6%E6%9C%89%20proxy_pass%20URI%2FURI%20%E9%87%8D%E5%86%99%E8%A7%84%E5%88%99%E6%97%B6%E5%90%AF%E5%8A%A8%20nginx%EF%BC%9F.png)
这个 nginx 配置对我有用:
location /foo/ {
proxy_pass http://a.bar.mesos/;
}
请注意,location
选择器和proxy_pass
值都是 URI。因此,您知道,这会影响上游服务器的 URL 重写方式。例如,http://.../foo/bar
被重写为http://a.bar.mesos/bar
。如果proxy_pass
值http://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_pass
http://a.bar.mesos
http://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;
}
看这个文件了解详情。