2015-10-19 137 views
6

我想代理一个请求到另一台使用proxy_pass的服务器,同时删除匹配的路径前缀。我相信这样做的一种方式如下:NGINX proxy_pass删除路径前缀并解析DNS

location /a/ { 
    proxy_pass https://website.com/ 
} 

例如, http://localhost/a/b.html的请求将代理到https://website.com/b.html

据我所知在NGINX上的非商业版本中的问题是website.com的DNS A记录将在启动时被永久加载和缓存。我已经看到了一种技术,通过在proxy_pass指令中使用诸如$request_uri的变量来解决此问题,从而迫使NGINX根据记录的TTL重新解析DNS。

E.g.

location /a/ { 
    rewrite ^/a/(.*) /$1 break; 
    proxy_pass https://website.com/$request_uri 
} 

不幸的是,似乎上述不起作用,因为它似乎仍然通过/ a /前缀到上游。

基本上我想要在这里实现的是代理一个请求,同时删除路径前缀,以便DNS记录不会永久缓存。

谢谢。

回答

11

我不确定你在哪里看到它,但只是专门使用$request_uri肯定不会神奇地让nginx动态地为你解析域名。

也许建议明确使用变量,如$uri(这是一个不同的变量),假设当变量在使用时,那么域名每次单独解析,没有任何缓存?我不确认或否认这样的假设是否正确,但以下至少会为您摆脱/a

location /a/ { 
    rewrite ^/a/(.*) /$1 break; 
    proxy_pass https://website.com/$uri$is_args$args; 
} 

(请注意,如果它确实实现不缓存域名,那么你可能也想运行一个本地解析器,否则,你的托管服务提供商的DNS的额外延迟和停机将立即影响到你的网站,更何况他们的服务器的可能的DNS查询限制。)


也许一个更好的解决办法是定期重启nginx的自动拿起DNS的变化?例如,nginx -s reloadkill -HUP?正如在http://nginx.org/en/docs/beginners_guide.html#controlhttp://nginx.org/en/docs/control.html#reconfiguration中所解释的那样,nginx在重载期间从不停止处理任何请求,所以它应该是安全操作;而且它很可能也会导致DNS被刷新。

+0

谢谢你的回复,我今天会测试一下,如果它能正常工作,我会标记接受的答案。我发现以前关于解决方案的建议[这里](http://gc-taylor.com/blog/2011/11/10/nginx-aws-elb-name-resolution-resolvers)。我相当确信,在解决DNS问题上,这具有“预期”的效果,因为如果没有这种情况,每隔几天左右上游就不再可用,我需要重新启动。我已经运行了3个多月,现在没有重新启动,并且自从进行更改以来我没有遇到任何DNS问题。 –

+0

呵呵,是的,如果nginx在proxy_pass内存在任何变量的情况下解决了所有主机名的5分钟缓存,那将是有道理的;它实际上甚至以这种方式记录下来,但它并不十分明确!每天学习! :-)因此,我想上面的应该可以工作,你甚至应该在'.com'之后去掉'/',例如''。com $ uri' – cnst

+0

因此,初步测试似乎可以与你原来的建议'重写^/a /(.*)/ $ 1 break; proxy_pass https://website.com/$uri$is_args$args;)'但与刚'.COM $ uri'(查询参数不会传播到上游OK,我会第一建议坚持谢谢对于回复! –