我应该在nginx中使用rewrite还是proxy_pass?

Apache的文档很清楚地表明, mod_rewrite应该只是最后一招。 对于nginx ,陷阱部分有request_uri基本不变的例子。


情况是这样的:

  • 我们(研究所的一个部门)有一个即将升级的主networking服务器(正在运行Debian 6)。 为了处理升级,我已经build立了一个nginx服务器,它将代理已知可以正常工作的部分升级服务器,而其他部分则服务于旧服务器。
  • 旧的服务器有一些ProxyPass规则(大量的代理工作)。 我希望将所有这些都转换为nginx ,因为据我所知, nginx在代理中更具性能。
  • 大量用户的用户主目录由另一台服务器提供服务。 对于这些用户,可以使用代字号和非代字号(即http://my.site/muruhttp://my.site/~muru代理到http://other.server/~muru ,但http://other.server/muru不存在)。
  • 许多文件夹被代理到同一台服务器上的不同文件夹。 (例如, http://my.site/local-club : http://my.site/local-club将被代理到http://my.site/~local-club )。

我的主要问题是:

  • 鉴于A和B都被代理到不同的服务器上的C,我应该使用rewritelocationreturnredirectBA请求,或继续代理?
  • 给定A和B在同一台服务器上,B代理到A,我应该使用重写还是将Bredirect到A?

redirect(和return )具有清楚地指示两个目录之间的关系的好处。


我的rewrite规则如下所示:

 rewrite ^/B(/.*) /A$1 permanent; 

return规则:

 location ~ ^/B(/.*) { return 301 /A$1; } 

附:

 location ~ ^/~(A|D|E|F..)/ { proxy_pass https://other.server; proxy_redirect default; } 

如果你的nginx服务器每秒处理数以千计的请求,并且你想避免每个请求花费CPU时间来重写正则expression式匹配,那么这并不重要。 现在,我想用最明确的方式来编写configuration文件,直到达到此限制,那么如果您没有足够的预算来扩展您的基础架构,那么就应该考虑欺骗您的configuration以适应您的stream量。 返回的缺点是,如果你有多个redirect,你最终将得到一个包装一个返回指令的位置。 使用重写,可以将其中的多个包装在一个通用位置,并在第一个参数中testing更具体的模式。

更新:通用位置中的多redirect示例:

 location /B { rewrite ^/B/foo/(.*)$ /A/newfoo/$1 permanent; rewrite ^/B/bar/(.*)$ /A/newbar/$2 permanent; rewrite ^/B/(.*)$ /A/$1 permanent; }