当上游服务器不能被parsing并且仍然有proxy_pass URI / URI重写规则时启动nginx?

这个nginxconfiguration适用于我:

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

请注意, locationselect器和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开始时间不能parsing,那么nginx将不会启动。 在这个网站的其他问题中提到了一个resolver ,它是使用一个resolver指令和一个像这样的variables:

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

事实上,这解决了nginx不是以一个无法parsing的主机名开头的问题,但也使得nginx不再认识到proxy_pass值有一个URI,所以URL重写对我来说是不正确的。 也就是说,它使用与http://a.bar.mesosproxy_pass值相关的重写规则而不是http://a.bar.mesos/

我的问题是,有谁知道如何启动nginx与无法parsing的主机名,并获得URI / URI的URL重写规则?

所以你知道我的用例,我使用Mesos来启动程序到一个机器集群上。 这些程序有着众所周知的名字,比如a.bar 。 然后,我使用mesos-dns将程序名称a.bar与主机名a.bar.mesos和Mesos分配给它的机器的IP地址相关联。 当程序没有运行时, mesos-dns从registry中删除名称a.bar.mesos 。 我使用nginx通过上述configuration将HTTP请求转发给程序。 当我重新启动托pipenginx的服务器时,并不能保证所有被代理的程序都能正常运行。

您可以通过在同一位置使用rewrite ... break来实现URI / URI重写规则,而不是使用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; } 

详情请参阅此文件 。