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 reload
或 kill -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的主要内容,如果未能解决你的问题,请参考以下文章