NGINX proxy_pass 删除路径前缀并解析 DNS

Posted

技术标签:

【中文标题】NGINX proxy_pass 删除路径前缀并解析 DNS【英文标题】:NGINX proxy_pass remove path prefix & resolve DNS 【发布时间】:2016-01-18 00:48:00 【问题描述】:

我想使用 proxy_pass 将请求代理到另一台服务器,同时删除匹配的路径前缀。我认为这样做的一种方法如下;

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。

例如

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

不幸的是,上面的方法似乎不起作用,因为它似乎仍然将 /a/ 前缀传递给上游。

基本上,我在这里想要实现的只是代理请求,同时删除路径前缀,这样 DNS 记录就不会永远被缓存。

谢谢。

【问题讨论】:

【参考方案1】:

我不确定你在哪里看到的,但是仅仅使用 $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#control 和http://nginx.org/en/docs/control.html#reconfiguration 中解释的那样,nginx 在重新加载期间永远不会停止处理任何请求,因此它应该是一个安全的操作;而且它很可能也会导致 DNS 被刷新。

【讨论】:

感谢您的回复,我今天将对此进行测试,如果它工作正常,我会将此答案标记为已接受。我找到了关于here 决议的先前建议。我非常有信心,就解析 DNS 而言,这具有“预期”效果,因为以前如果没有这个,上游将每隔几天左右就不再可用,我需要重新启动。我已经像这样运行了 3 个多月了,没有重新启动,并且自从进行了更改后,我没有遇到任何 DNS 问题。 哦,是的,如果 nginx 将它在 proxy_pass 中存在任何变量的情况下解析的所有主机名保留 5 分钟的缓存,那将是有道理的;它实际上甚至以这种方式记录,但它不是很明确!每天学习! :-) 所以,我想上面应该可以工作,你甚至应该在.com 之后删除/,例如,应该是.com$uri 所以初步测试似乎适用于您的原始建议rewrite ^/a/(.*) /$1 break; proxy_pass https://website.com/$uri$is_args$args;),但仅适用于.com$uri(查询参数不会传播到上游。我会坚持第一个建议。感谢您的回复! @DavidGoate,我说过要在 $uri 之前省略 /,而不是它周围的全部内容!如果您省略$is_args$args,那么查询当然不会被传播,因为它在$uri 中不存在,只存在于$request_uri 中,正如已经提到的,这是一个完全不同的变量! 感谢您的回答!它完成了工作

以上是关于NGINX proxy_pass 删除路径前缀并解析 DNS的主要内容,如果未能解决你的问题,请参考以下文章

Nginx配置proxy_pass转发的/路径问题

nginx配置之proxy_pass路径加斜杠/以及包含路径的区别

Nginx配置proxy_pass转发的/路径问题

nginx 之 proxy_pass详解

nginx proxy_pass

nginx反向代理proxy_pass绝对路径和相对路径